Repository: ambari Updated Branches: refs/heads/trunk 4d71477d1 -> 908e7354c
AMBARI-9180. Move existing (user) custom actions to a new location (dlysnichenko) Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/908e7354 Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/908e7354 Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/908e7354 Branch: refs/heads/trunk Commit: 908e7354cb25c5513dc6104486699c985f27bec7 Parents: 4d71477 Author: Lisnichenko Dmitro <dlysniche...@hortonworks.com> Authored: Mon Jan 19 19:15:27 2015 +0200 Committer: Lisnichenko Dmitro <dlysniche...@hortonworks.com> Committed: Mon Jan 19 19:54:50 2015 +0200 ---------------------------------------------------------------------- ambari-server/src/main/python/ambari-server.py | 41 +++++++++++++++ .../src/test/python/TestAmbariServer.py | 52 ++++++++++++++++++-- 2 files changed, 89 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/908e7354/ambari-server/src/main/python/ambari-server.py ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/python/ambari-server.py b/ambari-server/src/main/python/ambari-server.py index ba3d5e7..7c08083 100755 --- a/ambari-server/src/main/python/ambari-server.py +++ b/ambari-server/src/main/python/ambari-server.py @@ -2713,11 +2713,52 @@ def upgrade(args): os.remove(jdbc_symlink) os.symlink(os.path.join(resources_dir,JDBC_DB_DEFAULT_DRIVER[db_name]), jdbc_symlink) + # Move *.py files from custom_actions to custom_actions/scripts + # This code exists for historic reasons in which custom action python scripts location changed from Ambari 1.7.0 to 2.0.0 + ambari_version = get_ambari_version(properties) + if ambari_version is None: + args.warnings.append("*.py files were not moved from custom_actions to custom_actions/scripts.") + elif compare_versions(ambari_version, "2.0.0") == 0: + move_user_custom_actions() + + # check if ambari has obsolete LDAP configuration if properties.get_property(LDAP_PRIMARY_URL_PROPERTY) and not properties.get_property(IS_LDAP_CONFIGURED): args.warnings.append("Existing LDAP configuration is detected. You must run the \"ambari-server setup-ldap\" command to adjust existing LDAP configuration.") +def move_user_custom_actions(): + print_info_msg('Moving *.py files from custom_actions to custom_actions/scripts') + properties = get_ambari_properties() + if properties == -1: + err = "Error getting ambari properties" + print_error_msg(err) + raise FatalException(-1, err) + + try: + resources_dir = properties[RESOURCES_DIR_PROPERTY] + except (KeyError), e: + conf_file = properties.fileName + err = 'Property ' + str(e) + ' is not defined at ' + conf_file + print_error_msg(err) + raise FatalException(1, err) + + custom_actions_dir_path = os.path.join(resources_dir, 'custom_actions') + custom_actions_scripts_dir_path = os.path.join(custom_actions_dir_path, 'scripts') + print_info_msg('Moving *.py files from %s to %s' % (custom_actions_dir_path, custom_actions_scripts_dir_path)) + + try: + for custom_action_file_name in os.listdir(custom_actions_dir_path): + custom_action_file_path = os.path.join(custom_actions_dir_path, custom_action_file_name) + if os.path.isfile(custom_action_file_path) and custom_action_file_path.endswith('.py'): + print_info_msg('Moving %s to %s' % (custom_action_file_path, custom_actions_scripts_dir_path)) + shutil.move(custom_action_file_path, custom_actions_scripts_dir_path) + except (OSError, shutil.Error) as e: + err = 'Upgrade failed. Can not move *.py files from %s to %s. ' % (custom_actions_dir_path, custom_actions_scripts_dir_path) + str(e) + print_error_msg(err) + raise FatalException(1, err) + + # # The Ambari Server status. # http://git-wip-us.apache.org/repos/asf/ambari/blob/908e7354/ambari-server/src/test/python/TestAmbariServer.py ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/python/TestAmbariServer.py b/ambari-server/src/test/python/TestAmbariServer.py index a8f4197..cb870b8 100644 --- a/ambari-server/src/test/python/TestAmbariServer.py +++ b/ambari-server/src/test/python/TestAmbariServer.py @@ -22,7 +22,7 @@ import os import datetime import errno import json -from mock.mock import patch, MagicMock, create_autospec +from mock.mock import patch, MagicMock, create_autospec, call import operator from optparse import OptionParser import platform @@ -3060,6 +3060,24 @@ MIIFHjCCAwYCCQDpHKOBI+Lt0zANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJV self.assertTrue(run_stack_upgrade_mock.called) run_stack_upgrade_mock.assert_called_with("HDP", "2.0", None, None) + @patch.object(_ambari_server_, "get_ambari_properties") + @patch("os.listdir") + @patch("os.path.isfile") + @patch("shutil.move") + def test_move_user_custom_actions(self, shutil_move_mock, os_path_isfile_mock, os_listdir_mock, get_ambari_properties_mock): + properties = _ambari_server_.Properties() + properties.process_pair(_ambari_server_.RESOURCES_DIR_PROPERTY, 'some/test/fake/resources/dir/path') + get_ambari_properties_mock.return_value = properties + os_listdir_mock.return_value = ['sometestdir', 'sometestfile.md', 'sometestfile.py', 'sometestfile2.java', 'sometestfile2.py', 'sometestdir2.py'] + os_path_isfile_mock.side_effect = [False, True, True, True, True, False] + + _ambari_server_.move_user_custom_actions() + + custom_actions_scripts_dir = os.path.join('some/test/fake/resources/dir/path', 'custom_actions', 'scripts') + shutil_move_mock.assert_has_calls([call(os.path.join('some/test/fake/resources/dir/path', 'custom_actions', 'sometestfile.py'), custom_actions_scripts_dir), + call(os.path.join('some/test/fake/resources/dir/path', 'custom_actions', 'sometestfile2.py'), custom_actions_scripts_dir)]) + self.assertEqual(shutil_move_mock.call_count, 2) + @patch.object(_ambari_server_, "get_conf_dir") @patch.object(_ambari_server_, "get_ambari_classpath") @patch.object(_ambari_server_, "run_os_command") @@ -3278,12 +3296,14 @@ MIIFHjCCAwYCCQDpHKOBI+Lt0zANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJV @patch.object(_ambari_server_, "is_root") @patch.object(_ambari_server_, "get_ambari_version") @patch.object(_ambari_server_, "get_ambari_properties") - def test_upgrade_from_161(self, get_ambari_properties_mock, get_ambari_version_mock, is_root_mock, find_properties_file_mock, - write_property_mock): + @patch.object(_ambari_server_, "move_user_custom_actions") + def test_upgrade_from_161(self, move_user_custom_actions, get_ambari_properties_mock, get_ambari_version_mock, + is_root_mock, find_properties_file_mock, write_property_mock): args = MagicMock() args.dbms = "postgres" is_root_mock.return_value = True get_ambari_version_mock.return_value = "1.7.0" + move_user_custom_actions.return_value = None # Local Postgres # In Ambari 1.6.1 for an embedded postgres database, the "server.jdbc.database" property stored the DB name, @@ -3299,6 +3319,7 @@ MIIFHjCCAwYCCQDpHKOBI+Lt0zANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJV self.fail("Did not expect failure: " + str(fe)) else: self.assertTrue(write_property_mock.called) + self.assertFalse(move_user_custom_actions.called) # External Postgres # In Ambari 1.6.1 for an external postgres database, the "server.jdbc.database" property stored the @@ -3317,6 +3338,7 @@ MIIFHjCCAwYCCQDpHKOBI+Lt0zANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJV self.fail("Did not expect failure: " + str(fe)) else: self.assertTrue(write_property_mock.called) + self.assertFalse(move_user_custom_actions.called) # External Postgres missing DB type, so it should be set based on the JDBC URL. write_property_mock.reset_mock() @@ -3332,6 +3354,7 @@ MIIFHjCCAwYCCQDpHKOBI+Lt0zANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJV self.fail("Did not expect failure: " + str(fe)) else: self.assertTrue(write_property_mock.call_count == 2) + self.assertFalse(move_user_custom_actions.called) # External MySQL # In Ambari 1.6.1 for an external MySQL database, the "server.jdbc.database" property stored the DB type ("mysql"), @@ -3349,6 +3372,7 @@ MIIFHjCCAwYCCQDpHKOBI+Lt0zANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJV self.fail("Did not expect failure: " + str(fe)) else: self.assertTrue(write_property_mock.called) + self.assertFalse(move_user_custom_actions.called) # External MySQL missing DB type, so it should be set based on the JDBC URL. write_property_mock.reset_mock() @@ -3364,6 +3388,7 @@ MIIFHjCCAwYCCQDpHKOBI+Lt0zANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJV self.fail("Did not expect failure: " + str(fe)) else: self.assertTrue(write_property_mock.call_count == 2) + self.assertFalse(move_user_custom_actions.called) @patch("__builtin__.open") @@ -3383,7 +3408,8 @@ MIIFHjCCAwYCCQDpHKOBI+Lt0zANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJV @patch.object(_ambari_server_, "is_root") @patch.object(_ambari_server_, "get_ambari_properties") @patch.object(_ambari_server_, "upgrade_local_repo") - def test_upgrade(self, upgrade_local_repo_mock, + @patch.object(_ambari_server_, "move_user_custom_actions") + def test_upgrade(self, move_user_custom_actions, upgrade_local_repo_mock, get_ambari_properties_mock, is_root_mock, get_ambari_version_mock, parse_properties_file_mock, update_ambari_properties_mock, run_schema_upgrade_mock, @@ -3398,6 +3424,7 @@ MIIFHjCCAwYCCQDpHKOBI+Lt0zANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJV run_schema_upgrade_mock.return_value = 0 isfile_mock.return_value = False get_ambari_version_mock.return_value = CURR_AMBARI_VERSION + move_user_custom_actions.return_value = None # Testing call under non-root is_root_mock.return_value = False @@ -3420,6 +3447,7 @@ MIIFHjCCAwYCCQDpHKOBI+Lt0zANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJV warning_args = print_warning_msg_mock.call_args[0][0] self.assertTrue("custom ambari user" in warning_args) self.assertTrue(upgrade_local_repo_mock.called) + self.assertTrue(move_user_custom_actions.called) # Testing with defined custom user read_ambari_user_mock.return_value = "ambari-custom-user" @@ -3430,12 +3458,28 @@ MIIFHjCCAwYCCQDpHKOBI+Lt0zANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJV get_ambari_properties_mock.return_value = properties run_schema_upgrade_mock.return_value = 0 parse_properties_file_mock.called = False + move_user_custom_actions.called = False retcode = _ambari_server_.upgrade(args) self.assertTrue(get_ambari_properties_mock.called) self.assertNotEqual(-1, retcode) self.assertTrue(parse_properties_file_mock.called) self.assertTrue(run_schema_upgrade_mock.called) + self.assertTrue(move_user_custom_actions.called) + + # Assert that move_user_custom_actions is called on upgrade to Ambari == 2.0.0 + get_ambari_version_mock.return_value = '2.0.0' + move_user_custom_actions.called = False + _ambari_server_.upgrade(args) + self.assertTrue(move_user_custom_actions.called) + + # Assert that move_user_custom_actions is not called on upgrade to Ambari < 2.0.0 + get_ambari_version_mock.return_value = '1.6.0' + move_user_custom_actions.called = False + _ambari_server_.upgrade(args) + self.assertFalse(move_user_custom_actions.called) + + get_ambari_version_mock.return_value = CURR_AMBARI_VERSION # test getAmbariProperties failed get_ambari_properties_mock.return_value = -1