Hello community,
here is the log from the commit of package python-shaptools for
openSUSE:Factory checked in at 2020-05-15 23:52:34
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-shaptools (Old)
and /work/SRC/openSUSE:Factory/.python-shaptools.new.2738 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-shaptools"
Fri May 15 23:52:34 2020 rev:11 rq:805830 version:0.3.8
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-shaptools/python-shaptools.changes
2020-01-10 17:51:53.122137435 +0100
+++
/work/SRC/openSUSE:Factory/.python-shaptools.new.2738/python-shaptools.changes
2020-05-15 23:52:40.909586368 +0200
@@ -1,0 +2,19 @@
+Fri Mar 27 18:15:37 UTC 2020 - Simranpal Singh <[email protected]>
+
+- Create version 0.3.8
+- Add functionality to extract SAP sar files using SAPCAR tool
+
+-------------------------------------------------------------------
+Tue Mar 24 11:29:14 UTC 2020 - Xabier Arbulu <[email protected]>
+
+- Create version 0.3.7
+- Improve hana installation software detection to allow more use
+ cases
+
+-------------------------------------------------------------------
+Thu Mar 19 15:31:22 UTC 2020 - Xabier Arbulu <[email protected]>
+
+- Create version 0.3.6
+- Change the get_platform method to include the system OS type
+
+-------------------------------------------------------------------
Old:
----
shaptools-0.3.5.tar.gz
New:
----
shaptools-0.3.8.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-shaptools.spec ++++++
--- /var/tmp/diff_new_pack.S8KUm7/_old 2020-05-15 23:52:41.817588119 +0200
+++ /var/tmp/diff_new_pack.S8KUm7/_new 2020-05-15 23:52:41.821588126 +0200
@@ -22,7 +22,7 @@
%{?!python_module:%define python_module() python-%{**} python3-%{**}}
Name: python-shaptools
-Version: 0.3.5
+Version: 0.3.8
Release: 0
Summary: Python tools to interact with SAP HANA utilities
License: Apache-2.0
++++++ shaptools-0.3.5.tar.gz -> shaptools-0.3.8.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/shaptools-0.3.5/python-shaptools.changes
new/shaptools-0.3.8/python-shaptools.changes
--- old/shaptools-0.3.5/python-shaptools.changes 2020-01-08
18:00:27.219596228 +0100
+++ new/shaptools-0.3.8/python-shaptools.changes 2020-03-30
16:38:50.408194346 +0200
@@ -1,4 +1,23 @@
-------------------------------------------------------------------
+Fri Mar 27 18:15:37 UTC 2020 - Simranpal Singh <[email protected]>
+
+- Create version 0.3.8
+- Add functionality to extract SAP sar files using SAPCAR tool
+
+-------------------------------------------------------------------
+Tue Mar 24 11:29:14 UTC 2020 - Xabier Arbulu <[email protected]>
+
+- Create version 0.3.7
+- Improve hana installation software detection to allow more use
+ cases
+
+-------------------------------------------------------------------
+Thu Mar 19 15:31:22 UTC 2020 - Xabier Arbulu <[email protected]>
+
+- Create version 0.3.6
+- Change the get_platform method to include the system OS type
+
+-------------------------------------------------------------------
Thu Jan 2 21:59:30 UTC 2020 - Simranpal Singh <[email protected]>
- Create package version 0.3.5
@@ -9,7 +28,7 @@
Thu Dec 5 10:48:53 UTC 2019 - Xabier Arbulu <[email protected]>
- Create package version 0.3.4
-- Fix ascs restart conditions in ers installation
+- Fix ascs restart conditions in ers installation
-------------------------------------------------------------------
Thu Nov 7 00:36:08 UTC 2019 - Simranpal Singh <[email protected]>
@@ -21,7 +40,7 @@
Tue Oct 22 02:41:35 UTC 2019 - Xabier Arbulu <[email protected]>
- Create package version 0.3.2
-- Add isconnected and reconnect methods
+- Add isconnected and reconnect methods
-------------------------------------------------------------------
Wed Aug 7 12:50:36 UTC 2019 - Xabier Arbulu Insausti <[email protected]>
@@ -29,7 +48,7 @@
- Add the required code to install SAP Netweaver instances
* Wrap sapcontrol command usage
* Install and uninstall SAP instances
- * Check current installation status
+ * Check current installation status
-------------------------------------------------------------------
Tue Jul 23 11:04:25 UTC 2019 - Xabier Arbulu Insausti <[email protected]>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/shaptools-0.3.5/python-shaptools.spec
new/shaptools-0.3.8/python-shaptools.spec
--- old/shaptools-0.3.5/python-shaptools.spec 2020-01-08 18:00:27.219596228
+0100
+++ new/shaptools-0.3.8/python-shaptools.spec 2020-03-30 16:38:50.408194346
+0200
@@ -22,7 +22,7 @@
%{?!python_module:%define python_module() python-%{**} python3-%{**}}
Name: python-shaptools
-Version: 0.3.5
+Version: 0.3.8
Release: 0
Summary: Python tools to interact with SAP HANA utilities
License: Apache-2.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/shaptools-0.3.5/shaptools/hana.py
new/shaptools-0.3.8/shaptools/hana.py
--- old/shaptools-0.3.5/shaptools/hana.py 2020-01-08 18:00:27.219596228
+0100
+++ new/shaptools-0.3.8/shaptools/hana.py 2020-03-30 16:38:50.408194346
+0200
@@ -35,11 +35,16 @@
Error during HANA command execution
"""
-class FileDoesNotExistError(Exception):
+class FileDoesNotExistError(HanaError):
"""
Error when the specified files does not exist
"""
+class HanaSoftwareNotFoundError(HanaError):
+ """
+ HANA installation software not found
+ """
+
# System replication states
# Random value used
SR_STATES = {
@@ -73,10 +78,12 @@
"""
PATH = '/usr/sap/{sid}/HDB{inst}/'
- INSTALL_EXEC = '{software_path}/DATA_UNITS/HDB_LCM_LINUX_{platform}/hdblcm'
+ INSTALL_EXEC = 'hdblcm'
+ HANA_PLATFORM = '^HDB:HANA:.*:{platform}:.*'
SUPPORTED_PLATFORMS = [
'x86_64', 'ppc64le'
]
+ SUPPORTED_SYSTEMS = ['Linux']
# SID is usualy written uppercased, but the OS user is always created
lower case.
HANAUSER = '{sid}adm'.lower()
SYNCMODES = ['sync', 'syncmem', 'async']
@@ -106,7 +113,57 @@
logger.info('current platform is %s', current_platform)
if current_platform not in cls.SUPPORTED_PLATFORMS:
raise ValueError('not supported platform:
{}'.format(current_platform))
- return current_platform.upper()
+
+ current_system = platform.system()
+ logger.info('current system is %s', current_system)
+ if current_system not in cls.SUPPORTED_SYSTEMS:
+ raise ValueError('not supported system: {}'.format(current_system))
+
+ return '{}_{}'.format(current_system.upper(), current_platform.upper())
+
+ @classmethod
+ def find_hana_hdblcm(cls, software_path):
+ """
+ Find a HANA installation executable in a folder (and subfolders)
+
+ Args:
+ software_path (str): Path of a folder where the HANA installation
software is
+ available
+ """
+ logger = logging.getLogger('__name__')
+ # hdbclm in the provider folder
+ hdblcm_path = os.path.join(software_path, cls.INSTALL_EXEC)
+ if os.path.exists(hdblcm_path):
+ logger.info('HANA installer found: %s', hdblcm_path)
+ return hdblcm_path
+
+ # HANA platform folder
+ label_file = os.path.join(software_path, 'LABEL.ASC')
+ if os.path.exists(label_file):
+ with open(label_file) as file_ptr:
+ hana_platform = cls.get_platform()
+ hana_pattern = cls.HANA_PLATFORM.format(platform=hana_platform)
+ if re.match(hana_pattern, file_ptr.read()):
+ hdblcm_path = os.path.join(
+ software_path, 'DATA_UNITS',
+ 'HDB_LCM_{}'.format(hana_platform), cls.INSTALL_EXEC)
+ hdbserver_path = os.path.join(
+ software_path, 'DATA_UNITS',
+ 'HDB_SERVER_{}'.format(hana_platform),
cls.INSTALL_EXEC)
+ if os.path.exists(hdblcm_path):
+ logger.info('HANA installer found: %s', hdblcm_path)
+ return hdblcm_path
+ elif os.path.exists(hdbserver_path):
+ logger.info('HANA installer found: %s', hdbserver_path)
+ return hdbserver_path
+
+ # HANA server SAR patch
+ hana_server_path = os.path.join(software_path, 'SAP_HANA_DATABASE',
cls.INSTALL_EXEC)
+ if os.path.exists(hana_server_path):
+ logger.info('HANA installer found: %s', hana_server_path)
+ return hana_server_path
+
+ raise HanaSoftwareNotFoundError('HANA installer not found in
{}'.format(software_path))
def _run_hana_command(self, cmd, exception=True):
"""
@@ -202,8 +259,7 @@
remote_host (str, opt): Remote host where the command will be
executed
"""
- platform_folder = cls.get_platform()
- executable = cls.INSTALL_EXEC.format(software_path=software_path,
platform=platform_folder)
+ executable = cls.find_hana_hdblcm(software_path)
cmd = '{executable} --action=install '\
'--dump_configfile_template={conf_file}'.format(
executable=executable, conf_file=conf_file)
@@ -231,12 +287,12 @@
# TODO: do some integrity check stuff
if not os.path.isfile(conf_file):
- raise FileDoesNotExistError('The configuration file \'{}\' does
not exist'.format(conf_file))
+ raise FileDoesNotExistError(
+ 'The configuration file \'{}\' does not
exist'.format(conf_file))
if hdb_pwd_file is not None and not os.path.isfile(hdb_pwd_file):
- raise FileDoesNotExistError('The XML password file \'{}\' does not
exist'.format(hdb_pwd_file))
-
- platform_folder = cls.get_platform()
- executable = cls.INSTALL_EXEC.format(software_path=software_path,
platform=platform_folder)
+ raise FileDoesNotExistError(
+ 'The XML password file \'{}\' does not
exist'.format(hdb_pwd_file))
+ executable = cls.find_hana_hdblcm(software_path)
if hdb_pwd_file:
cmd = 'cat {hdb_pwd_file} | {executable} -b '\
'--read_password_from_stdin=xml
--configfile={conf_file}'.format(
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/shaptools-0.3.5/shaptools/saputils.py
new/shaptools-0.3.8/shaptools/saputils.py
--- old/shaptools-0.3.5/shaptools/saputils.py 1970-01-01 01:00:00.000000000
+0100
+++ new/shaptools-0.3.8/shaptools/saputils.py 2020-03-30 16:38:50.408194346
+0200
@@ -0,0 +1,65 @@
+"""
+Module to utilize SAP Technology components
+
+:author: sisingh
+:organization: SUSE LLC
+:contact: [email protected]
+
+:since: 2020-03-12
+"""
+#TODO: Add support for other SAPCAR functionalties apart from extraction
+
+import os
+
+from shaptools import shell
+
+
+class SapUtilsError(Exception):
+ """
+ Error during SapUtils command execution
+ """
+
+
+class FileDoesNotExistError(SapUtilsError):
+ """
+ Error when the specified files does not exist
+ """
+
+
+def extract_sapcar_file(sapcar_exe, sar_file, **kwargs):
+ """
+ Execute SAPCAR command to decompress a SAP CAR or SAR archive files.
+ If user and password are provided it will be executed with this user.
+
+ Args:
+ sapcar_exe(str): Path to the SAPCAR executable
+ sar_file (str): Path to the sar file to be extracted
+ options (str, opt): Additional options to SAPCAR command
+ output_dir (str, opt): Directory where archive will be extracted. It
creates the dir
+ if the path doesn't exist. If it's not set the current dir is used
+ user (str, opt): User to execute the SAPCAR command
+ password (str, opt): User password
+ remote_host (str, opt): Remote host where the command will be executed
+ """
+ if not os.path.isfile(sapcar_exe):
+ raise FileDoesNotExistError('SAPCAR executable \'{}\' does not
exist'.format(sapcar_exe))
+ if not os.path.isfile(sar_file):
+ raise FileDoesNotExistError('The SAR file \'{}\' does not
exist'.format(sar_file))
+
+ options = kwargs.get('options', None)
+ output_dir = kwargs.get('output_dir', None)
+ user = kwargs.get('user', None)
+ password = kwargs.get('password', None)
+ remote_host = kwargs.get('remote_host', None)
+
+ output_dir_str = ' -R {}'.format(output_dir) if output_dir else ''
+ options_str = ' {}'.format(options) if options else ''
+
+ cmd = '{sapcar_exe} -xvf {sar_file}{options_str}{output_dir_str}'.format(
+ sapcar_exe=sapcar_exe, sar_file=sar_file,
+ options_str=options_str, output_dir_str=output_dir_str)
+
+ result = shell.execute_cmd(cmd, user=user, password=password,
remote_host=remote_host)
+ if result.returncode:
+ raise SapUtilsError('Error running SAPCAR command')
+ return result
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/shaptools-0.3.5/tests/hana_test.py
new/shaptools-0.3.8/tests/hana_test.py
--- old/shaptools-0.3.5/tests/hana_test.py 2020-01-08 18:00:27.223598228
+0100
+++ new/shaptools-0.3.8/tests/hana_test.py 2020-03-30 16:38:50.408194346
+0200
@@ -78,27 +78,123 @@
'provided sid, inst and password parameters must be str type' in
str(err.exception))
+ @mock.patch('platform.system')
@mock.patch('platform.machine')
- def test_get_platform(self, mock_machine):
+ def test_get_platform(self, mock_machine, mock_system):
mock_machine.return_value = 'x86_64'
+ mock_system.return_value = 'Linux'
machine = hana.HanaInstance.get_platform()
- self.assertEqual(machine, 'X86_64')
+ self.assertEqual(machine, 'LINUX_X86_64')
mock_machine.assert_called_once_with()
mock_machine.reset_mock()
mock_machine.return_value = 'ppc64le'
+ mock_system.return_value = 'Linux'
machine = hana.HanaInstance.get_platform()
- self.assertEqual(machine, 'PPC64LE')
+ self.assertEqual(machine, 'LINUX_PPC64LE')
mock_machine.assert_called_once_with()
@mock.patch('platform.machine')
- def test_get_platform_error(self, mock_machine):
+ def test_get_platform_machine_error(self, mock_machine):
mock_machine.return_value = 'ppc64'
with self.assertRaises(ValueError) as err:
hana.HanaInstance.get_platform()
self.assertTrue('not supported platform: {}'.format('ppc64') in
str(err.exception))
mock_machine.assert_called_once_with()
+ @mock.patch('platform.system')
+ @mock.patch('platform.machine')
+ def test_get_platform_system_error(self, mock_machine, mock_system):
+ mock_machine.return_value = 'x86_64'
+ mock_system.return_value = 'Mac'
+ with self.assertRaises(ValueError) as err:
+ hana.HanaInstance.get_platform()
+ self.assertTrue('not supported system: {}'.format('Mac') in
str(err.exception))
+ mock_machine.assert_called_once_with()
+
+ @mock.patch('logging.Logger.info')
+ @mock.patch('os.path.exists')
+ def test_find_hana_hdblcm(self, mock_exists, mock_info):
+ mock_exists.return_value = True
+ hdblcm = hana.HanaInstance.find_hana_hdblcm('software_path')
+ assert hdblcm == 'software_path/hdblcm'
+ mock_exists.assert_called_once_with('software_path/hdblcm')
+ mock_info.assert_called_once_with('HANA installer found: %s',
'software_path/hdblcm')
+
+ @mock.patch('logging.Logger.info')
+ @mock.patch('shaptools.hana.HanaInstance.get_platform')
+ @mock.patch('os.path.exists')
+ def test_find_hana_hdblcm_units_lcm(self, mock_exists, mock_get_platform,
mock_info):
+ mock_exists.side_effect = [False, True, True]
+ mock_get_platform.return_value = 'LINUX_X86_64'
+
+ file_content = 'HDB:HANA:2.0:LINUX_X86_64:SAP HANA PLATFORM EDITION
2.0::BD51053787\n'
+ with mock.patch('shaptools.hana.open',
mock.mock_open(read_data=file_content)) as mock_file:
+ hdblcm = hana.HanaInstance.find_hana_hdblcm('software_path')
+
+ assert hdblcm == 'software_path/DATA_UNITS/HDB_LCM_LINUX_X86_64/hdblcm'
+ mock_get_platform.assert_called_once_with()
+ mock_exists.assert_has_calls([
+ mock.call('software_path/hdblcm'),
+ mock.call('software_path/LABEL.ASC'),
+ mock.call('software_path/DATA_UNITS/HDB_LCM_LINUX_X86_64/hdblcm')
+ ])
+ mock_info.assert_called_once_with(
+ 'HANA installer found: %s',
'software_path/DATA_UNITS/HDB_LCM_LINUX_X86_64/hdblcm')
+
+ @mock.patch('logging.Logger.info')
+ @mock.patch('shaptools.hana.HanaInstance.get_platform')
+ @mock.patch('os.path.exists')
+ def test_find_hana_hdblcm_units_server(self, mock_exists,
mock_get_platform, mock_info):
+ mock_exists.side_effect = [False, True, False, True]
+ mock_get_platform.return_value = 'LINUX_X86_64'
+
+ file_content = 'HDB:HANA:2.0:LINUX_X86_64:SAP HANA PLATFORM EDITION
2.0::BD51053787\n'
+ with mock.patch('shaptools.hana.open',
mock.mock_open(read_data=file_content)) as mock_file:
+ hdblcm = hana.HanaInstance.find_hana_hdblcm('software_path')
+
+ assert hdblcm ==
'software_path/DATA_UNITS/HDB_SERVER_LINUX_X86_64/hdblcm'
+ mock_get_platform.assert_called_once_with()
+ mock_exists.assert_has_calls([
+ mock.call('software_path/hdblcm'),
+ mock.call('software_path/LABEL.ASC'),
+ mock.call('software_path/DATA_UNITS/HDB_LCM_LINUX_X86_64/hdblcm'),
+
mock.call('software_path/DATA_UNITS/HDB_SERVER_LINUX_X86_64/hdblcm')
+ ])
+ mock_info.assert_called_once_with(
+ 'HANA installer found: %s',
'software_path/DATA_UNITS/HDB_SERVER_LINUX_X86_64/hdblcm')
+
+ @mock.patch('logging.Logger.info')
+ @mock.patch('os.path.exists')
+ def test_find_hana_hdblcm_extracted(self, mock_exists, mock_info):
+ mock_exists.side_effect = [False, False, True]
+
+ hdblcm = hana.HanaInstance.find_hana_hdblcm('software_path')
+
+ assert hdblcm == 'software_path/SAP_HANA_DATABASE/hdblcm'
+ mock_exists.assert_has_calls([
+ mock.call('software_path/hdblcm'),
+ mock.call('software_path/LABEL.ASC'),
+ mock.call('software_path/SAP_HANA_DATABASE/hdblcm')
+ ])
+ mock_info.assert_called_once_with(
+ 'HANA installer found: %s',
'software_path/SAP_HANA_DATABASE/hdblcm')
+
+ @mock.patch('os.path.exists')
+ def test_find_hana_hdblcm_error(self, mock_exists):
+ mock_exists.side_effect = [False, False, False]
+
+ with self.assertRaises(hana.HanaError) as err:
+ hana.HanaInstance.find_hana_hdblcm('software_path')
+
+ mock_exists.assert_has_calls([
+ mock.call('software_path/hdblcm'),
+ mock.call('software_path/LABEL.ASC'),
+ mock.call('software_path/SAP_HANA_DATABASE/hdblcm')
+ ])
+ self.assertTrue(
+ 'HANA installer not found in software_path' in str(err.exception))
+
@mock.patch('shaptools.shell.execute_cmd')
def test_run_hana_command(self, mock_execute):
proc_mock = mock.Mock()
@@ -183,109 +279,109 @@
pwd = os.path.dirname(os.path.abspath(__file__))
shutil.copyfile(pwd+'/support/original.conf.xml', '/tmp/test.conf.xml')
hdb_pwd_file = hana.HanaInstance.update_hdb_pwd_file(
- '/tmp/test.conf.xml', master_password='Master1234',
+ '/tmp/test.conf.xml', master_password='Master1234',
sapadm_password='Adm1234', system_user_password='Qwerty1234')
self.assertTrue(filecmp.cmp(pwd+'/support/modified.conf.xml',
hdb_pwd_file))
- @mock.patch('shaptools.hana.HanaInstance.get_platform')
+ @mock.patch('shaptools.hana.HanaInstance.find_hana_hdblcm')
@mock.patch('shaptools.shell.execute_cmd')
- def test_create_conf_file(self, mock_execute, mock_get_platform):
+ def test_create_conf_file(self, mock_execute, mock_find_hana):
proc_mock = mock.Mock()
proc_mock.returncode = 0
mock_execute.return_value = proc_mock
- mock_get_platform.return_value = 'my_arch'
+ mock_find_hana.return_value = 'my_path/hdblcm'
conf_file = hana.HanaInstance.create_conf_file(
'software_path', 'conf_file.conf', 'root', 'pass')
mock_execute.assert_called_once_with(
- 'software_path/DATA_UNITS/HDB_LCM_LINUX_my_arch/hdblcm '
+ 'my_path/hdblcm '
'--action=install --dump_configfile_template={conf_file}'.format(
conf_file='conf_file.conf'), 'root', 'pass', None)
- mock_get_platform.assert_called_once_with()
+ mock_find_hana.assert_called_once_with('software_path')
self.assertEqual('conf_file.conf', conf_file)
- @mock.patch('shaptools.hana.HanaInstance.get_platform')
+ @mock.patch('shaptools.hana.HanaInstance.find_hana_hdblcm')
@mock.patch('shaptools.shell.execute_cmd')
- def test_create_conf_file_error(self, mock_execute, mock_get_platform):
+ def test_create_conf_file_error(self, mock_execute, mock_find_hana):
proc_mock = mock.Mock()
proc_mock.returncode = 1
mock_execute.return_value = proc_mock
- mock_get_platform.return_value = 'my_arch'
+ mock_find_hana.return_value = 'my_path/hdblcm'
with self.assertRaises(hana.HanaError) as err:
hana.HanaInstance.create_conf_file(
'software_path', 'conf_file.conf', 'root', 'pass')
mock_execute.assert_called_once_with(
- 'software_path/DATA_UNITS/HDB_LCM_LINUX_my_arch/hdblcm '
+ 'my_path/hdblcm '
'--action=install --dump_configfile_template={conf_file}'.format(
conf_file='conf_file.conf'), 'root', 'pass', None)
- mock_get_platform.assert_called_once_with()
+ mock_find_hana.assert_called_once_with('software_path')
self.assertTrue(
'SAP HANA configuration file creation failed' in
str(err.exception))
- @mock.patch('shaptools.hana.HanaInstance.get_platform')
+ @mock.patch('shaptools.hana.HanaInstance.find_hana_hdblcm')
@mock.patch('shaptools.shell.execute_cmd')
@mock.patch('os.path.isfile')
- def test_install(self, mock_conf_file, mock_execute, mock_get_platform):
+ def test_install(self, mock_conf_file, mock_execute, mock_find_hana):
proc_mock = mock.Mock()
proc_mock.returncode = 0
mock_conf_file.side_effect = [True, True]
mock_execute.return_value = proc_mock
- mock_get_platform.return_value = 'my_arch'
+ mock_find_hana.return_value = 'my_path/hdblcm'
hana.HanaInstance.install(
'software_path', 'conf_file.conf', 'root', 'pass')
mock_execute.assert_called_once_with(
- 'software_path/DATA_UNITS/HDB_LCM_LINUX_my_arch/hdblcm '
+ 'my_path/hdblcm '
'-b --configfile={conf_file}'.format(
conf_file='conf_file.conf'), 'root', 'pass', None)
- mock_get_platform.assert_called_once_with()
+ mock_find_hana.assert_called_once_with('software_path')
- @mock.patch('shaptools.hana.HanaInstance.get_platform')
+ @mock.patch('shaptools.hana.HanaInstance.find_hana_hdblcm')
@mock.patch('shaptools.shell.execute_cmd')
@mock.patch('os.path.isfile')
- def test_install_xml(self, mock_conf_file, mock_execute,
mock_get_platform):
+ def test_install_xml(self, mock_conf_file, mock_execute, mock_find_hana):
proc_mock = mock.Mock()
proc_mock.returncode = 0
mock_conf_file.side_effect = [True, True]
mock_execute.return_value = proc_mock
- mock_get_platform.return_value = 'my_arch'
+ mock_find_hana.return_value = 'my_path/hdblcm'
hana.HanaInstance.install(
- 'software_path', 'conf_file.conf', 'root', 'pass',
+ 'software_path', 'conf_file.conf', 'root', 'pass',
hdb_pwd_file='hdb_passwords.xml')
mock_execute.assert_called_once_with(
- 'cat {hdb_pwd_file} |
software_path/DATA_UNITS/HDB_LCM_LINUX_my_arch/hdblcm '\
+ 'cat {hdb_pwd_file} | my_path/hdblcm '\
'-b --read_password_from_stdin=xml
--configfile={conf_file}'.format(
- hdb_pwd_file='hdb_passwords.xml',
+ hdb_pwd_file='hdb_passwords.xml',
conf_file='conf_file.conf'), 'root', 'pass', None)
- mock_get_platform.assert_called_once_with()
+ mock_find_hana.assert_called_once_with('software_path')
- @mock.patch('shaptools.hana.HanaInstance.get_platform')
+ @mock.patch('shaptools.hana.HanaInstance.find_hana_hdblcm')
@mock.patch('shaptools.shell.execute_cmd')
@mock.patch('os.path.isfile')
- def test_install_error(self, mock_conf_file, mock_execute,
mock_get_platform):
+ def test_install_error(self, mock_conf_file, mock_execute, mock_find_hana):
proc_mock = mock.Mock()
proc_mock.returncode = 1
mock_conf_file.side_effect = [True, True]
mock_execute.return_value = proc_mock
- mock_get_platform.return_value = 'my_arch'
+ mock_find_hana.return_value = 'my_path/hdblcm'
with self.assertRaises(hana.HanaError) as err:
hana.HanaInstance.install(
'software_path', 'conf_file.conf', 'root', 'pass')
mock_execute.assert_called_once_with(
- 'software_path/DATA_UNITS/HDB_LCM_LINUX_my_arch/hdblcm '
+ 'my_path/hdblcm '
'-b --configfile={conf_file}'.format(
conf_file='conf_file.conf'), 'root', 'pass', None)
- mock_get_platform.assert_called_once_with()
+ mock_find_hana.assert_called_once_with('software_path')
self.assertTrue(
'SAP HANA installation failed' in str(err.exception))
@@ -293,7 +389,7 @@
@mock.patch('os.path.isfile')
def test_install_FileDoesNotExistError(self, mock_conf_file):
mock_conf_file.return_value = False
-
+
with self.assertRaises(hana.FileDoesNotExistError) as err:
hana.HanaInstance.install(
'software_path', 'conf_file.conf', 'root', 'pass')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/shaptools-0.3.5/tests/saputils_test.py
new/shaptools-0.3.8/tests/saputils_test.py
--- old/shaptools-0.3.5/tests/saputils_test.py 1970-01-01 01:00:00.000000000
+0100
+++ new/shaptools-0.3.8/tests/saputils_test.py 2020-03-30 16:38:50.408194346
+0200
@@ -0,0 +1,111 @@
+"""
+Unitary tests for saputils.py.
+
+:author: sisingh
+:organization: SUSE LLC
+:contact: [email protected]
+
+:since: 2020-03-26
+"""
+
+# pylint:disable=C0103,C0111,W0212,W0611
+
+import os
+import sys
+sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__),
'..')))
+
+import logging
+import unittest
+
+try:
+ from unittest import mock
+except ImportError:
+ import mock
+
+
+from shaptools import saputils
+
+class TestSapUtils(unittest.TestCase):
+ """
+ Unitary tests for shaptools/saputis.py.
+ """
+
+ @classmethod
+ def setUpClass(cls):
+ """
+ Global setUp.
+ """
+
+ logging.basicConfig(level=logging.INFO)
+
+ def setUp(self):
+ """
+ Test setUp.
+ """
+
+ def tearDown(self):
+ """
+ Test tearDown.
+ """
+
+ @classmethod
+ def tearDownClass(cls):
+ """
+ Global tearDown.
+ """
+
+ @mock.patch('shaptools.shell.execute_cmd')
+ @mock.patch('os.path.isfile')
+ def test_extract_sapcar_file(self, mock_sapcar_file, mock_execute_cmd):
+ proc_mock = mock.Mock()
+ proc_mock.returncode = 0
+ mock_sapcar_file.side_effect = [True, True]
+ mock_execute_cmd.return_value = proc_mock
+
+ result = saputils.extract_sapcar_file(
+ sapcar_exe='/sapmedia/sapcar.exe',
sar_file='/sapmedia/IMDB_SERVER_LINUX.SAR',
+ output_dir='/sapmedia/HANA', options='-v')
+
+ cmd = '/sapmedia/sapcar.exe -xvf /sapmedia/IMDB_SERVER_LINUX.SAR -v -R
/sapmedia/HANA'
+ mock_execute_cmd.assert_called_once_with(cmd, user=None,
password=None, remote_host=None)
+ self.assertEqual(proc_mock, result)
+
+ @mock.patch('shaptools.shell.execute_cmd')
+ @mock.patch('os.path.isfile')
+ def test_extract_sapcar_error(self, mock_sapcar_file, mock_execute_cmd):
+ mock_sapcar_file.side_effect = [True, True]
+ proc_mock = mock.Mock()
+ proc_mock.returncode = 1
+ mock_execute_cmd.return_value = proc_mock
+
+ with self.assertRaises(saputils.SapUtilsError) as err:
+ saputils.extract_sapcar_file(
+ sapcar_exe='/sapmedia/sapcar.exe',
sar_file='/sapmedia/IMDB_SERVER_LINUX.SAR')
+
+ cmd = '/sapmedia/sapcar.exe -xvf /sapmedia/IMDB_SERVER_LINUX.SAR'
+ mock_execute_cmd.assert_called_once_with(cmd, user=None,
password=None, remote_host=None)
+
+ self.assertTrue(
+ 'Error running SAPCAR command' in str(err.exception))
+
+ @mock.patch('os.path.isfile')
+ def test_extract_sapcar_FileDoesNotExistError(self, mock_sapcar_file):
+ mock_sapcar_file.return_value = False
+
+ with self.assertRaises(saputils.FileDoesNotExistError) as err:
+ saputils.extract_sapcar_file(
+ sapcar_exe='/sapmedia/sapcar.exe',
sar_file='/sapmedia/IMDB_SERVER_LINUX.SAR')
+
+ self.assertTrue(
+ 'SAPCAR executable \'{}\' does not
exist'.format('/sapmedia/sapcar.exe') in str(err.exception))
+
+ @mock.patch('os.path.isfile')
+ def test_extract_sar_FileDoesNotExistError(self, mock_sar_file):
+ mock_sar_file.side_effect = [True, False]
+
+ with self.assertRaises(saputils.FileDoesNotExistError) as err:
+ saputils.extract_sapcar_file(
+ sapcar_exe='/sapmedia/sapcar.exe',
sar_file='/sapmedia/IMDB_SERVER_LINUX.SAR')
+
+ self.assertTrue(
+ 'The SAR file \'{}\' does not
exist'.format('/sapmedia/IMDB_SERVER_LINUX.SAR') in str(err.exception))
\ No newline at end of file