rhel-system-roles-sap/redhat.sap_install-1.3.4-ad...

1691 lines
60 KiB
Diff

commit a7cb39c723ddcce5e45b7e8f370137e4ae42b629
Author: Than Ngo <than@redhat.com>
Date: Wed Jan 24 20:41:25 2024 +0100
Add missing tests folders
Signed-off-by: Than Ngo <than@redhat.com>
diff --git a/roles/sap_general_preconfigure/tests/.pylintrc b/roles/sap_general_preconfigure/tests/.pylintrc
new file mode 120000
index 0000000..0d402e7
--- /dev/null
+++ b/roles/sap_general_preconfigure/tests/.pylintrc
@@ -0,0 +1 @@
+../../../.pylintrc
\ No newline at end of file
diff --git a/roles/sap_general_preconfigure/tests/beautify-assert-output.sh b/roles/sap_general_preconfigure/tests/beautify-assert-output.sh
new file mode 120000
index 0000000..9a2e976
--- /dev/null
+++ b/roles/sap_general_preconfigure/tests/beautify-assert-output.sh
@@ -0,0 +1 @@
+../tools/beautify-assert-output.sh
\ No newline at end of file
diff --git a/roles/sap_general_preconfigure/tests/run-sap_general_preconfigure-tests.py b/roles/sap_general_preconfigure/tests/run-sap_general_preconfigure-tests.py
new file mode 100755
index 0000000..b09ea85
--- /dev/null
+++ b/roles/sap_general_preconfigure/tests/run-sap_general_preconfigure-tests.py
@@ -0,0 +1,199 @@
+#!/usr/bin/env python
+
+"""
+Tests for role sap_general_preconfigure
+"""
+
+import os
+import sys
+import subprocess
+
+# output field delimiter for displaying the results:
+# FIELD_DELIMITER = ';'
+FIELD_DELIMITER = '\t'
+
+if len(sys.argv) == 1:
+ _managed_node = input("Provide name of managed node: ")
+else:
+ _managed_node = sys.argv[1]
+
+print('Running tests for role sap_general_preconfigure...\n')
+print('Managed node: ' + _managed_node)
+
+_mn_rhel_release = subprocess.getoutput(
+ "ssh root@"
+ + _managed_node
+ + " cat /etc/redhat-release | \
+ awk 'BEGIN{FS=\"release \"}{split($2, a, \" \"); print a[1]}'")
+print('Managed node Red Hat release: ' + _mn_rhel_release)
+_mn_hw_arch = subprocess.getoutput("ssh root@" + _managed_node + " uname -m")
+print('Managed node HW architecture: ' + _mn_hw_arch)
+
+__tests = [
+ {
+ 'number': '1',
+ 'name': 'Run in check mode on new system.',
+ 'command_line_parameter': '--check ',
+ 'ignore_error_final': True,
+ 'compact_assert_output': False,
+ 'rc': '99',
+ 'role_vars': [
+ {
+ 'sap_general_preconfigure_fail_if_reboot_required': False,
+ }
+ ]
+ },
+ {
+ 'number': '2',
+ 'name': 'Run in assert mode on new system, \
+ check for enabled repos and for minor release lock, \
+ check for possible RHEL update, \
+ ignore assert errors.',
+ 'command_line_parameter': '',
+ 'ignore_error_final': False,
+ 'compact_assert_output': False,
+ 'rc': '99',
+ 'role_vars': [
+ {
+ 'sap_general_preconfigure_assert': True,
+ 'sap_general_preconfigure_assert_ignore_errors': True,
+ 'sap_general_preconfigure_update': True,
+ 'sap_general_preconfigure_enable_repos': True,
+ 'sap_general_preconfigure_set_minor_release': True,
+ }
+ ]
+ },
+ {
+ 'number': '3',
+ 'name': 'Run in normal mode on new system, \
+ enable repos and set minor release lock, \
+ check for possible RHEL update, \
+ set SELinux to permisive, \
+ allow a reboot.',
+ 'command_line_parameter': '',
+ 'ignore_error_final': False,
+ 'compact_assert_output': False,
+ 'rc': '99',
+ 'role_vars': [
+ {
+ 'sap_general_preconfigure_update': True,
+ 'sap_general_preconfigure_enable_repos': True,
+ 'sap_general_preconfigure_set_minor_release': True,
+ 'sap_general_preconfigure_selinux_state': 'permissive',
+ 'sap_general_preconfigure_reboot_ok': True,
+ }
+ ]
+ },
+ {
+ 'number': '4',
+ 'name': 'Idempotency check: Run in normal mode on modified system, \
+ enable repos and set minor release lock, \
+ check for possible RHEL update, \
+ set SELinux to permisive, \
+ allow a reboot.',
+ 'command_line_parameter': '',
+ 'ignore_error_final': False,
+ 'compact_assert_output': False,
+ 'rc': '99',
+ 'role_vars': [
+ {
+ 'sap_general_preconfigure_update': True,
+ 'sap_general_preconfigure_enable_repos': True,
+ 'sap_general_preconfigure_set_minor_release': True,
+ 'sap_general_preconfigure_selinux_state': 'permissive',
+ 'sap_general_preconfigure_reboot_ok': True,
+ }
+ ]
+ },
+ {
+ 'number': '5',
+ 'name': 'Run in assert mode on modified system, \
+ check for repos and for the RHEL minor release lock, \
+ check for possible RHEL update, \
+ check if SELinux is permisive, \
+ ignore any assert error.',
+ 'command_line_parameter': '',
+ 'ignore_error_final': False,
+ 'compact_assert_output': True,
+ 'rc': '99',
+ 'role_vars': [
+ {
+ 'sap_general_preconfigure_assert': True,
+ 'sap_general_preconfigure_assert_ignore_errors': True,
+ 'sap_general_preconfigure_update': True,
+ 'sap_general_preconfigure_enable_repos': True,
+ 'sap_general_preconfigure_set_minor_release': True,
+ 'sap_general_preconfigure_selinux_state': 'permissive',
+ }
+ ]
+ },
+ {
+ 'number': '6',
+ 'name': 'Run in check mode on modified system.',
+ 'command_line_parameter': '--check ',
+ 'ignore_error_final': True,
+ 'compact_assert_output': False,
+ 'rc': '99',
+ 'role_vars': []
+ },
+]
+
+for par1 in __tests:
+ print('\n' + 'Test ' + par1['number'] + ': ' + par1['name'])
+ command = (
+ 'ansible-playbook sap_general_preconfigure-default-settings.yml '
+ + par1['command_line_parameter']
+ + '-l '
+ + _managed_node
+ + ' '
+ + '-e "'
+ )
+ for par2 in par1['role_vars']:
+ command += str(par2)
+ command += '"'
+ if par1['compact_assert_output']:
+ command += ' | ./beautify-assert-output.sh'
+ print("command: " + command)
+ _py_rc = os.system(command)
+ par1['rc'] = str(int(_py_rc / 256))
+ if _py_rc != 0:
+ if par1['ignore_error_final']:
+ print('Test '
+ + par1['number']
+ + ' finished with return code '
+ + par1['rc'] + '. Continuing with the next test')
+ else:
+ print('Test '
+ + par1['number']
+ + ' finished with return code '
+ + par1['rc'] + '.')
+ sys.exit(_py_rc)
+ else:
+ print('Test ' + par1['number'] + ' finished with return code ' + par1['rc'] + '.')
+
+print('\nResults for role sap_general_preconfigure: '
+ + _managed_node
+ + ' - RHEL '
+ + _mn_rhel_release
+ + ' - '
+ + _mn_hw_arch + ':')
+
+print('\n#'
+ + FIELD_DELIMITER
+ + 'RC' + FIELD_DELIMITER
+ + 'name' + FIELD_DELIMITER
+ + 'argument' + FIELD_DELIMITER
+ + 'compact' + FIELD_DELIMITER
+ + 'role_vars')
+
+for par1 in __tests:
+ print(par1['number'] + FIELD_DELIMITER
+ + par1['rc'] + FIELD_DELIMITER
+ + par1['name'] + FIELD_DELIMITER
+ + par1['command_line_parameter'] + FIELD_DELIMITER
+ + str(par1['compact_assert_output']) + FIELD_DELIMITER, end='')
+ if len(par1['role_vars']) == 0:
+ print("")
+ else:
+ for par2 in par1['role_vars']:
+ print(str(par2))
diff --git a/roles/sap_general_preconfigure/tests/sap_general_preconfigure-default-settings.yml b/roles/sap_general_preconfigure/tests/sap_general_preconfigure-default-settings.yml
new file mode 100644
index 0000000..a3c320b
--- /dev/null
+++ b/roles/sap_general_preconfigure/tests/sap_general_preconfigure-default-settings.yml
@@ -0,0 +1,6 @@
+---
+- hosts: all
+ collections:
+ - community.sap_install
+ roles:
+ - sap_general_preconfigure
diff --git a/roles/sap_hana_install/tests/README.md b/roles/sap_hana_install/tests/README.md
new file mode 100644
index 0000000..ef2af5b
--- /dev/null
+++ b/roles/sap_hana_install/tests/README.md
@@ -0,0 +1,4 @@
+# sap_hana_install testing
+
+The tests in the subdirectories are designed for quality assurance processes. These files might be used for demonstration
+purposes as well, however it is recommended to use the sample files in directory `playbooks` in the root of the Ansible Collection.
diff --git a/roles/sap_hana_install/tests/install/README.md b/roles/sap_hana_install/tests/install/README.md
new file mode 100644
index 0000000..7a344c4
--- /dev/null
+++ b/roles/sap_hana_install/tests/install/README.md
@@ -0,0 +1,55 @@
+# sap_hana_install Installation testing
+
+Installation testing is done by running:
+`# run-sap_hana_install-install-tests.py <managed_node> <username>`
+where `managed_node` is the hostname of the host on which SAP HANA installation testing will take place,
+and `username` is the name of a user for accessing the managed node. Some basic information is retrieved
+from the managed node via `ssh`, for which we need a user name.
+
+The following steps have to be performed to prepare the tests:
+- The files mentioned in the tasks `Copy ... to software directory` (e.g. `SAPCAR_1115-70006178.EXE`),
+ as well as their sha256 checksum files (e.g. `SAPCAR_1115-70006178.EXE.sha256`), need to be available
+ in the directory specified by variable `sap_hana_install_software_directory` in file
+ `install-vars.yml`, e.g. `/software/sap_hana_install_test`.
+- You can either download or copy these files manually or via Ansible with yml file
+ `prepare-install-tests-x86_64.yml` or `prepare-install-tests-ppc64le.yml`.
+ In that case, the required files need to be in a directory specified by variable `software_host_directory`,
+ followed by the output of `uname -m` (e.g. `/software/hana_store/x86_64`), on a server
+ specified by variable `software_host`.
+
+For a SAP HANA scale-out test, the server(s) specified by variable `sap_hana_install_addhosts` in file
+`run-install-test-03.yml` (e.g. `node02`) need(s) to have the following file systems mounted from the node on
+which the test is run:
+- `/hana/data`
+- `/hana/log`
+- `/hana/shared`
+
+Note: There should be no group named `sapsys` in file `/etc/group` on any of the test system(s), or if
+there is one, its group id should match the value of `sap_hana_install_groupid` (default `79`) in file
+install-vars.yml.
+
+Each test cycle is running the following steps:
+- `ansible-playbook prepare-install-test-NN.yml -l managed_node`
+- `ansible-playbook run-install-test-NN.yml [...] -l managed_node -e [...]`
+- `ansible-playbook hana-uninstall.yml -l managed_node`
+
+All screen outputs are saved in a newly created directory with the following name pattern:
+`hana-install-test-logs-` + rhel_release + `_` + hardware_architecture + `_` + date_time_string
+
+Example:
+`hana-install-test-logs-8.4_x86_64_2022-03-06_23:29:34`
+
+For each of the tests, there will be three output files in the log directory (shown with
+example file names for the directory mentioned above):
+- `hana-install-test-2022-03-06_23:29:34-prepare-01.log`
+- `hana-install-test-2022-03-06_23:29:34-run-01.log`
+- `hana-install-test-2022-03-06_23:29:34-uninstall-01.log`
+
+and an additional file name at the end of all tests, named
+- `hana-install-test-2022-03-06_23:29:34-result.log`
+
+If the return code of a test is `0`, the test has succeeded. If it is not `0` (default is `99`),
+the test has failed.
+
+A test succeeds if the string specified in variable `expected_output_string` for each test is found
+in the output of the test run.
diff --git a/roles/sap_hana_install/tests/install/hana-uninstall.yml b/roles/sap_hana_install/tests/install/hana-uninstall.yml
new file mode 100644
index 0000000..d5b0bbb
--- /dev/null
+++ b/roles/sap_hana_install/tests/install/hana-uninstall.yml
@@ -0,0 +1,19 @@
+---
+
+- hosts: all
+ become: true
+ vars_files:
+ - install-vars.yml
+
+ tasks:
+ - name: "Uninstalling SAP HANA installation '{{ sap_hana_install_sid }}' after 5 seconds"
+ pause:
+ seconds: 5
+
+ - name: "Force uninstall SAP HANA '{{ sap_hana_install_sid }}' on '{{ ansible_hostname }}'"
+ shell: "{{ sap_hana_install_install_path }}/{{ sap_hana_install_sid }}/hdblcm/hdblcm --uninstall --components=all -b"
+ register: shell_output
+
+ - name: Display the hdbuninst output
+ debug:
+ var: shell_output
diff --git a/roles/sap_hana_install/tests/install/install-vars.yml b/roles/sap_hana_install/tests/install/install-vars.yml
new file mode 100644
index 0000000..080c174
--- /dev/null
+++ b/roles/sap_hana_install/tests/install/install-vars.yml
@@ -0,0 +1,14 @@
+---
+
+sap_hana_install_new_system: true
+sap_hana_install_software_directory: '/software/sap_hana_install_test'
+sap_hana_install_software_extract_directory: '/software/sap_hana_install_test/extracted'
+sap_hana_install_install_path: '/hana/shared'
+sap_hana_install_sid: 'T01'
+sap_hana_install_number: '01'
+sap_hana_install_master_password: 'NewPass$321'
+sap_hana_install_userid: 950
+sap_hana_install_groupid: 79
+sap_hana_install_env_type: 'production'
+sap_hana_install_mem_restrict: 'y'
+sap_hana_install_max_mem: 36000
diff --git a/roles/sap_hana_install/tests/install/prepare-install-test-01.yml b/roles/sap_hana_install/tests/install/prepare-install-test-01.yml
new file mode 100644
index 0000000..fd92728
--- /dev/null
+++ b/roles/sap_hana_install/tests/install/prepare-install-test-01.yml
@@ -0,0 +1,14 @@
+---
+
+- name:
+ hosts: all
+ become: true
+ vars_files:
+ - install-vars.yml
+ gather_facts: false
+
+ tasks:
+ - name: Prepare test 01 - Remove Software extraction directory
+ ansible.builtin.file:
+ path: "{{ sap_hana_install_software_extract_directory }}"
+ state: absent
diff --git a/roles/sap_hana_install/tests/install/prepare-install-test-02.yml b/roles/sap_hana_install/tests/install/prepare-install-test-02.yml
new file mode 100644
index 0000000..eaf463d
--- /dev/null
+++ b/roles/sap_hana_install/tests/install/prepare-install-test-02.yml
@@ -0,0 +1,14 @@
+---
+
+- name:
+ hosts: all
+ become: true
+ vars_files:
+ - install-vars.yml
+ gather_facts: false
+
+ tasks:
+ - name: Prepare test 02 - Remove Software extraction directory
+ ansible.builtin.file:
+ path: "{{ sap_hana_install_software_extract_directory }}"
+ state: absent
diff --git a/roles/sap_hana_install/tests/install/prepare-install-test-03.yml b/roles/sap_hana_install/tests/install/prepare-install-test-03.yml
new file mode 100644
index 0000000..eaf463d
--- /dev/null
+++ b/roles/sap_hana_install/tests/install/prepare-install-test-03.yml
@@ -0,0 +1,14 @@
+---
+
+- name:
+ hosts: all
+ become: true
+ vars_files:
+ - install-vars.yml
+ gather_facts: false
+
+ tasks:
+ - name: Prepare test 02 - Remove Software extraction directory
+ ansible.builtin.file:
+ path: "{{ sap_hana_install_software_extract_directory }}"
+ state: absent
diff --git a/roles/sap_hana_install/tests/install/prepare-install-tests-ppc64le.yml b/roles/sap_hana_install/tests/install/prepare-install-tests-ppc64le.yml
new file mode 100644
index 0000000..4204079
--- /dev/null
+++ b/roles/sap_hana_install/tests/install/prepare-install-tests-ppc64le.yml
@@ -0,0 +1,35 @@
+---
+
+- name:
+ hosts: all
+ become: true
+ vars_files:
+ - install-vars.yml
+ vars:
+ software_host: hostname
+ software_host_user: username
+ software_host_directory: /software/hana_store
+ gather_facts: false
+
+ tasks:
+ - name: Remove '{{ sap_hana_install_software_directory }}'
+ ansible.builtin.file:
+ path: "{{ sap_hana_install_software_directory }}/"
+ state: absent
+
+ - name: Create '{{ sap_hana_install_software_directory }}'
+ ansible.builtin.file:
+ path: "{{ sap_hana_install_software_directory }}"
+ state: directory
+ owner: root
+ group: root
+ mode: '0755'
+
+ - name: Copy SAPCAR to software directory
+ ansible.builtin.shell: "scp {{ software_host_user }}@{{ software_host }}:{{ software_host_directory }}/ppc64le/SAPCAR_1115-70006238.EXE* {{ sap_hana_install_software_directory }}/"
+
+ - name: Copy HANA rev 59.01 to software directory
+ ansible.builtin.shell: "scp {{ software_host_user }}@{{ software_host }}:{{ software_host_directory }}/ppc64le/IMDB_SERVER20_059_1-80002046.SAR* {{ sap_hana_install_software_directory }}/"
+
+ - name: Copy SAP Hostagent to software directory
+ ansible.builtin.shell: "scp {{ software_host_user }}@{{ software_host }}:{{ software_host_directory }}/ppc64le/SAPHOSTAGENT55_55-80004831.SAR* {{ sap_hana_install_software_directory }}/"
diff --git a/roles/sap_hana_install/tests/install/prepare-install-tests-x86_64.yml b/roles/sap_hana_install/tests/install/prepare-install-tests-x86_64.yml
new file mode 100644
index 0000000..0e5c111
--- /dev/null
+++ b/roles/sap_hana_install/tests/install/prepare-install-tests-x86_64.yml
@@ -0,0 +1,35 @@
+---
+
+- name:
+ hosts: all
+ become: true
+ vars_files:
+ - install-vars.yml
+ vars:
+ software_host: hostname
+ software_host_user: username
+ software_host_directory: /software/hana_store
+ gather_facts: false
+
+ tasks:
+ - name: Remove '{{ sap_hana_install_software_directory }}'
+ ansible.builtin.file:
+ path: "{{ sap_hana_install_software_directory }}/"
+ state: absent
+
+ - name: Create '{{ sap_hana_install_software_directory }}'
+ ansible.builtin.file:
+ path: "{{ sap_hana_install_software_directory }}"
+ state: directory
+ owner: root
+ group: root
+ mode: '0755'
+
+ - name: Copy SAPCAR to software directory
+ ansible.builtin.shell: "scp {{ software_host_user }}@{{ software_host }}:{{ software_host_directory }}/x86_64/SAPCAR_1115-70006178.EXE* {{ sap_hana_install_software_directory }}/"
+
+ - name: Copy HANA rev 59.01 to software directory
+ ansible.builtin.shell: "scp {{ software_host_user }}@{{ software_host }}:{{ software_host_directory }}/x86_64/IMDB_SERVER20_059_1-80002031.SAR* {{ sap_hana_install_software_directory }}/"
+
+ - name: Copy SAP Hostagent to software directory
+ ansible.builtin.shell: "scp {{ software_host_user }}@{{ software_host }}:{{ software_host_directory }}/x86_64/SAPHOSTAGENT55_55-80004822.SAR* {{ sap_hana_install_software_directory }}/"
diff --git a/roles/sap_hana_install/tests/install/remove-all-firewall-ports.yml b/roles/sap_hana_install/tests/install/remove-all-firewall-ports.yml
new file mode 100644
index 0000000..7e958b5
--- /dev/null
+++ b/roles/sap_hana_install/tests/install/remove-all-firewall-ports.yml
@@ -0,0 +1,67 @@
+---
+
+- name: Remove all defined firewall ports as per field 'ports' in 'firewall-cmd --list-all'
+ hosts: all
+ become: true
+ vars_files:
+ - install-vars.yml
+ gather_facts: false
+
+ tasks:
+ - name: Get the defined current firewall ports before removal
+ shell: |
+ firewall-cmd --list-all | awk '/ ports: /{gsub (" ports: ", ""); print}'
+ register: __register_firewall_ports_current_before_removal
+
+ - name: Display the defined current firewall ports before removal
+ debug:
+ var: __register_firewall_ports_current_before_removal.stdout
+
+ - name: Remove all defined current ports in the default zone
+ shell: |
+ firewall-cmd --list-all | \
+ awk '/ ports: /{gsub (" ports: ", ""); if (length($0)!=0)print}' | \
+ awk 'BEGIN{RS=" "}{printf ("--remove-port=%s\n", $0)}' | \
+ eval $(awk 'BEGIN{printf("firewall-cmd ")}{printf ("%s ", $0)}END{print("")}')
+ register: __register_firewall_remove_ports_current
+ when: __register_firewall_ports_current_before_removal.stdout | length > 0
+
+ - name: Get the defined current firewall ports after removal
+ shell: |
+ firewall-cmd --list-all | awk '/ ports: /{gsub (" ports: ", ""); print}'
+ register: __register_firewall_ports_current_after_removal
+ when: __register_firewall_ports_current_before_removal.stdout | length > 0
+
+ - name: Display the defined current firewall ports after removal
+ debug:
+ var: __register_firewall_ports_current_after_removal.stdout
+ when: __register_firewall_ports_current_before_removal.stdout | length > 0
+
+ - name: Get the defined permanent firewall ports before removal
+ shell: |
+ firewall-cmd --list-all --permanent | awk '/ ports: /{gsub (" ports: ", ""); print}'
+ register: __register_firewall_ports_permanent_before_removal
+
+ - name: Display the defined current firewall ports before removal
+ debug:
+ var: __register_firewall_ports_permanent_before_removal.stdout
+
+ - name: Remove all defined permanent ports in the default zone
+ shell: |
+ firewall-cmd --list-all --permanent | \
+ awk '/ ports: /{gsub (" ports: ", ""); if (length($0)!=0)print}' | \
+ awk 'BEGIN{RS=" "}{printf ("--remove-port=%s\n", $0)}' | \
+ eval $(awk 'BEGIN{printf("firewall-cmd --permanent ")}{printf ("%s ", $0)}END{print("")}')
+ register: __register_firewall_remove_ports_permanent
+ when: __register_firewall_ports_permanent_before_removal.stdout | length > 0
+
+ - name: Get the defined permanent firewall ports after removal
+ shell: |
+ firewall-cmd --list-all --permanent | awk '/ ports: /{gsub (" ports: ", ""); print}'
+ register: __register_firewall_ports_permanent_after_removal
+ when: __register_firewall_ports_current_before_removal.stdout | length > 0
+
+ - name: Display the defined current firewall ports after removal
+ debug:
+ var: __register_firewall_ports_permanent_after_removal.stdout
+ when: __register_firewall_ports_current_before_removal.stdout | length > 0
diff --git a/roles/sap_hana_install/tests/install/run-install-test-01.yml b/roles/sap_hana_install/tests/install/run-install-test-01.yml
new file mode 100644
index 0000000..a5ab136
--- /dev/null
+++ b/roles/sap_hana_install/tests/install/run-install-test-01.yml
@@ -0,0 +1,11 @@
+---
+
+- name: test
+ hosts: all
+ collections:
+ - community.sap_install
+ become: true
+ vars_files:
+ - install-vars.yml
+ roles:
+ - sap_hana_install
diff --git a/roles/sap_hana_install/tests/install/run-install-test-02.yml b/roles/sap_hana_install/tests/install/run-install-test-02.yml
new file mode 100644
index 0000000..a5ab136
--- /dev/null
+++ b/roles/sap_hana_install/tests/install/run-install-test-02.yml
@@ -0,0 +1,11 @@
+---
+
+- name: test
+ hosts: all
+ collections:
+ - community.sap_install
+ become: true
+ vars_files:
+ - install-vars.yml
+ roles:
+ - sap_hana_install
diff --git a/roles/sap_hana_install/tests/install/run-install-test-03.yml b/roles/sap_hana_install/tests/install/run-install-test-03.yml
new file mode 100644
index 0000000..ad91b88
--- /dev/null
+++ b/roles/sap_hana_install/tests/install/run-install-test-03.yml
@@ -0,0 +1,13 @@
+---
+
+- name: test
+ hosts: all
+ collections:
+ - community.sap_install
+ become: true
+ vars_files:
+ - install-vars.yml
+ vars:
+ sap_hana_install_addhosts: 'node02'
+ roles:
+ - sap_hana_install
diff --git a/roles/sap_hana_install/tests/install/run-sap_hana_install-install-tests.py b/roles/sap_hana_install/tests/install/run-sap_hana_install-install-tests.py
new file mode 100755
index 0000000..fbf422e
--- /dev/null
+++ b/roles/sap_hana_install/tests/install/run-sap_hana_install-install-tests.py
@@ -0,0 +1,191 @@
+#!/usr/bin/env python
+
+import os
+import sys
+import datetime
+import subprocess
+import re
+import shlex
+import yaml
+
+
+def print_log(text):
+ sys.stdout.write(str(text))
+ __filedescriptor.write(str(text))
+
+
+# output field delimiter for displaying the results:
+__field_delimiter = '\t'
+
+if(len(sys.argv) != 3):
+ print('Please provide the name of the managed node and the user name for logging in.')
+ __managed_node = input('Name of managed node: ')
+ __username = input('User name for connecting to managed node: ')
+else:
+ __managed_node = sys.argv[1]
+ __username = sys.argv[2]
+
+__datestr = datetime.datetime.now().strftime('%Y-%m-%d_%H:%M:%S')
+__logfile_prefix = 'hana-install-test-'
+
+print('Running HANA install tests for role sap_hana_install...\n')
+print('Managed node: ' + __managed_node)
+print('Username: ' + __username)
+
+with open("install-vars.yml", 'r') as __filedescriptor:
+ __yml_data = yaml.safe_load(__filedescriptor)
+
+print(__yml_data)
+# print('sap_hana_install_sapcar_filename: ' + __yml_data.get('sap_hana_install_sapcar_filename'))
+# print('sap_hana_install_sarfiles: ' + str(__yml_data.get('sap_hana_install_sarfiles')[0]))
+# print('sap_hana_install_sarfiles: ' + str(__yml_data.get('sap_hana_install_sarfiles')[1]))
+
+# input('Press RETURN to continue: ')
+
+__mn_rhel_release = subprocess.getoutput(
+ "ssh "
+ + __username
+ + "@"
+ + __managed_node
+ + " cat /etc/redhat-release | \
+ awk 'BEGIN{FS=\"release \"}{split($2, a, \" \"); print a[1]}'")
+__mn_hw_arch = subprocess.getoutput("ssh " + __username + "@" + __managed_node + " uname -m")
+print('Managed node Red Hat release: ' + __mn_rhel_release)
+print('Managed node HW architecture: ' + __mn_hw_arch)
+
+__logdir = 'hana-install-test-logs-' + __mn_rhel_release + '_' + __mn_hw_arch + '_' + __datestr
+print('Logdir: ' + __logdir)
+if not os.path.exists(__logdir):
+ os.mkdir(__logdir)
+
+__tests = [
+ {
+ 'number': '01',
+ 'name': 'install test, rev 59.01, default parameters',
+ 'command_line_parameter': '',
+ 'expected_output_string': 'SAP HANA deployment successfully completed:',
+ 'rc': '99',
+ 'role_vars': [
+ {
+ }
+ ]
+ },
+ {
+ 'number': '02',
+ 'name': 'install test, rev 59.01, check installation, checksum and signature verification',
+ 'command_line_parameter': '',
+ 'expected_output_string': 'SAP HANA deployment successfully completed:',
+ 'rc': '99',
+ 'role_vars': [
+ {
+ 'sap_hana_install_check_installation': True,
+ 'sap_hana_install_verify_checksums': True,
+ 'sap_hana_install_verify_signature': True
+ }
+ ]
+ },
+ {
+ 'number': '03',
+ 'name': 'install test, rev 59.01, scale-out',
+ 'command_line_parameter': '',
+ 'expected_output_string': 'SAP HANA deployment successfully completed:',
+ 'rc': '99',
+ 'role_vars': [
+ {
+ }
+ ]
+ },
+]
+
+# Loop over tests:
+for par1 in __tests[0:3]:
+ print('\n' + 'Test ' + par1['number'] + ': ' + par1['name'])
+# prepare the test:
+ command = ('ansible-playbook prepare-install-test-'
+ + par1['number']
+ + '.yml '
+ + '-l '
+ + __managed_node)
+ args = shlex.split(command)
+# _py_rc = os.system(command)
+ __logfile = __logdir + '/' + __logfile_prefix + __datestr + '-prepare-' + par1['number'] + '.log'
+ with open(__logfile, 'wb') as __filedescriptor:
+ process = subprocess.Popen(args, stdout=subprocess.PIPE)
+ for line in iter(process.stdout.readline, b''):
+ sys.stdout.write(line.decode(sys.stdout.encoding))
+ __filedescriptor.write(line)
+ __filedescriptor.flush()
+
+# run the test:
+ command = ('ansible-playbook run-install-test-'
+ + par1['number']
+ + '.yml '
+ + par1['command_line_parameter']
+ + '-l '
+ + __managed_node
+ + ' '
+ + '-e "')
+# add all role vars for this test:
+ for par2 in par1['role_vars']:
+ command += str(par2)
+ command += '"'
+ print("command: " + command)
+ args = shlex.split(command)
+# _output = subprocess.getoutput(command)
+ __logfile = __logdir + '/' + __logfile_prefix + __datestr + '-run-' + par1['number'] + '.log'
+ with open(__logfile, 'wb') as __filedescriptor:
+ process = subprocess.Popen(args, stdout=subprocess.PIPE)
+ for line in iter(process.stdout.readline, b''):
+ sys.stdout.write(line.decode(sys.stdout.encoding))
+ __filedescriptor.write(line)
+ __filedescriptor.flush()
+ print('Expected output string: \'' + par1['expected_output_string'] + '\'')
+ __match = open(__logfile, 'r').read().find(par1['expected_output_string'])
+ print('__match: ' + str(__match))
+# __match = re.search(par1['expected_output_string'], _output)
+ if __match >= 0:
+ par1['rc'] = '0'
+ print('Test ' + par1['number'] + ' passed!!!')
+ else:
+ print('Test ' + par1['number'] + ' FAILED!!!')
+
+# uninstall SAP HANA:
+ command = ('ansible-playbook hana-uninstall.yml '
+ + '-l '
+ + __managed_node)
+ args = shlex.split(command)
+ __logfile = __logdir + '/' + __logfile_prefix + __datestr + '-uninstall-' + par1['number'] + '.log'
+ with open(__logfile, 'wb') as __filedescriptor:
+ process = subprocess.Popen(args, stdout=subprocess.PIPE)
+ for line in iter(process.stdout.readline, b''):
+ sys.stdout.write(line.decode(sys.stdout.encoding))
+ __filedescriptor.write(line)
+ __filedescriptor.flush()
+
+print('\n')
+
+__logfile = __logdir + '/' + __logfile_prefix + __datestr + '-result.log'
+with open(__logfile, 'w') as __filedescriptor:
+ print_log('Results for role sap_hana_install on ' + __managed_node + ' - RHEL ' + __mn_rhel_release + ' - ' + __mn_hw_arch + ':\n')
+
+ print_log('\n#'
+ + __field_delimiter
+ + 'RC' + __field_delimiter
+ + 'name' + __field_delimiter
+ + 'argument' + __field_delimiter
+ + 'expected output string' + __field_delimiter
+ + 'role_vars' + '\n')
+
+ for par1 in __tests[0:3]:
+ print_log(par1['number'] + __field_delimiter
+ + par1['rc'] + __field_delimiter
+ + par1['name'] + __field_delimiter
+ + '\'' + par1['command_line_parameter'] + '\'' + __field_delimiter
+ + '\'' + par1['expected_output_string'] + '\'' + __field_delimiter)
+# + '\'' + par1['expected_output_string'] + '\'' + __field_delimiter, end='')
+ if(len(par1['role_vars']) == 0):
+ print_log('\n')
+ else:
+ for par2 in par1['role_vars']:
+ print_log(str(par2))
+ print_log('\n')
diff --git a/roles/sap_hana_install/tests/sapcar/prepare-sapcar-tests.yml b/roles/sap_hana_install/tests/sapcar/prepare-sapcar-tests.yml
new file mode 100644
index 0000000..f396065
--- /dev/null
+++ b/roles/sap_hana_install/tests/sapcar/prepare-sapcar-tests.yml
@@ -0,0 +1,45 @@
+---
+
+- name: Prepare sapcar tests
+ hosts: all
+ become: true
+ vars_files:
+ - sapcar-vars.yml
+ gather_facts: false
+
+ tasks:
+ - name: Remove '{{ sap_hana_install_software_directory }}'
+ ansible.builtin.file:
+ path: "{{ sap_hana_install_software_directory }}/"
+ state: absent
+
+ - name: Create '{{ sap_hana_install_software_directory }}'
+ ansible.builtin.file:
+ path: "{{ sap_hana_install_software_directory }}"
+ state: directory
+ owner: root
+ group: root
+ mode: '0755'
+
+# - name: Copy '/software/hana/{{ sap_hana_install_sapcar_filename }}' to '{{ sap_hana_install_software_directory }}'
+# ansible.builtin.copy:
+# src: "/software/hana/{{ sap_hana_install_sapcar_filename }}"
+# dest: "{{ sap_hana_install_software_directory }}/"
+# owner: root
+# group: root
+# mode: '0755'
+
+ - name: Copy SAPCAR files from '/software/hana/' to '{{ sap_hana_install_software_directory }}'
+ ansible.builtin.copy:
+ src: "/software/hana/{{ item }}"
+ dest: "{{ sap_hana_install_software_directory }}/"
+ owner: root
+ group: root
+ mode: '0755'
+ loop:
+ - SAPCAR_1115-70006175.EXE
+ - SAPCAR_1115-70006177.EXE
+ - SAPCAR_1115-70006178.EXE
+ - SAPCAR_1115-70006234.EXE
+ - SAPCAR_1115-70006238.EXE
+ - SAPCAR_1211-80000935.EXE
diff --git a/roles/sap_hana_install/tests/sapcar/prepare-test-01.yml b/roles/sap_hana_install/tests/sapcar/prepare-test-01.yml
new file mode 100644
index 0000000..abdd860
--- /dev/null
+++ b/roles/sap_hana_install/tests/sapcar/prepare-test-01.yml
@@ -0,0 +1,19 @@
+---
+
+- name: Prepare test 01
+ hosts: all
+ become: true
+ vars_files:
+ - sapcar-vars.yml
+ gather_facts: false
+
+ tasks:
+ - name: Prepare test 01 - Make sure there is no checksum file
+ ansible.builtin.file:
+ path: "{{ sap_hana_install_software_directory }}/{{ sap_hana_install_sapcar_filename }}.sha256"
+ state: absent
+
+ - name: Prepare test 01 - Make sure there is no SHA256 file
+ ansible.builtin.file:
+ path: "{{ sap_hana_install_software_directory }}/SHA256"
+ state: absent
diff --git a/roles/sap_hana_install/tests/sapcar/prepare-test-02.yml b/roles/sap_hana_install/tests/sapcar/prepare-test-02.yml
new file mode 100644
index 0000000..3a04208
--- /dev/null
+++ b/roles/sap_hana_install/tests/sapcar/prepare-test-02.yml
@@ -0,0 +1,19 @@
+---
+
+- name: Prepare test 02
+ hosts: all
+ become: true
+ vars_files:
+ - sapcar-vars.yml
+ gather_facts: false
+
+ tasks:
+ - name: Prepare test 02 - Make sure there is no SHA256 file
+ ansible.builtin.file:
+ path: "{{ sap_hana_install_software_directory }}/SHA256"
+ state: absent
+
+ - name: Prepare test 02 - Create wrong checksum file
+ ansible.builtin.shell:
+ cmd: sha256sum "{{ sap_hana_install_sapcar_filename }}" | awk '{gsub ("1", "2", $1); printf ("%s %s\n", $1, $2)}' > "{{ sap_hana_install_sapcar_filename }}.sha256"
+ chdir: "{{ sap_hana_install_software_directory }}"
diff --git a/roles/sap_hana_install/tests/sapcar/prepare-test-03.yml b/roles/sap_hana_install/tests/sapcar/prepare-test-03.yml
new file mode 100644
index 0000000..7864eb5
--- /dev/null
+++ b/roles/sap_hana_install/tests/sapcar/prepare-test-03.yml
@@ -0,0 +1,19 @@
+---
+
+- name: Prepare test 03
+ hosts: all
+ become: true
+ vars_files:
+ - sapcar-vars.yml
+ gather_facts: false
+
+ tasks:
+ - name: Prepare test 03 - Make sure there is no SHA256 file
+ ansible.builtin.file:
+ path: "{{ sap_hana_install_software_directory }}/SHA256"
+ state: absent
+
+ - name: Prepare test 03 - Create correct checksum file
+ ansible.builtin.shell:
+ cmd: sha256sum "{{ sap_hana_install_sapcar_filename }}" > "{{ sap_hana_install_sapcar_filename }}.sha256"
+ chdir: "{{ sap_hana_install_software_directory }}"
diff --git a/roles/sap_hana_install/tests/sapcar/prepare-test-04.yml b/roles/sap_hana_install/tests/sapcar/prepare-test-04.yml
new file mode 100644
index 0000000..a8b9a76
--- /dev/null
+++ b/roles/sap_hana_install/tests/sapcar/prepare-test-04.yml
@@ -0,0 +1,21 @@
+---
+
+- name: Prepare test 04
+ hosts: all
+ become: true
+ vars_files:
+ - sapcar-vars.yml
+ vars:
+ sap_hana_install_global_checksum_file: "{{ sap_hana_install_software_directory }}/SHA256"
+ gather_facts: false
+
+ tasks:
+ - name: Prepare test 04 - Make sure there is no checksum file
+ ansible.builtin.file:
+ path: "{{ sap_hana_install_software_directory }}/{{ sap_hana_install_sapcar_filename }}.sha256"
+ state: absent
+
+ - name: Prepare test 04 - Create wrong checksum in global checksum file
+ ansible.builtin.shell:
+ cmd: (sha256sum /usr/bin/bash; sha256sum "{{ sap_hana_install_sapcar_filename }}" | awk '{gsub ("1", "2", $1); printf ("%s %s\n", $1, $2)}'; sha256sum /usr/bin/ls) > "{{ sap_hana_install_global_checksum_file }}"
+ chdir: "{{ sap_hana_install_software_directory }}"
diff --git a/roles/sap_hana_install/tests/sapcar/prepare-test-05.yml b/roles/sap_hana_install/tests/sapcar/prepare-test-05.yml
new file mode 100644
index 0000000..58ed193
--- /dev/null
+++ b/roles/sap_hana_install/tests/sapcar/prepare-test-05.yml
@@ -0,0 +1,21 @@
+---
+
+- name: Prepare test 05
+ hosts: all
+ become: true
+ vars_files:
+ - sapcar-vars.yml
+ vars:
+ sap_hana_install_global_checksum_file: "{{ sap_hana_install_software_directory }}/SHA256"
+ gather_facts: false
+
+ tasks:
+ - name: Prepare test 05 - Make sure there is no checksum file
+ ansible.builtin.file:
+ path: "{{ sap_hana_install_software_directory }}/{{ sap_hana_install_sapcar_filename }}.sha256"
+ state: absent
+
+ - name: Prepare test 05 - Create correct checksum in global checksum file
+ ansible.builtin.shell:
+ cmd: (sha256sum /usr/bin/bash; sha256sum "{{ sap_hana_install_sapcar_filename }}"; sha256sum /usr/bin/ls) > "{{ sap_hana_install_global_checksum_file }}"
+ chdir: "{{ sap_hana_install_software_directory }}"
diff --git a/roles/sap_hana_install/tests/sapcar/run-sap_hana_install-sapcar-tests.py b/roles/sap_hana_install/tests/sapcar/run-sap_hana_install-sapcar-tests.py
new file mode 100755
index 0000000..d9eceff
--- /dev/null
+++ b/roles/sap_hana_install/tests/sapcar/run-sap_hana_install-sapcar-tests.py
@@ -0,0 +1,186 @@
+#!/usr/bin/env python
+
+import os
+import sys
+import subprocess
+import re
+import yaml
+
+# output field delimiter for displaying the results:
+_field_delimiter = '\t'
+
+if(len(sys.argv) != 3):
+ print('Please provide the name of the managed node and the user name for logging in.')
+ _managed_node = input('Name of managed node: ')
+ _username = input('User name for connecting to managed node: ')
+else:
+ _managed_node = sys.argv[1]
+ _username = sys.argv[2]
+
+print('Running sapcar preinstall tests for role sap_hana_install...\n')
+print('Managed node: ' + _managed_node)
+print('Username: ' + _username)
+
+_mn_rhel_release = subprocess.getoutput(
+ "ssh "
+ + _username
+ + "@"
+ + _managed_node
+ + " cat /etc/redhat-release | \
+ awk 'BEGIN{FS=\"release \"}{split ($2, a, \" \"); print a[1]}'")
+print('Managed node Red Hat release: ' + _mn_rhel_release)
+_mn_hw_arch = subprocess.getoutput("ssh " + _username + "@" + _managed_node + " uname -m")
+print('Managed node HW architecture: ' + _mn_hw_arch)
+
+_vars_file = 'sapcar-vars.yml'
+with open(_vars_file, 'r') as _file:
+ _vars_1 = yaml.safe_load(_file)
+
+sap_hana_install_sapcar_filename = _vars_1.get('sap_hana_install_sapcar_filename_' + _mn_hw_arch)
+print('sap_hana_install_sapcar_filename: ' + sap_hana_install_sapcar_filename)
+
+__tests = [
+ {
+ 'number': '01',
+ 'name': 'SAPCAR checksum test, missing sha256 file',
+ 'command_line_parameter': '--tags=sap_hana_install_prepare_sapcar ',
+ 'expected_output_string': 'FAIL: Missing checksum file \'/software/sap_hana_install_test/' + sap_hana_install_sapcar_filename + '.sha256\'!',
+ 'rc': '99',
+ 'role_vars': [
+ {
+ 'sap_hana_install_verify_checksums': True,
+ 'sap_hana_install_sapcar_filename': sap_hana_install_sapcar_filename
+ }
+ ]
+ },
+ {
+ 'number': '02',
+ 'name': 'SAPCAR checksum test, sha256 file exists but checksum is not correct',
+ 'command_line_parameter': '--tags=sap_hana_install_prepare_sapcar ',
+ 'expected_output_string': ' does not match the checksum stored in file \'/software/sap_hana_install_test/'
+ + sap_hana_install_sapcar_filename
+ + '.sha256\'!',
+ 'rc': '99',
+ 'role_vars': [
+ {
+ 'sap_hana_install_verify_checksums': True,
+ 'sap_hana_install_sapcar_filename': sap_hana_install_sapcar_filename
+ }
+ ]
+ },
+ {
+ 'number': '03',
+ 'name': 'SAPCAR checksum test, sha256 file exists with correct checksum',
+ 'command_line_parameter': '--tags=sap_hana_install_prepare_sapcar ',
+ 'expected_output_string': ' matches the checksum stored in file \'/software/sap_hana_install_test/' + sap_hana_install_sapcar_filename + '.sha256\'.',
+ 'rc': '99',
+ 'role_vars': [
+ {
+ 'sap_hana_install_verify_checksums': True,
+ 'sap_hana_install_sapcar_filename': sap_hana_install_sapcar_filename
+ }
+ ]
+ },
+ {
+ 'number': '04',
+ 'name': 'SAPCAR checksum test, SHA256 file exists but checksum is not correct',
+ 'command_line_parameter': '--tags=sap_hana_install_prepare_sapcar ',
+ 'expected_output_string': ' does not match the checksum stored in file \'/software/sap_hana_install_test/SHA256\'!',
+ 'rc': '99',
+ 'role_vars': [
+ {
+ 'sap_hana_install_verify_checksums': True,
+ 'sap_hana_install_sapcar_filename': sap_hana_install_sapcar_filename,
+ 'sap_hana_install_global_checksum_file': "{{ sap_hana_install_software_directory }}/SHA256"
+ }
+ ]
+ },
+ {
+ 'number': '05',
+ 'name': 'SAPCAR checksum test, SHA256 file exists with correct checksum',
+ 'command_line_parameter': '--tags=sap_hana_install_prepare_sapcar ',
+ 'expected_output_string': ' matches the checksum stored in file \'/software/sap_hana_install_test/SHA256\'.',
+ 'rc': '99',
+ 'role_vars': [
+ {
+ 'sap_hana_install_verify_checksums': True,
+ 'sap_hana_install_sapcar_filename': sap_hana_install_sapcar_filename,
+ 'sap_hana_install_global_checksum_file': "{{ sap_hana_install_software_directory }}/SHA256"
+ }
+ ]
+ },
+]
+
+command = ('ansible-playbook prepare-sapcar-tests.yml '
+ + '-l '
+ + _managed_node)
+_py_rc = os.system(command)
+
+for par1 in __tests[0:5]:
+ print('\n' + 'Test ' + par1['number'] + ': ' + par1['name'])
+ command = ('ansible-playbook prepare-test-'
+ + par1['number']
+ + '.yml '
+ + '-l '
+ + _managed_node
+ + ' -e "'
+ + '{ sap_hana_install_sapcar_filename: '
+ + sap_hana_install_sapcar_filename
+ + ' }"')
+ print('command: >' + command + '<')
+ _py_rc = os.system(command)
+ command = ('ansible-playbook run-sapcar-test.yml '
+ + par1['command_line_parameter']
+ + '-l '
+ + _managed_node
+ + ' -e "')
+ for par2 in par1['role_vars']:
+ command += str(par2)
+ command += '"'
+ print("command: >" + command + '<')
+# _py_rc = os.system(command)
+# _py_rc = os.popen(command).read()
+# _output = subprocess.check_output(command, stderr=subprocess.STDOUT, shell=True)
+ _output = subprocess.getoutput(command)
+ print('Output of test: ' + _output)
+ _match = re.search(par1['expected_output_string'], _output)
+ if _match:
+ par1['rc'] = '0'
+ print('Test ' + par1['number'] + ' passed!!!')
+# par1['rc'] = str(int(_py_rc/256))
+# if(_py_rc != 0):
+# if par1['ignore_error_final']:
+# print('Test ' + par1['number'] + ' finished with return code ' + par1['rc'] + '. Continuing with the next test')
+# else:
+# print('Test ' + par1['number'] + ' finished with return code ' + par1['rc'] + '.')
+# exit(_py_rc)
+# else:
+# print('Test ' + par1['number'] + ' finished with return code ' + par1['rc'] + '.')
+
+print('\nResults for role sap_hana_install preinstall: '
+ + _managed_node
+ + ' - RHEL '
+ + _mn_rhel_release
+ + ' - '
+ + _mn_hw_arch
+ + ':')
+
+print('\n#'
+ + _field_delimiter
+ + 'RC' + _field_delimiter
+ + 'name' + _field_delimiter
+ + 'argument' + _field_delimiter
+ + 'expected error string' + _field_delimiter
+ + 'role_vars')
+
+for par1 in __tests[0:5]:
+ print(par1['number'] + _field_delimiter
+ + par1['rc'] + _field_delimiter
+ + par1['name'] + _field_delimiter
+ + '\'' + par1['command_line_parameter'] + '\'' + _field_delimiter
+ + '\'' + par1['expected_output_string'] + '\'' + _field_delimiter, end='')
+ if (len(par1['role_vars']) == 0):
+ print("")
+ else:
+ for par2 in par1['role_vars']:
+ print(str(par2))
diff --git a/roles/sap_hana_install/tests/sapcar/run-sapcar-test.yml b/roles/sap_hana_install/tests/sapcar/run-sapcar-test.yml
new file mode 100644
index 0000000..8bc6b98
--- /dev/null
+++ b/roles/sap_hana_install/tests/sapcar/run-sapcar-test.yml
@@ -0,0 +1,11 @@
+---
+
+- name: test
+ hosts: all
+ collections:
+ - community.sap_install
+ become: true
+ vars_files:
+ - sapcar-vars.yml
+ roles:
+ - sap_hana_install
diff --git a/roles/sap_hana_install/tests/sapcar/sapcar-vars.yml b/roles/sap_hana_install/tests/sapcar/sapcar-vars.yml
new file mode 100644
index 0000000..0b904f6
--- /dev/null
+++ b/roles/sap_hana_install/tests/sapcar/sapcar-vars.yml
@@ -0,0 +1,10 @@
+---
+
+sap_hana_install_sid: T01
+sap_hana_install_number: 01
+sap_hana_install_software_directory: '/software/sap_hana_install_test'
+sap_hana_install_checksum_algorithm: sha256
+# sap_hana_install_sapcar_filename_ppc64: SAPCAR_1115-70006175.EXE # ppc64
+sap_hana_install_sapcar_filename_ppc64le: SAPCAR_1115-70006238.EXE # ppc64le
+# sap_hana_install_sapcar_filename: SAPCAR_1211-80000935.EXE # x86_64, rel 721, patch 1211
+sap_hana_install_sapcar_filename_x86_64: SAPCAR_1115-70006178.EXE # x86_64, rel 722, patch 1115
diff --git a/roles/sap_hana_preconfigure/tests/.pylintrc b/roles/sap_hana_preconfigure/tests/.pylintrc
new file mode 120000
index 0000000..0d402e7
--- /dev/null
+++ b/roles/sap_hana_preconfigure/tests/.pylintrc
@@ -0,0 +1 @@
+../../../.pylintrc
\ No newline at end of file
diff --git a/roles/sap_hana_preconfigure/tests/beautify-assert-output.sh b/roles/sap_hana_preconfigure/tests/beautify-assert-output.sh
new file mode 120000
index 0000000..9a2e976
--- /dev/null
+++ b/roles/sap_hana_preconfigure/tests/beautify-assert-output.sh
@@ -0,0 +1 @@
+../tools/beautify-assert-output.sh
\ No newline at end of file
diff --git a/roles/sap_hana_preconfigure/tests/run-sap_hana_preconfigure-tests.py b/roles/sap_hana_preconfigure/tests/run-sap_hana_preconfigure-tests.py
new file mode 100755
index 0000000..08bc7f5
--- /dev/null
+++ b/roles/sap_hana_preconfigure/tests/run-sap_hana_preconfigure-tests.py
@@ -0,0 +1,242 @@
+#!/usr/bin/env python
+
+"""
+Tests for role sap_hana_preconfigure
+"""
+
+import os
+import sys
+import subprocess
+
+# output field delimiter for displaying the results:
+FIELD_DELIMITER = '\t'
+
+if len(sys.argv) == 1:
+ _managed_node = input("Provide name of managed node: ")
+else:
+ _managed_node = sys.argv[1]
+
+print('Running tests for role sap_hana_preconfigure...\n')
+print('Managed node: ' + _managed_node)
+
+_mn_rhel_release = subprocess.getoutput(
+ "ssh root@"
+ + _managed_node
+ + " cat /etc/redhat-release | \
+ awk 'BEGIN{FS=\"release \"}{split($2, a, \" \"); print a[1]}'")
+print('Managed node Red Hat release: ' + _mn_rhel_release)
+_mn_hw_arch = subprocess.getoutput("ssh root@" + _managed_node + " uname -m")
+print('Managed node HW architecture: ' + _mn_hw_arch)
+
+__tests = [
+ {
+ 'number': '1',
+ 'name': 'Run in check mode on new system.',
+ 'command_line_parameter': '--check ',
+ 'ignore_error_final': True,
+ 'compact_assert_output': False,
+ 'rc': '99',
+ 'role_vars': []
+ },
+ {
+ 'number': '2',
+ 'name': 'Run in assert mode on new system, \
+ ignore assert errors.',
+ 'command_line_parameter': '',
+ 'ignore_error_final': False,
+ 'compact_assert_output': False,
+ 'rc': '99',
+ 'role_vars': [
+ {
+ 'sap_hana_preconfigure_assert': True,
+ 'sap_hana_preconfigure_assert_ignore_errors': True,
+ }
+ ]
+ },
+ {
+ 'number': '3',
+ 'name': 'Run in normal mode on new system, \
+ check for possible RHEL update, \
+ allow a reboot.',
+ 'command_line_parameter': '',
+ 'ignore_error_final': False,
+ 'compact_assert_output': False,
+ 'rc': '99',
+ 'role_vars': [
+ {
+ 'sap_hana_preconfigure_update': True,
+ 'sap_hana_preconfigure_reboot_ok': True,
+ }
+ ]
+ },
+ {
+ 'number': '4',
+ 'name': 'Idempotency check: Run in normal mode again, \
+ check for possible RHEL update, \
+ allow a reboot.',
+ 'command_line_parameter': '',
+ 'ignore_error_final': False,
+ 'compact_assert_output': False,
+ 'rc': '99',
+ 'role_vars': [
+ {
+ 'sap_hana_preconfigure_update': True,
+ 'sap_hana_preconfigure_reboot_ok': True,
+ }
+ ]
+ },
+ {
+ 'number': '5',
+ 'name': 'Run in assert mode on modified system, \
+ check for possible RHEL update, \
+ ignore any assert error.',
+ 'command_line_parameter': '',
+ 'ignore_error_final': False,
+ 'compact_assert_output': True,
+ 'rc': '99',
+ 'role_vars': [
+ {
+ 'sap_hana_preconfigure_assert': True,
+ 'sap_hana_preconfigure_assert_ignore_errors': True,
+ 'sap_hana_preconfigure_update': True,
+ }
+ ]
+ },
+ {
+ 'number': '6',
+ 'name': 'Run in normal mode, \
+ do not use tuned, \
+ allow a reboot.',
+ 'command_line_parameter': '',
+ 'ignore_error_final': False,
+ 'compact_assert_output': False,
+ 'rc': '99',
+ 'role_vars': [
+ {
+ 'sap_hana_preconfigure_use_tuned': False,
+ 'sap_hana_preconfigure_reboot_ok': True,
+ }
+ ]
+ },
+ {
+ 'number': '7',
+ 'name': 'Run in normal mode, \
+ use tuned and also modify boot command line, \
+ allow a reboot.',
+ 'command_line_parameter': '',
+ 'ignore_error_final': False,
+ 'compact_assert_output': False,
+ 'rc': '99',
+ 'role_vars': [
+ {
+ 'sap_hana_preconfigure_use_tuned': True,
+ 'sap_hana_preconfigure_modify_grub_cmdline_linux': True,
+ 'sap_hana_preconfigure_reboot_ok': True,
+ }
+ ]
+ },
+ {
+ 'number': '8',
+ 'name': 'Idempotency check: Run in normal mode again, \
+ use tuned and also modify boot command line, \
+ allow a reboot.',
+ 'command_line_parameter': '',
+ 'ignore_error_final': False,
+ 'compact_assert_output': False,
+ 'rc': '99',
+ 'role_vars': [
+ {
+ 'sap_hana_preconfigure_use_tuned': True,
+ 'sap_hana_preconfigure_modify_grub_cmdline_linux': True,
+ 'sap_hana_preconfigure_reboot_ok': True,
+ }
+ ]
+ },
+ {
+ 'number': '9',
+ 'name': 'Run in assert mode, \
+ check for possible RHEL update, \
+ check all config, \
+ compact output, \
+ ignore any assert error.',
+ 'command_line_parameter': '',
+ 'ignore_error_final': True,
+ 'compact_assert_output': True,
+ 'rc': '99',
+ 'role_vars': [
+ {
+ 'sap_hana_preconfigure_assert': True,
+ 'sap_hana_preconfigure_assert_all_config': True,
+ 'sap_hana_preconfigure_assert_ignore_errors': True,
+ }
+ ]
+ },
+ {
+ 'number': '10',
+ 'name': 'Run in check mode on modified system.',
+ 'command_line_parameter': '--check ',
+ 'ignore_error_final': False,
+ 'compact_assert_output': False,
+ 'rc': '99',
+ 'role_vars': []
+ }
+]
+
+for par1 in __tests:
+ print('\n' + 'Test ' + par1['number'] + ': ' + par1['name'])
+ command = ('ansible-playbook sap_hana_preconfigure-default-settings.yml '
+ + par1['command_line_parameter']
+ + '-l '
+ + _managed_node
+ + ' '
+ + '-e "')
+ for par2 in par1['role_vars']:
+ command += str(par2)
+ command += '"'
+ if par1['compact_assert_output']:
+ command += ' | ./beautify-assert-output.sh'
+ print("command: " + command)
+ _py_rc = os.system(command)
+ par1['rc'] = str(int(_py_rc / 256))
+ if _py_rc != 0:
+ if par1['ignore_error_final']:
+ print('Test '
+ + par1['number']
+ + ' finished with return code '
+ + par1['rc']
+ + '. Continuing with the next test')
+ else:
+ print('Test '
+ + par1['number']
+ + ' finished with return code '
+ + par1['rc'] + '.')
+ sys.exit(_py_rc)
+ else:
+ print('Test ' + par1['number'] + ' finished with return code ' + par1['rc'] + '.')
+
+print('\nResults for role sap_hana_preconfigure: '
+ + _managed_node
+ + ' - RHEL '
+ + _mn_rhel_release
+ + ' - '
+ + _mn_hw_arch + ':')
+
+print('\n#'
+ + FIELD_DELIMITER
+ + 'RC' + FIELD_DELIMITER
+ + 'name' + FIELD_DELIMITER
+ + 'argument' + FIELD_DELIMITER
+ + 'compact' + FIELD_DELIMITER
+ + 'role_vars')
+
+for par1 in __tests:
+ print(par1['number'] + FIELD_DELIMITER
+ + par1['rc'] + FIELD_DELIMITER
+ + par1['name'] + FIELD_DELIMITER
+ + par1['command_line_parameter'] + FIELD_DELIMITER
+ + str(par1['compact_assert_output']) + FIELD_DELIMITER, end='')
+ if len(par1['role_vars']) == 0:
+ print("")
+ else:
+ for par2 in par1['role_vars']:
+ print(str(par2))
diff --git a/roles/sap_hana_preconfigure/tests/sap_hana_preconfigure-default-settings.yml b/roles/sap_hana_preconfigure/tests/sap_hana_preconfigure-default-settings.yml
new file mode 100644
index 0000000..561b391
--- /dev/null
+++ b/roles/sap_hana_preconfigure/tests/sap_hana_preconfigure-default-settings.yml
@@ -0,0 +1,6 @@
+---
+- hosts: all
+ collections:
+ - community.sap_install
+ roles:
+ - sap_hana_preconfigure
diff --git a/roles/sap_netweaver_preconfigure/tests/.pylintrc b/roles/sap_netweaver_preconfigure/tests/.pylintrc
new file mode 120000
index 0000000..0d402e7
--- /dev/null
+++ b/roles/sap_netweaver_preconfigure/tests/.pylintrc
@@ -0,0 +1 @@
+../../../.pylintrc
\ No newline at end of file
diff --git a/roles/sap_netweaver_preconfigure/tests/beautify-assert-output.sh b/roles/sap_netweaver_preconfigure/tests/beautify-assert-output.sh
new file mode 120000
index 0000000..9a2e976
--- /dev/null
+++ b/roles/sap_netweaver_preconfigure/tests/beautify-assert-output.sh
@@ -0,0 +1 @@
+../tools/beautify-assert-output.sh
\ No newline at end of file
diff --git a/roles/sap_netweaver_preconfigure/tests/run-sap_netweaver_preconfigure-tests.py b/roles/sap_netweaver_preconfigure/tests/run-sap_netweaver_preconfigure-tests.py
new file mode 100755
index 0000000..30cc250
--- /dev/null
+++ b/roles/sap_netweaver_preconfigure/tests/run-sap_netweaver_preconfigure-tests.py
@@ -0,0 +1,153 @@
+#!/usr/bin/env python
+
+"""
+Tests for role sap_netweaver_preconfigure
+"""
+
+import os
+import sys
+import subprocess
+
+# output field delimiter for displaying the results:
+FIELD_DELIMITER = '\t'
+
+if len(sys.argv) == 1:
+ _managed_node = input("Provide name of managed node: ")
+else:
+ _managed_node = sys.argv[1]
+
+print('Running tests for role sap_netweaver_preconfigure...\n')
+print('Managed node: ' + _managed_node)
+
+_mn_rhel_release = subprocess.getoutput(
+ "ssh root@"
+ + _managed_node
+ + " cat /etc/redhat-release | \
+ awk 'BEGIN{FS=\"release \"}{split($2, a, \" \"); print a[1]}'")
+print('Managed node Red Hat release: ' + _mn_rhel_release)
+_mn_hw_arch = subprocess.getoutput("ssh root@" + _managed_node + " uname -m")
+print('Managed node HW architecture: ' + _mn_hw_arch)
+
+__tests = [
+ {
+ 'number': '1',
+ 'name': 'Run in check mode on new system.',
+ 'command_line_parameter': '--check ',
+ 'ignore_error_final': True,
+ 'compact_assert_output': False,
+ 'rc': '99',
+ 'role_vars': []
+ },
+ {
+ 'number': '2',
+ 'name': 'Run in assert mode on new system, \
+ ignore assert errors.',
+ 'command_line_parameter': '',
+ 'ignore_error_final': True,
+ 'compact_assert_output': False,
+ 'rc': '99',
+ 'role_vars': [
+ {
+ 'sap_netweaver_preconfigure_assert': True,
+ 'sap_netweaver_preconfigure_assert_ignore_errors': True,
+ }
+ ]
+ },
+ {
+ 'number': '3',
+ 'name': 'Run in normal mode on new system. \
+ Do not fail in case not enough swap space is configured.',
+ 'command_line_parameter': '',
+ 'ignore_error_final': False,
+ 'compact_assert_output': False,
+ 'rc': '99',
+ 'role_vars': [
+ {
+ 'sap_netweaver_preconfigure_fail_if_not_enough_swap_space_configured': False,
+ }
+ ]
+ },
+ {
+ 'number': '4',
+ 'name': 'Run in assert mode on modified system, \
+ compact output, \
+ ignore any assert error.',
+ 'command_line_parameter': '',
+ 'ignore_error_final': True,
+ 'compact_assert_output': True,
+ 'rc': '99',
+ 'role_vars': [
+ {
+ 'sap_netweaver_preconfigure_assert': True,
+ 'sap_netweaver_preconfigure_assert_ignore_errors': True,
+ }
+ ]
+ },
+ {
+ 'number': '5',
+ 'name': 'Run in check mode on configured system. Ignore a final error.',
+ 'command_line_parameter': '--check ',
+ 'ignore_error_final': True,
+ 'compact_assert_output': False,
+ 'rc': '99',
+ 'role_vars': []
+ },
+]
+
+for par1 in __tests:
+ print('\n' + 'Test ' + par1['number'] + ': ' + par1['name'])
+ command = ('ansible-playbook sap_netweaver_preconfigure-default-settings.yml '
+ + par1['command_line_parameter']
+ + '-l '
+ + _managed_node
+ + ' '
+ + '-e "')
+ for par2 in par1['role_vars']:
+ command += str(par2)
+ command += '"'
+ if par1['compact_assert_output']:
+ command += ' | ./beautify-assert-output.sh'
+ print("command: " + command)
+ _py_rc = os.system(command)
+ par1['rc'] = str(int(_py_rc / 256))
+ if _py_rc != 0:
+ if par1['ignore_error_final']:
+ print('Test '
+ + par1['number']
+ + ' finished with return code '
+ + par1['rc']
+ + '. Continuing with the next test')
+ else:
+ print('Test '
+ + par1['number']
+ + ' finished with return code '
+ + par1['rc'] + '.')
+ sys.exit(_py_rc)
+ else:
+ print('Test ' + par1['number'] + ' finished with return code ' + par1['rc'] + '.')
+
+print('\nResults for role sap_netweaver_preconfigure: '
+ + _managed_node
+ + ' - RHEL '
+ + _mn_rhel_release
+ + ' - ' + _mn_hw_arch + ':')
+
+print('\n#'
+ + FIELD_DELIMITER
+ + 'RC' + FIELD_DELIMITER
+ + 'name' + FIELD_DELIMITER
+ + 'argument' + FIELD_DELIMITER
+ + 'compact' + FIELD_DELIMITER
+ + 'role_vars')
+
+for par1 in __tests:
+ print(par1['number'] + FIELD_DELIMITER
+ + par1['rc'] + FIELD_DELIMITER
+ + par1['name'] + FIELD_DELIMITER
+ + par1['command_line_parameter'] + FIELD_DELIMITER
+ + str(par1['compact_assert_output']) + FIELD_DELIMITER, end='')
+ if len(par1['role_vars']) == 0:
+ print("")
+ else:
+ for par2 in par1['role_vars']:
+ print(str(par2))
diff --git a/roles/sap_netweaver_preconfigure/tests/sap_netweaver_preconfigure-default-settings.yml b/roles/sap_netweaver_preconfigure/tests/sap_netweaver_preconfigure-default-settings.yml
new file mode 100644
index 0000000..e9e772a
--- /dev/null
+++ b/roles/sap_netweaver_preconfigure/tests/sap_netweaver_preconfigure-default-settings.yml
@@ -0,0 +1,6 @@
+---
+- hosts: all
+ collections:
+ - community.sap_install
+ roles:
+ - sap_netweaver_preconfigure