From 182fb994b425f13a7cce39f4dae2f8e9944924ca Mon Sep 17 00:00:00 2001 From: Jack Harper Date: Tue, 9 Dec 2025 17:56:56 +0000 Subject: [PATCH 1/4] remove jdk install in favour of using ansible --- .../ibex_install_utils/install_tasks.py | 3 -- .../software_dependency/java.py | 22 ---------- .../ibex_install_utils/tasks/system_tasks.py | 31 -------------- .../tests/test_version_check.py | 40 ------------------- 4 files changed, 96 deletions(-) delete mode 100644 installation_and_upgrade/ibex_install_utils/software_dependency/java.py diff --git a/installation_and_upgrade/ibex_install_utils/install_tasks.py b/installation_and_upgrade/ibex_install_utils/install_tasks.py index 29942316..bb7fb1cd 100644 --- a/installation_and_upgrade/ibex_install_utils/install_tasks.py +++ b/installation_and_upgrade/ibex_install_utils/install_tasks.py @@ -168,7 +168,6 @@ def run_instrument_install(self) -> None: self._system_tasks.check_resources() self._system_tasks.install_or_upgrade_git() - self._system_tasks.check_java_installation() self._system_tasks.restrict_ie() @@ -231,7 +230,6 @@ def run_instrument_deploy_main(self) -> None: Current the server can not be started or stopped in this python script. """ self._system_tasks.install_or_upgrade_git() - self._system_tasks.check_java_installation() self._git_tasks.show_git_status() self._backup_tasks.backup_old_directories() self._backup_tasks.backup_checker() @@ -295,7 +293,6 @@ def run_update_journal_parser(self) -> None: def run_developer_update(self) -> None: """Update all the developer tools to latest version""" self._mysql_tasks.install_mysql(force=False) - self._system_tasks.check_java_installation() self._system_tasks.install_or_upgrade_git() self._system_tasks.update_kafka_topics() self._system_tasks.create_virtual_envs() diff --git a/installation_and_upgrade/ibex_install_utils/software_dependency/java.py b/installation_and_upgrade/ibex_install_utils/software_dependency/java.py deleted file mode 100644 index 4f8341ec..00000000 --- a/installation_and_upgrade/ibex_install_utils/software_dependency/java.py +++ /dev/null @@ -1,22 +0,0 @@ -import re -import subprocess - -from ibex_install_utils.file_utils import get_msi_property -from ibex_install_utils.software_dependency import SoftwareDependency -from ibex_install_utils.version_check import VERSION_REGEX, get_major_minor_patch - - -class Java(SoftwareDependency): - def get_name(self) -> str: - return "Java" - - def get_installed_version(self) -> str: - version_output = subprocess.check_output("java --version").decode() - installed_version = re.search(VERSION_REGEX, version_output).group(1) - return get_major_minor_patch(installed_version) - - def get_file_pattern(self) -> str: - return r"^OpenJDK.*?([0-9.]*)_?[0-9]*.msi" - - def get_version_of(self, path: str) -> str: - return get_msi_property(path, "ProductVersion") diff --git a/installation_and_upgrade/ibex_install_utils/tasks/system_tasks.py b/installation_and_upgrade/ibex_install_utils/tasks/system_tasks.py index 26952231..e80599c8 100644 --- a/installation_and_upgrade/ibex_install_utils/tasks/system_tasks.py +++ b/installation_and_upgrade/ibex_install_utils/tasks/system_tasks.py @@ -14,7 +14,6 @@ from ibex_install_utils.kafka_utils import add_required_topics from ibex_install_utils.run_process import RunProcess from ibex_install_utils.software_dependency.git import Git -from ibex_install_utils.software_dependency.java import Java from ibex_install_utils.task import task from ibex_install_utils.tasks import BaseTasks from ibex_install_utils.tasks.common_paths import APPS_BASE_DIR, EPICS_PATH, UV, VAR_DIR @@ -82,36 +81,6 @@ def clean_up_desktop_ibex_training_folder(self) -> None: """ self._file_utils.remove_tree(DESKTOP_TRAINING_FOLDER_PATH, self.prompt) - @version_check(Java()) - @task("Install java") - def check_java_installation(self) -> None: - """ - Checks Java installation - """ - installer, _ = Java().find_latest() - - if os.path.exists(installer): - print(f"running installer at {installer}") - subprocess.call( - f"msiexec /i {installer} " - "ADDLOCAL=FeatureMain,FeatureEnvironment,FeatureJarFileRunWith,FeatureJavaHome " - 'INSTALLDIR="c:\\Program Files\\Eclipse Adoptium\\" /quiet' - ) - self.prompt.prompt_and_raise_if_not_yes( - "Make sure java installed correctly.\r\n" - "After following the installer, ensure you close and then re-open" - " your remote desktop session (This " - "is a workaround for windows not immediately picking up new environment variables)" - ) - else: - self.prompt.prompt_and_raise_if_not_yes( - "Upgrade openJDK installation by following:\r\n" - "https://github.com/ISISComputingGroup/ibex_developers_manual/wiki/Upgrade-Java\r\n\r\n" - "After following the installer, ensure you close and then re-open" - " your remote desktop session (This " - "is a workaround for windows not immediately picking up new environment variables)" - ) - @task("Configure COM ports") def configure_com_ports(self) -> None: """ diff --git a/installation_and_upgrade/ibex_install_utils/tests/test_version_check.py b/installation_and_upgrade/ibex_install_utils/tests/test_version_check.py index f1ce7338..44c600cd 100644 --- a/installation_and_upgrade/ibex_install_utils/tests/test_version_check.py +++ b/installation_and_upgrade/ibex_install_utils/tests/test_version_check.py @@ -4,7 +4,6 @@ import pytest from ibex_install_utils.software_dependency import is_higher from ibex_install_utils.software_dependency.git import Git -from ibex_install_utils.software_dependency.java import Java from ibex_install_utils.version_check import * @@ -16,14 +15,6 @@ def get_version_from_name(name): version = re.search(r"([0-9]+\.[0-9]+(\.[0-9]+)+)", basename).group(1) return version - -MOCK_JAVA_INSTALLERS = [ - "OpenJDK_17.0.4.3_1.msi", # latest - "OpenJDK_17.0.1_1.msi", - "OpenJDK_17.0.4_1.msi", - "OpenJDK_16.0.4.6_1.msi", -] - MOCK_GIT_INSTALLERS = [ "Git-2.3.0-1.exe", "Git-2.3.2-1-bit.exe", # latest @@ -54,37 +45,6 @@ def test_get_major_minor_patch(self): with pytest.raises(AttributeError): get_major_minor_patch("java 17.2.4") - def test_GIVEN_java_latest_WHEN_version_checked_THEN_decorated_function_not_called(self): - javaMock = Java() - - javaMock.get_installed_version = Mock(return_value="17.0.4") - javaMock.get_version_of = Mock(side_effect=get_version_from_name) - javaMock.find_available = Mock(return_value=MOCK_JAVA_INSTALLERS) - - inner_function = Mock() - - @version_check(javaMock) - def function(_): - inner_function() - - function(self) - inner_function.assert_not_called() - - def test_GIVEN_java_old_WHEN_version_checked_THEN_decorated_function_called(self): - javaMock = Java() - - javaMock.get_installed_version = Mock(return_value="17.0.0") - javaMock.get_version_of = Mock(side_effect=get_version_from_name) - javaMock.find_available = Mock(return_value=MOCK_JAVA_INSTALLERS) - - functionMock = Mock() - - @version_check(javaMock) - def function(_): - functionMock() - - function(self) - functionMock.assert_called_once() def test_GIVEN_git_latest_WHEN_version_checked_THEN_decorated_function_not_called(self): gitMock = Git() From 457519067736add3e4b5bf1ab350e53e7c19ad33 Mon Sep 17 00:00:00 2001 From: Jack Harper Date: Tue, 9 Dec 2025 19:57:56 +0000 Subject: [PATCH 2/4] ruff --- .../ibex_install_utils/tasks/system_tasks.py | 1 - .../tests/test_version_check.py | 41 ++++++++++--------- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/installation_and_upgrade/ibex_install_utils/tasks/system_tasks.py b/installation_and_upgrade/ibex_install_utils/tasks/system_tasks.py index e80599c8..bc80e4b7 100644 --- a/installation_and_upgrade/ibex_install_utils/tasks/system_tasks.py +++ b/installation_and_upgrade/ibex_install_utils/tasks/system_tasks.py @@ -1,7 +1,6 @@ import glob import os import shutil -import subprocess import tempfile import time from pathlib import Path diff --git a/installation_and_upgrade/ibex_install_utils/tests/test_version_check.py b/installation_and_upgrade/ibex_install_utils/tests/test_version_check.py index 44c600cd..36cc95c0 100644 --- a/installation_and_upgrade/ibex_install_utils/tests/test_version_check.py +++ b/installation_and_upgrade/ibex_install_utils/tests/test_version_check.py @@ -1,10 +1,11 @@ import os +import re from unittest.mock import Mock import pytest from ibex_install_utils.software_dependency import is_higher from ibex_install_utils.software_dependency.git import Git -from ibex_install_utils.version_check import * +from ibex_install_utils.version_check import get_major_minor_patch, version_check def get_version_from_name(name): @@ -15,6 +16,7 @@ def get_version_from_name(name): version = re.search(r"([0-9]+\.[0-9]+(\.[0-9]+)+)", basename).group(1) return version + MOCK_GIT_INSTALLERS = [ "Git-2.3.0-1.exe", "Git-2.3.2-1-bit.exe", # latest @@ -24,8 +26,8 @@ def get_version_from_name(name): class TestVersionCheck: def test_is_higher(self): - assert is_higher("17.0", "17.0.1") == True - assert is_higher("17.0.6", "17.0.1") == False + assert is_higher("17.0", "17.0.1") + assert not is_higher("17.0.6", "17.0.1") def test_get_major_minor_patch(self): # good version patterns @@ -45,35 +47,34 @@ def test_get_major_minor_patch(self): with pytest.raises(AttributeError): get_major_minor_patch("java 17.2.4") - def test_GIVEN_git_latest_WHEN_version_checked_THEN_decorated_function_not_called(self): - gitMock = Git() + git_mock = Git() - gitMock.get_installed_version = Mock(return_value="2.3.2") - gitMock.get_version_of = Mock(side_effect=get_version_from_name) - gitMock.find_available = Mock(return_value=MOCK_GIT_INSTALLERS) + git_mock.get_installed_version = Mock(return_value="2.3.2") + git_mock.get_version_of = Mock(side_effect=get_version_from_name) + git_mock.find_available = Mock(return_value=MOCK_GIT_INSTALLERS) - functionMock = Mock() + func_mock = Mock() - @version_check(gitMock) + @version_check(git_mock) def function(_): - functionMock() + func_mock() function(self) - functionMock.assert_not_called() + func_mock.assert_not_called() def test_GIVEN_git_old_WHEN_version_checked_THEN_decorated_function_called(self): - gitMock = Git() + git_mock = Git() - gitMock.get_installed_version = Mock(return_value="2.3.0") - gitMock.get_version_of = Mock(side_effect=get_version_from_name) - gitMock.find_available = Mock(return_value=MOCK_GIT_INSTALLERS) + git_mock.get_installed_version = Mock(return_value="2.3.0") + git_mock.get_version_of = Mock(side_effect=get_version_from_name) + git_mock.find_available = Mock(return_value=MOCK_GIT_INSTALLERS) - functionMock = Mock() + func_mock = Mock() - @version_check(gitMock) + @version_check(git_mock) def function(_): - functionMock() + func_mock() function(self) - functionMock.assert_called_once() + func_mock.assert_called_once() From 97e7c6bc7a67e04766ebe3b5142d45bfc5810bea Mon Sep 17 00:00:00 2001 From: Jack Harper Date: Tue, 16 Dec 2025 11:00:03 +0000 Subject: [PATCH 3/4] remove msilib and unused get_msi_property func --- .../ibex_install_utils/file_utils.py | 23 ------------------- installation_and_upgrade/requirements.txt | 1 - 2 files changed, 24 deletions(-) diff --git a/installation_and_upgrade/ibex_install_utils/file_utils.py b/installation_and_upgrade/ibex_install_utils/file_utils.py index 1cffe0c8..35f53cf2 100644 --- a/installation_and_upgrade/ibex_install_utils/file_utils.py +++ b/installation_and_upgrade/ibex_install_utils/file_utils.py @@ -4,7 +4,6 @@ import binascii import logging -import msilib import os import shutil import tempfile @@ -327,28 +326,6 @@ def get_version(path: str): return version -def get_msi_property(path: str, property: str) -> str: - """Reads a property from msi metadata database of a file. - - Args: - path: The path to the file. - property: The property to read. - Returns: - The string value of the property on successful read, None otherwise. - """ - value = None - try: - db = msilib.OpenDatabase(path, msilib.MSIDBOPEN_READONLY) - view = db.OpenView("SELECT Value FROM Property WHERE Property='" + property + "'") - view.Execute(None) - result = view.Fetch() - value = result.GetString(1) - except: - logging.exception(f"Can't read property '{property}' from file '{path}'.") - logging.info(f"Read value '{value}' for property '{property}' from file '{path}'.") - return value - - @contextmanager def file_in_zip(zipname, peek_at_filename: str): """ diff --git a/installation_and_upgrade/requirements.txt b/installation_and_upgrade/requirements.txt index ef4f5a59..07a5525a 100644 --- a/installation_and_upgrade/requirements.txt +++ b/installation_and_upgrade/requirements.txt @@ -12,5 +12,4 @@ pyepics epicscorelibs certifi # Needed in order for requests to find https certificates requests -python-msilib # Short term hack, msilib is deprecated and removed from python (see https://peps.python.org/pep-0594/#msilib) mysql-connector-python==8.4.0 From 490874a2b0134a376c7e9bbed6105d0c32de76e2 Mon Sep 17 00:00:00 2001 From: Jack Harper Date: Tue, 16 Dec 2025 11:02:41 +0000 Subject: [PATCH 4/4] ruff easy fixes --- .../ibex_install_utils/file_utils.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/installation_and_upgrade/ibex_install_utils/file_utils.py b/installation_and_upgrade/ibex_install_utils/file_utils.py index 35f53cf2..d1d79397 100644 --- a/installation_and_upgrade/ibex_install_utils/file_utils.py +++ b/installation_and_upgrade/ibex_install_utils/file_utils.py @@ -80,7 +80,7 @@ def is_junction(path: str) -> bool: return False @staticmethod - def remove_tree(path, prompt, use_robocopy=True, retries=10, leave_top_if_link=False): + def remove_tree(path, prompt, use_robocopy=True, retries=10, leave_top_if_link=False) -> None: """ Delete a file path if it exists Args: @@ -153,7 +153,7 @@ def remove_tree(path, prompt, use_robocopy=True, retries=10, leave_top_if_link=F ) @staticmethod - def robocopy_move(src, dst, prompt, retries=10): + def robocopy_move(src, dst, prompt, retries=10) -> None: for _ in range(retries): try: args = [ @@ -191,7 +191,7 @@ def robocopy_move(src, dst, prompt, retries=10): def winapi_path(dos_path): return _winapi_path(dos_path) - def mkdir_recursive(self, path): + def mkdir_recursive(self, path) -> None: """ Make a directory and all its ancestors Args: @@ -207,7 +207,7 @@ def mkdir_recursive(self, path): os.mkdir(path) @staticmethod - def move_dir(src, dst, prompt): + def move_dir(src, dst, prompt) -> None: """ Moves a dir. Better to copy remove so we can handle permissions issues @@ -220,7 +220,7 @@ def move_dir(src, dst, prompt): FileUtils.remove_tree(src, prompt) @staticmethod - def move_file(source, destination, prompt): + def move_file(source, destination, prompt) -> None: """ Move a file from the source to destination Args: @@ -272,7 +272,7 @@ def get_size_and_number_of_files(path=".", ignore=None): size_of_dir = 0 number_of_files = 0 - def total_up_size(src, dst): + def total_up_size(src, dst) -> None: nonlocal size_of_dir nonlocal number_of_files number_of_files += 1