From aab7f498e6606cd77ce893109b41ef641232798c Mon Sep 17 00:00:00 2001 From: Daniel Horak Date: Thu, 29 Aug 2024 13:38:08 +0200 Subject: [PATCH] add get_virtctl_tool function - separate getting asset from github to separated function fixes: https://github.com/red-hat-storage/ocs-ci/issues/10366 Signed-off-by: Daniel Horak --- ocs_ci/framework/conf/default_config.yaml | 2 + ocs_ci/helpers/disconnected.py | 56 ++--------------- ocs_ci/helpers/github.py | 75 +++++++++++++++++++++++ ocs_ci/helpers/virtctl.py | 29 +++++++++ 4 files changed, 111 insertions(+), 51 deletions(-) create mode 100644 ocs_ci/helpers/github.py create mode 100644 ocs_ci/helpers/virtctl.py diff --git a/ocs_ci/framework/conf/default_config.yaml b/ocs_ci/framework/conf/default_config.yaml index a989f398c55..54317aaa4e4 100644 --- a/ocs_ci/framework/conf/default_config.yaml +++ b/ocs_ci/framework/conf/default_config.yaml @@ -201,6 +201,8 @@ ENV_DATA: opm_owner_repo: "operator-framework/operator-registry" # opm tool release tag (particular version or "latest") to be downloaded opm_release_tag: "latest" + # virtctl tool github owner and repository (used in api url for downloading opm tool) + virtctl_owner_repo: "kubevirt/kubevirt" # vault environment variables vault_deploy_mode: external KMS_PROVIDER: vault diff --git a/ocs_ci/helpers/disconnected.py b/ocs_ci/helpers/disconnected.py index 77e1ea53a74..c57c902af2e 100644 --- a/ocs_ci/helpers/disconnected.py +++ b/ocs_ci/helpers/disconnected.py @@ -1,21 +1,16 @@ -import json import logging import os -import platform from ocs_ci.framework import config +from ocs_ci.helpers.github import get_asset_from_github from ocs_ci.ocs import constants from ocs_ci.ocs.exceptions import ( CommandFailed, - NotFoundError, - UnsupportedOSType, ) from ocs_ci.utility.utils import ( clone_repo, - download_file, exec_cmd, get_ocp_version, - get_url_content, prepare_bin_dir, ) @@ -32,52 +27,11 @@ def get_opm_tool(): except (CommandFailed, FileNotFoundError): logger.info("opm tool is not available, installing it") opm_release_tag = config.ENV_DATA.get("opm_release_tag", "latest") - if opm_release_tag != "latest": - opm_release_tag = f"tags/{opm_release_tag}" - opm_releases_api_url = ( - f"https://api.github.com/repos/{config.ENV_DATA.get('opm_owner_repo')}/" - f"releases/{opm_release_tag}" + get_asset_from_github( + name="opm", + owner_repo=config.ENV_DATA.get("opm_owner_repo"), + release_tag=opm_release_tag, ) - if config.AUTH.get("github"): - github_auth = ( - config.AUTH["github"].get("username"), - config.AUTH["github"].get("token"), - ) - logger.debug(f"Using github authentication (user: {github_auth[0]})") - else: - github_auth = None - logger.warning( - "Github credentials are not provided in data/auth.yaml file. " - "You might encounter issues with accessing github api as it " - "have very strict rate limit for unauthenticated requests " - "(60 requests per hour). Please check docs/getting_started.md " - "file to find how to configure github authentication." - ) - release_data = json.loads( - get_url_content(opm_releases_api_url, auth=github_auth) - ) - - if platform.system() == "Darwin": - opm_asset_name = "darwin-amd64-opm" - elif platform.system() == "Linux": - opm_asset_name = "linux-amd64-opm" - else: - raise UnsupportedOSType - - for asset in release_data["assets"]: - if asset["name"] == opm_asset_name: - opm_download_url = asset["browser_download_url"] - break - else: - raise NotFoundError( - f"opm binary for selected type {opm_asset_name} was not found" - ) - prepare_bin_dir() - bin_dir = os.path.expanduser(config.RUN["bin_dir"]) - logger.info(f"Downloading opm tool from '{opm_download_url}' to '{bin_dir}'") - download_file(opm_download_url, os.path.join(bin_dir, "opm")) - cmd = f"chmod +x {os.path.join(bin_dir, 'opm')}" - exec_cmd(cmd) opm_version = exec_cmd("opm version") logger.info(f"opm tool is available: {opm_version.stdout.decode('utf-8')}") diff --git a/ocs_ci/helpers/github.py b/ocs_ci/helpers/github.py new file mode 100644 index 00000000000..a7005e5dbde --- /dev/null +++ b/ocs_ci/helpers/github.py @@ -0,0 +1,75 @@ +import json +import logging +import os +import platform + +from ocs_ci.framework import config + +# from ocs_ci.ocs import constants +from ocs_ci.ocs.exceptions import ( + NotFoundError, + UnsupportedOSType, +) +from ocs_ci.utility.utils import ( + download_file, + exec_cmd, + get_url_content, + prepare_bin_dir, +) + +logger = logging.getLogger(__name__) + + +def get_asset_from_github(name, owner_repo, release_tag="latest"): + """ + Download and install asset from github. + + Args: + name (str): name of the tool which should be downloaded + owner_repo (str): github repository with the tool in form owner/repo + release_tag (str): release tag to download (default: latest) + + """ + if release_tag != "latest": + release_tag = f"tags/{release_tag}" + releases_api_url = ( + f"https://api.github.com/repos/{owner_repo}/releases/{release_tag}" + ) + if config.AUTH.get("github"): + github_auth = ( + config.AUTH["github"].get("username"), + config.AUTH["github"].get("token"), + ) + logger.debug(f"Using github authentication (user: {github_auth[0]})") + else: + github_auth = None + logger.warning( + "Github credentials are not provided in data/auth.yaml file. " + "You might encounter issues with accessing github api as it " + "have very strict rate limit for unauthenticated requests " + "(60 requests per hour). Please check docs/getting_started.md " + "file to find how to configure github authentication." + ) + release_data = json.loads(get_url_content(releases_api_url, auth=github_auth)) + + if platform.system() == "Darwin": + asset_name = "darwin-amd64" + elif platform.system() == "Linux": + asset_name = "linux-amd64" + else: + raise UnsupportedOSType + + for asset in release_data["assets"]: + if asset_name in asset["name"]: + download_url = asset["browser_download_url"] + break + else: + raise NotFoundError( + f"{name} binary for selected type {asset_name} was not found" + ) + prepare_bin_dir() + bin_dir = os.path.expanduser(config.RUN["bin_dir"]) + logger.info(f"Downloading tool from '{download_url}' to '{bin_dir}'") + download_file(download_url, os.path.join(bin_dir, name)) + cmd = f"chmod +x {os.path.join(bin_dir, name)}" + exec_cmd(cmd) diff --git a/ocs_ci/helpers/virtctl.py b/ocs_ci/helpers/virtctl.py new file mode 100644 index 00000000000..92aae44513a --- /dev/null +++ b/ocs_ci/helpers/virtctl.py @@ -0,0 +1,29 @@ +import logging + +from ocs_ci.framework import config + +# from ocs_ci.ocs import constants +from ocs_ci.helpers.github import get_asset_from_github +from ocs_ci.ocs.exceptions import CommandFailed +from ocs_ci.utility.utils import exec_cmd + +logger = logging.getLogger(__name__) + + +def get_virtctl_tool(): + """ + Download and install virtctl tool. + + """ + try: + virtctl_version = exec_cmd("virtctl version -c") + except (CommandFailed, FileNotFoundError): + logger.info("virtctl tool is not available, installing it") + virtctl_release_tag = config.ENV_DATA.get("virtctl_release_tag", "latest") + get_asset_from_github( + name="virtctl", + owner_repo=config.ENV_DATA.get("virtctl_owner_repo"), + release_tag=virtctl_release_tag, + ) + virtctl_version = exec_cmd("virtctl version -c") + logger.info(f"virtctl tool is available: {virtctl_version.stdout.decode('utf-8')}")