From 6d0d790eddd67604cd0aab50397cca4667997f01 Mon Sep 17 00:00:00 2001 From: antarcticrainforest Date: Mon, 18 Mar 2024 03:16:48 +0100 Subject: [PATCH] fix typos. --- .../freva/deployment/playbooks/versions.yaml | 4 - src/freva_deployment/deploy.py | 87 +++++++++++-------- src/freva_deployment/versions.json | 2 +- src/freva_deployment/versions.py | 22 +++++ 4 files changed, 74 insertions(+), 41 deletions(-) diff --git a/assets/share/freva/deployment/playbooks/versions.yaml b/assets/share/freva/deployment/playbooks/versions.yaml index e2871bc0..0e09fc52 100644 --- a/assets/share/freva/deployment/playbooks/versions.yaml +++ b/assets/share/freva/deployment/playbooks/versions.yaml @@ -14,7 +14,6 @@ ansible.builtin.script: cmd: "{{ asset_dir }}/scripts/inspect.sh solr" become: "{{ databrowser_ansible_become_user | default('root') is defined and databrowser_ansible_become_user | default('root') != '' }}" - when: inventory_hostname in groups['databrowser'] - name: Display solr version debug: msg: "{{ solr.stdout }}" @@ -25,7 +24,6 @@ ansible.builtin.script: cmd: "{{ asset_dir }}/scripts/inspect.sh ghcr.io/freva-clint/freva-web" become: "{{ web_ansible_become_user | default('root') is defined and web_ansible_become_user | default('root') != '' }}" - when: inventory_hostname in groups['web'] - hosts: db tasks: - name: Get vault version @@ -33,7 +31,6 @@ ansible.builtin.script: cmd: "{{ asset_dir }}/scripts/inspect.sh ghcr.io/freva-clint/freva-deployment/vault" become: "{{ db_ansible_become_user | default('root') is defined and db_ansible_become_user | default('root') != '' }}" - when: inventory_hostname in groups['vault'] - name: Display vault version debug: msg: "{{ vault.stdout }}" @@ -44,7 +41,6 @@ tags: core shell: cmd: "{{ core_install_dir | expanduser }}/bin/freva -V 2> /dev/null | awk '{print $NF}'" - when: inventory_hostname in groups['core'] - name: Display core version debug: msg: "{{ core.stdout }}" diff --git a/src/freva_deployment/deploy.py b/src/freva_deployment/deploy.py index 41149f0e..db25e73e 100644 --- a/src/freva_deployment/deploy.py +++ b/src/freva_deployment/deploy.py @@ -7,8 +7,10 @@ import random import string import sys +import time from copy import deepcopy from getpass import getuser +from io import StringIO from pathlib import Path from socket import gethostbyname, gethostname from typing import Any, cast @@ -16,8 +18,8 @@ import tomlkit import yaml -from ansible_runner import run -from rich import print +from ansible_runner import run, run_async +from rich import print as pprint from rich.prompt import Prompt from freva_deployment import FREVA_PYTHON_VERSION @@ -512,9 +514,9 @@ def _set_additional_config_values( if dump_file: config[step]["vars"][f"{step}_dump"] = str(dump_file) - def parse_config(self) -> str: + def parse_config(self, steps: list[str]) -> str: """Create config files for anisble and evaluation_system.conf.""" - playbook = self.create_playbooks() + playbook = self.create_playbooks(set(steps + self.steps)) logger.info("Parsing configurations") self._check_config() config: dict[str, dict[str, dict[str, str | int | bool]]] = {} @@ -574,12 +576,12 @@ def steps(self) -> list[str]: steps.append("vault") return [s for s in self.step_order if s in steps] - def create_playbooks(self) -> str: + def create_playbooks(self, steps: set[str]) -> str: """Create the ansible playbook form all steps.""" logger.info("Creating Ansible playbooks") playbook = [] [getattr(self, f"_prep_{step}")() for step in self.step_order] - for step in self.steps: + for step in steps: playbook_file = ( self.playbooks.get(step) or self.playbook_dir / f"{step}-server-playbook.yml" @@ -672,7 +674,7 @@ def play( ask_pass=ask_pass, verbosity=verbosity, ssh_port=ssh_port ) except KeyboardInterrupt: - print( + pprint( " [red][ERROR]: User interrupted execution[/]", file=sys.stderr ) raise SystemExit(130) @@ -680,11 +682,11 @@ def play( def get_steps_from_versions( self, envvars: dict[str, str], - extravars: dict[str, str], - cmdline: dict[str, str], + extravars: dict[str, str | int], + cmdline: str, passwords: dict[str, str], verbosity: int, - ) -> set[str, str]: + ) -> list[str]: """Check the versions of the different freva parts.""" config: dict[str, dict[str, dict[str, str | int | bool]]] = {} cfg = deepcopy(self.cfg) @@ -704,18 +706,33 @@ def get_steps_from_versions( config["core"]["vars"]["core_install_dir"] = cfg["core"]["config"][ "install_dir" ] - extravars["forks"] = 10 - event = run( - private_data_dir=str(self._td.parent_dir), - playbook=str(asset_dir / "playbooks" / "versions.yaml"), - inventory=config, - envvars=envvars, - passwords=passwords, - extravars=extravars, - cmdline=cmdline, - verbosity=verbosity, - forks=4, - ) + extravars["forks"] = 4 + stdout = sys.stdout + buffer = StringIO() + pprint("Getting versions of micro services ...", end="") + try: + sys.stdout = buffer + thread, event = run_async( + private_data_dir=str(self._td.parent_dir), + playbook=str(asset_dir / "playbooks" / "versions.yaml"), + inventory=config, + envvars=envvars, + passwords=passwords, + extravars=extravars, + cmdline=cmdline, + verbosity=verbosity, + forks=4, + quiet=False, + ) + while thread.is_alive(): + time.sleep(0.5) + finally: + sys.stdout = stdout + if event.status != "successful": + pprint(" [red]fail[/red]") + print(buffer.getvalue()) + raise SystemExit(1) + pprint(" [green]ok[/green]") versions = {} for res in event.events: msg = res.get("event_data", {}).get("res", {}).get("msg") @@ -743,9 +760,12 @@ def _play( ssh_port: int, default: 22 Set the ssh port, in 99.9% of cases this should be left at port 22 """ - envvars = {} + envvars: dict[str, str] = {} envvars["ANSIBLE_STDOUT_CALLBACK"] = "yaml" - extravars = {"ansible_port": ssh_port, "stdout_callback": "yaml"} + extravars: dict[str, str | int] = { + "ansible_port": ssh_port, + "stdout_callback": "yaml", + } if self.local_debug: extravars["ansible_connection"] = "local" @@ -753,19 +773,14 @@ def _play( if ask_pass: cmdline += " --ask-pass" passwords = self.get_ansible_password(ask_pass) - steps = set( - self.get_steps_from_versions( - envvars.copy(), - extravars.copy(), - cmdline, - passwords.copy(), - verbosity, - ) - + self.steps + steps = self.get_steps_from_versions( + envvars.copy(), + extravars.copy(), + cmdline, + passwords.copy(), + verbosity, ) - print(steps) - return - inventory = self.parse_config() + inventory = self.parse_config(steps) self.create_eval_config() logger.debug(inventory) with self.inventory_file.open("w") as f_obj: diff --git a/src/freva_deployment/versions.json b/src/freva_deployment/versions.json index 8c90254a..a5bbd339 100644 --- a/src/freva_deployment/versions.json +++ b/src/freva_deployment/versions.json @@ -3,5 +3,5 @@ "databrowser": "2401.0.0", "solr": "9.5.0", "web": "2403.0.0", - "freva": "2309.0.2" + "core": "2309.0.2" } diff --git a/src/freva_deployment/versions.py b/src/freva_deployment/versions.py index 50f769ab..766d4399 100644 --- a/src/freva_deployment/versions.py +++ b/src/freva_deployment/versions.py @@ -4,6 +4,8 @@ from pathlib import Path from typing import Dict, List +from rich.prompt import Prompt + def get_steps_from_versions(detected_versions: Dict[str, str]) -> List[str]: """Decide on services the should be deployed, based on thier versions. @@ -26,4 +28,24 @@ def get_steps_from_versions(detected_versions: Dict[str, str]) -> List[str]: version = detected_versions.get(service, "").strip("v") or "0.0.0" if version < min_version: steps.append(service) + elif version > min_version: + # We do have a problem: an installed version has a higher version + # the the defined minium version, possibly the deployment + # software is outdated. + answ = ( + Prompt.ask( + f"The installed version for {service} is higher" + " than the min. defined version.\nThere might be" + " a chance that the current deployment software" + " is outdated.\nIf you cotinue you will " + f"[b]downgrade[/b] {service} from " + f"{version} to {min_version}. " + "\nDo you want to continue \\[y|N]" + ).lower() + or "n" + ) + if answ[0] == "y": + steps.append(service) + else: + raise SystemExit(1) return steps