| #!/usr/bin/env python3 |
| """ |
| 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 distro |
| import platform |
| import datetime |
| import os |
| import errno |
| import tempfile |
| import sys |
| from unittest import TestCase |
| from mock.mock import patch |
| from mock.mock import MagicMock |
| |
| from only_for_platform import os_distro_value, os_distro_value_linux |
| |
| from ambari_commons import os_utils |
| |
| from ambari_commons import OSCheck, OSConst |
| import os_check_type |
| |
| import shutil |
| |
| project_dir = os.path.join( |
| os.path.abspath(os.path.dirname(__file__)), os.path.normpath("../../../../") |
| ) |
| shutil.copyfile( |
| project_dir + "/ambari-server/conf/unix/ambari.properties", "/tmp/ambari.properties" |
| ) |
| |
| _search_file = os_utils.search_file |
| os_utils.search_file = MagicMock(return_value="/tmp/ambari.properties") |
| utils = __import__("ambari_server.utils").utils |
| # We have to use this import HACK because the filename contains a dash |
| with patch("os.path.isdir", return_value=MagicMock(return_value=True)): |
| with patch("os.access", return_value=MagicMock(return_value=True)): |
| with patch.object( |
| os_utils, |
| "parse_log4j_file", |
| return_value={"ambari.log.dir": "/var/log/ambari-server"}, |
| ): |
| with patch("distro.linux_distribution", return_value=os_distro_value_linux): |
| with patch.object(OSCheck, "os_distribution", return_value=os_distro_value): |
| with patch.object(os_utils, "is_service_exist", return_value=True): |
| with patch.object(utils, "get_postgre_hba_dir"): |
| os.environ["ROOT"] = "" |
| ambari_server = __import__("ambari-server") |
| |
| from ambari_server.serverConfiguration import ( |
| update_ambari_properties, |
| configDefaults, |
| ) |
| |
| |
| @patch.object( |
| distro, "linux_distribution", new=MagicMock(return_value=("Redhat", "6.4", "Final")) |
| ) |
| class TestOSCheck(TestCase): |
| @patch.object(OSCheck, "os_distribution") |
| @patch("ambari_commons.os_check._is_oracle_linux") |
| def test_get_os_type(self, mock_is_oracle_linux, mock_linux_distribution): |
| # 1 - Any system |
| mock_is_oracle_linux.return_value = False |
| mock_linux_distribution.return_value = ("my_os", "2015.09", "") |
| result = OSCheck.get_os_type() |
| self.assertEqual(result, "my_os") |
| |
| # 2 - Negative case |
| mock_linux_distribution.return_value = ("", "aaaa", "bbbbb") |
| try: |
| result = OSCheck.get_os_type() |
| self.fail("Should throw exception in OSCheck.get_os_type()") |
| except Exception as e: |
| # Expected |
| self.assertEqual("Cannot detect os type. Exiting...", str(e)) |
| pass |
| |
| # 3 - path exist: '/etc/oracle-release' |
| mock_is_oracle_linux.return_value = True |
| mock_linux_distribution.return_value = ("some_os", "1234", "") |
| result = OSCheck.get_os_type() |
| self.assertEqual(result, "oraclelinux") |
| |
| # 4 - Common system |
| mock_is_oracle_linux.return_value = False |
| mock_linux_distribution.return_value = ("CenToS", "4.56", "") |
| result = OSCheck.get_os_type() |
| self.assertEqual(result, "centos") |
| |
| # 5 - Red Hat Enterprise Linux |
| mock_is_oracle_linux.return_value = False |
| # Red Hat Enterprise Linux Server release 6.5 (Santiago) |
| mock_linux_distribution.return_value = ( |
| "Red Hat Enterprise Linux Server", |
| "6.5", |
| "Santiago", |
| ) |
| result = OSCheck.get_os_type() |
| self.assertEqual(result, "redhat") |
| |
| # Red Hat Enterprise Linux Workstation release 6.4 (Santiago) |
| mock_linux_distribution.return_value = ( |
| "Red Hat Enterprise Linux Workstation", |
| "6.4", |
| "Santiago", |
| ) |
| result = OSCheck.get_os_type() |
| self.assertEqual(result, "redhat") |
| |
| # Red Hat Enterprise Linux AS release 4 (Nahant Update 3) |
| mock_linux_distribution.return_value = ( |
| "Red Hat Enterprise Linux AS", |
| "4", |
| "Nahant Update 3", |
| ) |
| result = OSCheck.get_os_type() |
| self.assertEqual(result, "redhat") |
| |
| @patch.object(OSCheck, "os_distribution") |
| @patch("os.path.exists") |
| def test_get_os_family(self, mock_exists, mock_linux_distribution): |
| # 1 - Any system |
| mock_exists.return_value = False |
| mock_linux_distribution.return_value = ("MY_os", "5.6.7", "") |
| result = OSCheck.get_os_family() |
| self.assertEqual(result, "my_os") |
| |
| # 2 - Redhat |
| mock_exists.return_value = False |
| mock_linux_distribution.return_value = ("Centos Linux", "2.4", "") |
| result = OSCheck.get_os_family() |
| self.assertEqual(result, "redhat") |
| |
| # 3 - Ubuntu |
| mock_exists.return_value = False |
| mock_linux_distribution.return_value = ("Ubuntu", "14.04", "") |
| result = OSCheck.get_os_family() |
| self.assertEqual(result, "ubuntu") |
| |
| # 4 - Suse |
| mock_exists.return_value = False |
| mock_linux_distribution.return_value = ("suse linux enterprise server", "11.3", "") |
| result = OSCheck.get_os_family() |
| self.assertEqual(result, "suse") |
| |
| mock_exists.return_value = False |
| mock_linux_distribution.return_value = ("SLED", "1.2.3.4.5", "") |
| result = OSCheck.get_os_family() |
| self.assertEqual(result, "suse") |
| |
| # 5 - Negative case |
| mock_linux_distribution.return_value = ("", "111", "2222") |
| try: |
| result = OSCheck.get_os_family() |
| self.fail("Should throw exception in OSCheck.get_os_family()") |
| except Exception as e: |
| # Expected |
| self.assertEqual("Cannot detect os type. Exiting...", str(e)) |
| pass |
| |
| @patch.object(OSCheck, "os_distribution") |
| def test_get_os_version(self, mock_linux_distribution): |
| # 1 - Any system |
| mock_linux_distribution.return_value = ("some_os", "123.45", "") |
| result = OSCheck.get_os_version() |
| self.assertEqual(result, "123.45") |
| |
| # 2 - Negative case |
| mock_linux_distribution.return_value = ("ssss", "", "ddddd") |
| try: |
| result = OSCheck.get_os_version() |
| self.fail("Should throw exception in OSCheck.get_os_version()") |
| except Exception as e: |
| # Expected |
| self.assertEqual("Cannot detect os version. Exiting...", str(e)) |
| pass |
| |
| @patch.object(OSCheck, "os_distribution") |
| def test_get_os_major_version(self, mock_linux_distribution): |
| # 1 |
| mock_linux_distribution.return_value = ("abcd_os", "123.45.67", "") |
| result = OSCheck.get_os_major_version() |
| self.assertEqual(result, "123") |
| |
| # 2 |
| mock_linux_distribution.return_value = ("Suse", "11", "") |
| result = OSCheck.get_os_major_version() |
| self.assertEqual(result, "11") |
| |
| @patch.object(OSCheck, "os_distribution") |
| def test_aliases(self, mock_linux_distribution): |
| OSConst.OS_TYPE_ALIASES["qwerty_os123"] = "aliased_os5" |
| OSConst.OS_FAMILY_COLLECTION.append( |
| {"name": "aliased_os_family", "os_list": ["aliased_os"]} |
| ) |
| |
| mock_linux_distribution.return_value = ("qwerty_os", "123.45.67", "") |
| |
| self.assertEqual(OSCheck.get_os_type(), "aliased_os") |
| self.assertEqual(OSCheck.get_os_major_version(), "5") |
| self.assertEqual(OSCheck.get_os_version(), "5.45.67") |
| self.assertEqual(OSCheck.get_os_family(), "aliased_os_family") |
| |
| @patch.object(OSCheck, "os_distribution") |
| def test_get_os_release_name(self, mock_linux_distribution): |
| # 1 - Any system |
| mock_linux_distribution.return_value = ("", "", "MY_NEW_RELEASE") |
| result = OSCheck.get_os_release_name() |
| self.assertEqual(result, "my_new_release") |
| |
| # 2 - Negative case |
| mock_linux_distribution.return_value = ("aaaa", "bbbb", "") |
| try: |
| result = OSCheck.get_os_release_name() |
| self.fail("Should throw exception in OSCheck.get_os_release_name()") |
| except Exception as e: |
| # Expected |
| self.assertEqual("Cannot detect os release name. Exiting...", str(e)) |
| pass |
| |
| @patch("ambari_server.serverConfiguration.get_conf_dir") |
| def _test_update_ambari_properties_os(self, get_conf_dir_mock): |
| from ambari_server import ( |
| serverConfiguration, |
| ) # need to modify constants inside the module |
| |
| properties = [ |
| "server.jdbc.user.name=ambari-server\n", |
| "server.jdbc.database_name=ambari\n", |
| "ambari-server.user=root\n", |
| "server.jdbc.user.name=ambari-server\n", |
| "jdk.name=jdk-6u31-linux-x64.bin\n", |
| "jce.name=jce_policy-6.zip\n", |
| "server.os_type=old_sys_os6\n", |
| "java.home=/usr/jdk64/jdk1.6.0_31\n", |
| ] |
| |
| serverConfiguration.OS_FAMILY = "family_of_trolls" |
| serverConfiguration.OS_VERSION = "666" |
| |
| get_conf_dir_mock.return_value = "/etc/ambari-server/conf" |
| |
| (tf1, fn1) = tempfile.mkstemp() |
| (tf2, fn2) = tempfile.mkstemp() |
| configDefaults.AMBARI_PROPERTIES_BACKUP_FILE = fn1 |
| serverConfiguration.AMBARI_PROPERTIES_FILE = fn2 |
| |
| f = open(configDefaults.AMBARI_PROPERTIES_BACKUP_FILE, "w") |
| try: |
| for line in properties: |
| f.write(line) |
| finally: |
| f.close() |
| |
| # Call tested method |
| update_ambari_properties() |
| |
| f = open(serverConfiguration.AMBARI_PROPERTIES_FILE, "r") |
| try: |
| ambari_properties_content = f.readlines() |
| finally: |
| f.close() |
| |
| count = 0 |
| for line in ambari_properties_content: |
| if not line.startswith("#"): |
| count += 1 |
| if line == "server.os_type=old_sys_os6\n": |
| self.fail("line=" + line) |
| else: |
| pass |
| |
| self.assertEqual(count, 9) |
| # Command should not fail if *.rpmsave file is missing |
| result = update_ambari_properties() |
| self.assertEqual(result, 0) |
| pass |
| |
| @patch.object(OSCheck, "os_distribution") |
| def test_os_type_check(self, mock_linux_distribution): |
| # 1 - server and agent os compatible |
| mock_linux_distribution.return_value = ("aaa", "11", "bb") |
| base_args = ["os_check_type.py", "aaa11"] |
| sys.argv = list(base_args) |
| |
| try: |
| os_check_type.main() |
| except SystemExit as e: |
| # exit_code=0 |
| self.assertEqual("0", str(e)) |
| |
| # 2 - server and agent os is not compatible |
| mock_linux_distribution.return_value = ("ddd", "33", "bb") |
| base_args = ["os_check_type.py", "zzz_x77"] |
| sys.argv = list(base_args) |
| |
| try: |
| os_check_type.main() |
| self.fail("Must fail because os's not compatible.") |
| except Exception as e: |
| self.assertEqual( |
| "Local OS is not compatible with cluster primary OS family. Please perform manual bootstrap on this host.", |
| str(e), |
| ) |
| pass |
| |
| @patch.object(OSCheck, "get_os_family") |
| def is_ubuntu_family(self, get_os_family_mock): |
| get_os_family_mock.return_value = "ubuntu" |
| self.assertEqual(OSCheck.is_ubuntu_family(), True) |
| |
| get_os_family_mock.return_value = "troll_os" |
| self.assertEqual(OSCheck.is_ubuntu_family(), False) |
| |
| @patch.object(OSCheck, "get_os_family") |
| def test_is_suse_family(self, get_os_family_mock): |
| get_os_family_mock.return_value = "suse" |
| self.assertEqual(OSCheck.is_suse_family(), True) |
| |
| get_os_family_mock.return_value = "troll_os" |
| self.assertEqual(OSCheck.is_suse_family(), False) |
| |
| @patch.object(OSCheck, "get_os_family") |
| def test_is_redhat_family(self, get_os_family_mock): |
| get_os_family_mock.return_value = "redhat" |
| self.assertEqual(OSCheck.is_redhat_family(), True) |
| |
| get_os_family_mock.return_value = "troll_os" |
| self.assertEqual(OSCheck.is_redhat_family(), False) |