83 lines
3.6 KiB
Python
83 lines
3.6 KiB
Python
#!/usr/bin/env python3
|
|
"""Check reorganized menu routes, including conditional hardware entries."""
|
|
from pathlib import Path
|
|
import os
|
|
import re
|
|
import subprocess
|
|
import unittest
|
|
|
|
ROOT = Path(__file__).resolve().parents[1]
|
|
SOURCE = (ROOT / 'proxmenu-scripts.sh').read_text()
|
|
|
|
|
|
def function(name):
|
|
return name + '() {' + SOURCE.split(name + '() {', 1)[1].split('\n}\n', 1)[0] + '\n}\n'
|
|
|
|
|
|
class MenuLayoutTests(unittest.TestCase):
|
|
def menu(self, name, selection, dell=False):
|
|
# Real menu functions, mocked host inspection and terminal selection.
|
|
script = '''
|
|
TAPM_POST_PROXMENUX_DETECTED() { return 1; }
|
|
TAPM_PULSE_RESOURCE_INSTALLED_FROM_CONFIGS() { return 0; }
|
|
TAPM_PACKAGE_INSTALLED() { return 0; }
|
|
TAPM_OMSA_SUPPORTED_HARDWARE() { [[ "$TEST_DELL" == yes ]]; }
|
|
TAPM_HA_NODE_IN_MAINTENANCE() { return 1; }
|
|
systemctl() { return 0; }
|
|
dpkg-query() { printf 'install ok installed'; }
|
|
glances() { :; }
|
|
SELECT_MENU() {
|
|
local -n actual_labels="$2" actual_values="$3"
|
|
[[ ${#actual_labels[@]} == ${#actual_values[@]} ]] || exit 40
|
|
if [[ ${TEST_VISITED:-0} == 1 ]]; then MENU_SELECTION=back; return; fi
|
|
TEST_VISITED=1
|
|
printf 'TITLE:%s\\n' "$1"
|
|
for i in "${!actual_values[@]}"; do
|
|
printf 'ROW:%s:%s\\n' "${actual_values[$i]}" "${actual_labels[$i]}"
|
|
done
|
|
MENU_SELECTION="$TEST_SELECTION"
|
|
}
|
|
'''
|
|
for action in ['SERVICE_RECOVERY_MENU', 'TAPM_HOST_CONFIGURATION_MENU', 'INSTALL_GLANCES',
|
|
'INSTALL_OMSA', 'TAPM_NOTIFICATIONS_MENU', 'DETECT_CPU', 'INSTALL_KEEPALIVE',
|
|
'VIRTIO_MENU', 'TAPM_POST_VZDUMP_MENU', 'TAPM_ORPHAN_DISK_REPORT']:
|
|
script += action + '() { printf "ACTION:' + action + '\\n"; }\n'
|
|
script += function(name) + '\n' + name
|
|
result = subprocess.run(['bash', '-c', script], capture_output=True, text=True,
|
|
env=dict(os.environ, TEST_SELECTION=selection, TEST_DELL='yes' if dell else 'no'))
|
|
self.assertEqual(result.returncode, 0, result.stderr)
|
|
rows = dict(re.findall(r'^ROW:([^:]+):(.*)$', result.stdout, re.M))
|
|
return rows, result.stdout
|
|
|
|
def test_local_service_recovery_is_under_host_configuration(self):
|
|
rows, output = self.menu('HOST_SETUP_MENU', 'services')
|
|
self.assertEqual(set(rows), {'post_install', 'services'})
|
|
self.assertIn('ACTION:SERVICE_RECOVERY_MENU', output)
|
|
|
|
def test_cluster_cpu_action_moved_with_its_dispatch(self):
|
|
rows, output = self.menu('CLUSTER_MENU', 'cpu')
|
|
self.assertEqual(set(rows), {'maintenance', 'cpu', 'keepalived'})
|
|
self.assertIn('ACTION:DETECT_CPU', output)
|
|
|
|
def test_storage_routes_keep_iso_scan_deferred(self):
|
|
for choice, action in [('virtio', 'VIRTIO_MENU'), ('vzdump', 'TAPM_POST_VZDUMP_MENU'),
|
|
('orphan_disks', 'TAPM_ORPHAN_DISK_REPORT')]:
|
|
rows, output = self.menu('STORAGE_MENU', choice)
|
|
self.assertEqual(set(rows), {'iso_nfs', 'virtio', 'orphan_disks', 'vzdump'})
|
|
self.assertIn('ACTION:' + action, output)
|
|
self.assertEqual(output.count('ACTION:'), 1)
|
|
|
|
def test_notifications_and_glances_with_optional_dell_entry(self):
|
|
for dell in [False, True]:
|
|
rows, output = self.menu('MONITORING_MENU', 'notifications', dell)
|
|
self.assertEqual('omsa' in rows, dell)
|
|
self.assertIn('glances', rows)
|
|
self.assertIn('ACTION:TAPM_NOTIFICATIONS_MENU', output)
|
|
rows, output = self.menu('MONITORING_MENU', 'glances', dell)
|
|
self.assertIn('ACTION:INSTALL_GLANCES', output)
|
|
self.assertTrue(rows['glances'].startswith('Install '))
|
|
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main()
|