Repository: ambari Updated Branches: refs/heads/trunk e3763edde -> a71f942ed
AMBARI-9169 - Upgrade pack for Knox (tbeerbower) Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/a71f942e Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/a71f942e Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/a71f942e Branch: refs/heads/trunk Commit: a71f942eda00930e85f4c3b9451da2a58b58303f Parents: e3763ed Author: tbeerbower <[email protected]> Authored: Fri Jan 16 10:19:44 2015 -0500 Committer: tbeerbower <[email protected]> Committed: Fri Jan 16 11:26:51 2015 -0500 ---------------------------------------------------------------------- .../0.5.0.2.2/package/scripts/knox_gateway.py | 14 +++- .../KNOX/0.5.0.2.2/package/scripts/params.py | 6 ++ .../KNOX/0.5.0.2.2/package/scripts/upgrade.py | 71 ++++++++++++++++++++ .../stacks/HDP/2.2/upgrades/upgrade-2.2.xml | 17 ++++- .../python/stacks/2.2/KNOX/test_knox_gateway.py | 16 +++++ 5 files changed, 121 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/a71f942e/ambari-server/src/main/resources/common-services/KNOX/0.5.0.2.2/package/scripts/knox_gateway.py ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/resources/common-services/KNOX/0.5.0.2.2/package/scripts/knox_gateway.py b/ambari-server/src/main/resources/common-services/KNOX/0.5.0.2.2/package/scripts/knox_gateway.py index 9332bff..7e5fe13 100644 --- a/ambari-server/src/main/resources/common-services/KNOX/0.5.0.2.2/package/scripts/knox_gateway.py +++ b/ambari-server/src/main/resources/common-services/KNOX/0.5.0.2.2/package/scripts/knox_gateway.py @@ -22,6 +22,7 @@ from resource_management.libraries.functions.security_commons import build_expec cached_kinit_executor, validate_security_config_properties, get_params_from_filesystem, \ FILE_TYPE_XML import sys +import upgrade from knox import knox from ldap import ldap @@ -46,7 +47,16 @@ class KnoxGateway(Script): knox() ldap() - def start(self, env): + def pre_rolling_restart(self, env): + import params + env.set_params(params) + + if params.version and compare_versions(format_hdp_stack_version(params.version), '2.2.0.0') >= 0: + upgrade.backup_data() + Execute(format("hdp-select set knox-server {version}")) + + + def start(self, env, rolling_restart=False): import params env.set_params(params) self.configure(env) @@ -58,7 +68,7 @@ class KnoxGateway(Script): not_if=no_op_test ) - def stop(self, env): + def stop(self, env, rolling_restart=False): import params env.set_params(params) self.configure(env) http://git-wip-us.apache.org/repos/asf/ambari/blob/a71f942e/ambari-server/src/main/resources/common-services/KNOX/0.5.0.2.2/package/scripts/params.py ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/resources/common-services/KNOX/0.5.0.2.2/package/scripts/params.py b/ambari-server/src/main/resources/common-services/KNOX/0.5.0.2.2/package/scripts/params.py index 3c91992..938d1d7 100644 --- a/ambari-server/src/main/resources/common-services/KNOX/0.5.0.2.2/package/scripts/params.py +++ b/ambari-server/src/main/resources/common-services/KNOX/0.5.0.2.2/package/scripts/params.py @@ -29,6 +29,8 @@ tmp_dir = Script.get_tmp_dir() stack_name = default("/hostLevelParams/stack_name", None) +version = default("/commandParams/version", None) + stack_version_unformatted = str(config['hostLevelParams']['stack_version']) hdp_stack_version = format_hdp_stack_version(stack_version_unformatted) @@ -36,10 +38,14 @@ if hdp_stack_version != "" and compare_versions(hdp_stack_version, '2.2') >= 0: knox_bin = '/usr/hdp/current/knox-server/bin/gateway.sh' ldap_bin = '/usr/hdp/current/knox-server/bin/ldap.sh' knox_client_bin = '/usr/hdp/current/knox-server/bin/knoxcli.sh' + knox_data_dir = '/usr/hdp/current/knox-server/data' + knox_conf_dir = '/usr/hdp/current/knox-server/conf' else: knox_bin = '/usr/bin/gateway' ldap_bin = '/usr/lib/knox/bin/ldap.sh' knox_client_bin = '/usr/lib/knox/bin/knoxcli.sh' + knox_data_dir = '/usr/lib/knox/data' + knox_conf_dir = '/usr/lib/knox/conf' namenode_hosts = default("/clusterHostInfo/namenode_host", None) if type(namenode_hosts) is list: http://git-wip-us.apache.org/repos/asf/ambari/blob/a71f942e/ambari-server/src/main/resources/common-services/KNOX/0.5.0.2.2/package/scripts/upgrade.py ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/resources/common-services/KNOX/0.5.0.2.2/package/scripts/upgrade.py b/ambari-server/src/main/resources/common-services/KNOX/0.5.0.2.2/package/scripts/upgrade.py new file mode 100644 index 0000000..9976cb2 --- /dev/null +++ b/ambari-server/src/main/resources/common-services/KNOX/0.5.0.2.2/package/scripts/upgrade.py @@ -0,0 +1,71 @@ + +#!/usr/bin/env python +""" +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. + +""" +import os +import tarfile +import tempfile + +from resource_management.core.logger import Logger +from resource_management.core.exceptions import Fail + +BACKUP_TEMP_DIR = "knox-upgrade-backup" +BACKUP_DATA_ARCHIVE = "knox-data-backup.tar" +BACKUP_CONF_ARCHIVE = "knox-conf-backup.tar" + +def backup_data(): + """ + Backs up the knox data as part of the upgrade process. + :return: + """ + Logger.info('Backing up Knox data directory before upgrade...') + directoryMappings = _get_directory_mappings() + + absolute_backup_dir = os.path.join(tempfile.gettempdir(), BACKUP_TEMP_DIR) + if not os.path.isdir(absolute_backup_dir): + os.makedirs(absolute_backup_dir) + + for directory in directoryMappings: + if not os.path.isdir(directory): + raise Fail("Unable to backup missing directory {0}".format(directory)) + + archive = os.path.join(absolute_backup_dir, directoryMappings[directory]) + Logger.info('Compressing {0} to {1}'.format(directory, archive)) + + if os.path.exists(archive): + os.remove(archive) + + tarball = None + try: + tarball = tarfile.open(archive, "w") + tarball.add(directory, arcname=os.path.basename(directory)) + finally: + if tarball: + tarball.close() + +def _get_directory_mappings(): + """ + Gets a dictionary of directory to archive name that represents the + directories that need to be backed up and their output tarball archive targets + :return: the dictionary of directory to tarball mappings + """ + import params + + return { params.knox_data_dir : BACKUP_DATA_ARCHIVE, params.knox_conf_dir : BACKUP_CONF_ARCHIVE } + http://git-wip-us.apache.org/repos/asf/ambari/blob/a71f942e/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/upgrade-2.2.xml ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/upgrade-2.2.xml b/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/upgrade-2.2.xml index 15aa1f5..75730f2 100644 --- a/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/upgrade-2.2.xml +++ b/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/upgrade-2.2.xml @@ -98,7 +98,14 @@ <service name="KAFKA"> <component>KAFKA_BROKER</component> </service> - </group> + </group> + + <group name="KNOX" title="Knox"> + <skippable>true</skippable> + <service name="KNOX"> + <component>KNOX_GATEWAY</component> + </service> + </group> <group name="STORM" title="Storm"> <skippable>true</skippable> @@ -425,6 +432,14 @@ </component> </service> + <service name="KNOX"> + <component name="KNOX_GATEWAY"> + <upgrade> + <task xsi:type="restart" /> + </upgrade> + </component> + </service> + <service name="STORM"> <component name="NIMBUS"> <pre-upgrade> http://git-wip-us.apache.org/repos/asf/ambari/blob/a71f942e/ambari-server/src/test/python/stacks/2.2/KNOX/test_knox_gateway.py ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/python/stacks/2.2/KNOX/test_knox_gateway.py b/ambari-server/src/test/python/stacks/2.2/KNOX/test_knox_gateway.py index debd77e..3d0ca6e 100644 --- a/ambari-server/src/test/python/stacks/2.2/KNOX/test_knox_gateway.py +++ b/ambari-server/src/test/python/stacks/2.2/KNOX/test_knox_gateway.py @@ -197,3 +197,19 @@ class TestKnoxGateway(RMFTestCase): target = RMFTestCase.TARGET_COMMON_SERVICES ) put_structured_out_mock.assert_called_with({"securityState": "UNSECURED"}) + + @patch("tarfile.open") + @patch("os.path.isdir") + def test_pre_rolling_restart(self, isdir_mock, tarfile_open_mock): + isdir_mock.return_value = True + + self.executeScript(self.COMMON_SERVICES_PACKAGE_DIR + "/scripts/knox_gateway.py", + classname = "KnoxGateway", + command = "pre_rolling_restart", + config_file="default.json", + hdp_stack_version = self.STACK_VERSION, + target = RMFTestCase.TARGET_COMMON_SERVICES) + + self.assertTrue(tarfile_open_mock.called) + + self.assertResourceCalled("Execute", "hdp-select set knox-server 2.2.1.0-2067")
