Return-Path: X-Original-To: apmail-ambari-commits-archive@www.apache.org Delivered-To: apmail-ambari-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 44A9B18D08 for ; Mon, 26 Oct 2015 18:18:26 +0000 (UTC) Received: (qmail 28118 invoked by uid 500); 26 Oct 2015 18:18:26 -0000 Delivered-To: apmail-ambari-commits-archive@ambari.apache.org Received: (qmail 28012 invoked by uid 500); 26 Oct 2015 18:18:26 -0000 Mailing-List: contact commits-help@ambari.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: ambari-dev@ambari.apache.org Delivered-To: mailing list commits@ambari.apache.org Received: (qmail 28001 invoked by uid 99); 26 Oct 2015 18:18:25 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 26 Oct 2015 18:18:25 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 5F04DE05E1; Mon, 26 Oct 2015 18:18:25 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: dmitriusan@apache.org To: commits@ambari.apache.org Date: Mon, 26 Oct 2015 18:18:26 -0000 Message-Id: In-Reply-To: <3ceaf6bf40c2474abf65a0d7d794bd0e@git.apache.org> References: <3ceaf6bf40c2474abf65a0d7d794bd0e@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [2/2] ambari git commit: AMBARI-13568. RU - Downgrade from 2.3 to 2.2 may fail if configs were not back'ed up (dlysnichenko) AMBARI-13568. RU - Downgrade from 2.3 to 2.2 may fail if configs were not back'ed up (dlysnichenko) Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/ce417eb1 Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/ce417eb1 Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/ce417eb1 Branch: refs/heads/branch-2.1 Commit: ce417eb1d16ce968132d3bf6515b52e603e32434 Parents: 4a4d8d0 Author: Lisnichenko Dmitro Authored: Mon Oct 26 20:16:48 2015 +0200 Committer: Lisnichenko Dmitro Committed: Mon Oct 26 20:18:08 2015 +0200 ---------------------------------------------------------------------- .../custom_actions/scripts/ru_set_all.py | 22 +++++----- .../python/custom_actions/test_ru_set_all.py | 43 +++++++++++++++++++- 2 files changed, 52 insertions(+), 13 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/ce417eb1/ambari-server/src/main/resources/custom_actions/scripts/ru_set_all.py ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/resources/custom_actions/scripts/ru_set_all.py b/ambari-server/src/main/resources/custom_actions/scripts/ru_set_all.py index 6e5ddd2..3ff0bc6 100644 --- a/ambari-server/src/main/resources/custom_actions/scripts/ru_set_all.py +++ b/ambari-server/src/main/resources/custom_actions/scripts/ru_set_all.py @@ -127,21 +127,19 @@ class UpgradeSetAll(Script): :original_conf_directory: the original conf directory that was made into a symlink (/etc/component/conf) """ - if not os.path.islink(original_conf_directory): - Logger.info("Skipping the unlink of {0}; it is not a symlink or does not exist".format(original_conf_directory)) - return - # calculate the parent and backup directories original_conf_parent_directory = os.path.abspath(os.path.join(original_conf_directory, os.pardir)) backup_conf_directory = os.path.join(original_conf_parent_directory, "conf.backup") - - Logger.info("Unlinking {0} and restoring {1}".format(original_conf_directory, backup_conf_directory)) - - # remove the old symlink - Execute(("rm", original_conf_directory), sudo=True) - - # rename the backup to the original name - Execute(("mv", backup_conf_directory, original_conf_directory), sudo=True) + if not os.path.isdir(backup_conf_directory): + Logger.info("Skipping restoring config from backup {0} since it does not exist".format(backup_conf_directory)) + elif not os.path.islink(original_conf_directory): + Logger.info("Skipping the unlink of {0}; it is not a symlink or does not exist".format(original_conf_directory)) + else: + Logger.info("Unlinking {0} and restoring {1}".format(original_conf_directory, backup_conf_directory)) + # remove the old symlink + Execute(("rm", original_conf_directory), sudo=True) + # rename the backup to the original name + Execute(("mv", backup_conf_directory, original_conf_directory), sudo=True) def link_config(old_conf, link_conf): http://git-wip-us.apache.org/repos/asf/ambari/blob/ce417eb1/ambari-server/src/test/python/custom_actions/test_ru_set_all.py ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/python/custom_actions/test_ru_set_all.py b/ambari-server/src/test/python/custom_actions/test_ru_set_all.py index b102b4e..186b847 100644 --- a/ambari-server/src/test/python/custom_actions/test_ru_set_all.py +++ b/ambari-server/src/test/python/custom_actions/test_ru_set_all.py @@ -26,6 +26,7 @@ from mock.mock import patch from mock.mock import MagicMock # Module imports +import subprocess from stacks.utils.RMFTestCase import * from resource_management import Script, ConfigDictionary from resource_management.libraries.functions.default import default @@ -34,6 +35,8 @@ from resource_management.core.logger import Logger from ambari_agent.AmbariConfig import AmbariConfig from ambari_agent.FileCache import FileCache from ambari_commons.os_check import OSCheck +from resource_management.core import shell +import pprint def fake_call(command, **kwargs): @@ -133,15 +136,19 @@ class TestRUSetAll(RMFTestCase): @patch("os.path.islink") + @patch("os.path.isdir") @patch("resource_management.core.shell.call") @patch.object(Script, 'get_config') @patch.object(OSCheck, 'is_redhat_family') - def test_downgrade_unlink_configs(self, family_mock, get_config_mock, call_mock, islink_mock): + def test_downgrade_unlink_configs(self, family_mock, get_config_mock, call_mock, + isdir_mock, islink_mock): """ Tests downgrading from 2.3 to 2.2 to ensure that conf symlinks are removed and the backup directories restored. """ + isdir_mock.return_value = True + # required for the test to run since the Execute calls need this from resource_management.core.environment import Environment env = Environment(test_mode=True) @@ -237,3 +244,37 @@ class TestRUSetAll(RMFTestCase): # ensure it wasn't called this time self.assertFalse(islink_mock.called) + + + @patch("os.path.isdir") + @patch("os.path.islink") + def test_unlink_configs_missing_backup(self, islink_mock, isdir_mock): + + # required for the test to run since the Execute calls need this + from resource_management.core.environment import Environment + env = Environment(test_mode=True) + env._instances.append(env) + + # Case: missing backup directory + isdir_mock.return_value = False + ru_execute = UpgradeSetAll() + self.assertEqual(len(env.resource_list), 0) + # Case: missing symlink + isdir_mock.reset_mock() + isdir_mock.return_value = True + islink_mock.return_value = False + ru_execute._unlink_config("/fake/config") + self.assertEqual(len(env.resource_list), 0) + # Case: missing symlink + isdir_mock.reset_mock() + isdir_mock.return_value = True + islink_mock.reset_mock() + islink_mock.return_value = True + + ru_execute._unlink_config("/fake/config") + self.assertEqual(pprint.pformat(env.resource_list), + "[Execute[('rm', '/fake/config')],\n" + " Execute[('mv', '/fake/conf.backup', " + "'/fake/config')]]") + +