qubership-pipelines-common-library 0.2.6__py3-none-any.whl → 2.0.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- qubership_pipelines_common_library/__init__.py +1 -1
- qubership_pipelines_common_library/v1/artifactory_client.py +1 -1
- qubership_pipelines_common_library/v1/execution/exec_command.py +63 -2
- qubership_pipelines_common_library/v1/execution/exec_context.py +6 -6
- qubership_pipelines_common_library/v1/execution/exec_context_file.py +1 -1
- qubership_pipelines_common_library/v1/execution/exec_info.py +4 -0
- qubership_pipelines_common_library/v1/execution/exec_logger.py +7 -5
- qubership_pipelines_common_library/v1/github_client.py +10 -1
- qubership_pipelines_common_library/v1/gitlab_client.py +175 -11
- qubership_pipelines_common_library/v1/jenkins_client.py +55 -18
- qubership_pipelines_common_library/v1/maven_client.py +2 -2
- qubership_pipelines_common_library/v1/minio_client.py +1 -1
- qubership_pipelines_common_library/v1/utils/rest.py +1 -1
- qubership_pipelines_common_library/v1/utils/utils.py +1 -1
- qubership_pipelines_common_library/v1/utils/utils_cli.py +43 -9
- qubership_pipelines_common_library/v1/utils/utils_dictionary.py +1 -1
- qubership_pipelines_common_library/v1/utils/utils_file.py +17 -0
- qubership_pipelines_common_library/v1/utils/utils_logging.py +53 -0
- qubership_pipelines_common_library/v2/__init__.py +0 -0
- qubership_pipelines_common_library/v2/artifacts_finder/__init__.py +0 -0
- qubership_pipelines_common_library/v2/artifacts_finder/artifact_finder.py +56 -0
- qubership_pipelines_common_library/v2/artifacts_finder/auth/__init__.py +0 -0
- qubership_pipelines_common_library/v2/artifacts_finder/auth/aws_credentials.py +106 -0
- qubership_pipelines_common_library/v2/artifacts_finder/auth/azure_credentials.py +72 -0
- qubership_pipelines_common_library/v2/artifacts_finder/auth/gcp_credentials.py +88 -0
- qubership_pipelines_common_library/v2/artifacts_finder/model/__init__.py +0 -0
- qubership_pipelines_common_library/v2/artifacts_finder/model/artifact.py +20 -0
- qubership_pipelines_common_library/v2/artifacts_finder/model/artifact_provider.py +35 -0
- qubership_pipelines_common_library/v2/artifacts_finder/model/credentials.py +16 -0
- qubership_pipelines_common_library/v2/artifacts_finder/model/credentials_provider.py +16 -0
- qubership_pipelines_common_library/v2/artifacts_finder/providers/__init__.py +0 -0
- qubership_pipelines_common_library/v2/artifacts_finder/providers/artifactory.py +52 -0
- qubership_pipelines_common_library/v2/artifacts_finder/providers/aws_code_artifact.py +79 -0
- qubership_pipelines_common_library/v2/artifacts_finder/providers/azure_artifacts.py +98 -0
- qubership_pipelines_common_library/v2/artifacts_finder/providers/gcp_artifact_registry.py +50 -0
- qubership_pipelines_common_library/v2/artifacts_finder/providers/nexus.py +41 -0
- qubership_pipelines_common_library/v2/extensions/pipeline_data_importer.py +24 -0
- qubership_pipelines_common_library/v2/github/__init__.py +0 -0
- qubership_pipelines_common_library/v2/github/github_client.py +5 -0
- qubership_pipelines_common_library/v2/github/github_pipeline_data_importer.py +21 -0
- qubership_pipelines_common_library/v2/github/github_run_pipeline_command.py +175 -0
- qubership_pipelines_common_library/v2/github/safe_github_client.py +24 -0
- qubership_pipelines_common_library/v2/gitlab/__init__.py +0 -0
- qubership_pipelines_common_library/v2/gitlab/custom_extensions.py +101 -0
- qubership_pipelines_common_library/v2/gitlab/gitlab_client.py +36 -0
- qubership_pipelines_common_library/v2/gitlab/gitlab_pipeline_data_importer.py +26 -0
- qubership_pipelines_common_library/v2/gitlab/gitlab_run_pipeline_command.py +195 -0
- qubership_pipelines_common_library/v2/gitlab/safe_gitlab_client.py +32 -0
- qubership_pipelines_common_library/v2/jenkins/__init__.py +0 -0
- qubership_pipelines_common_library/v2/jenkins/custom_extensions.py +63 -0
- qubership_pipelines_common_library/v2/jenkins/jenkins_client.py +5 -0
- qubership_pipelines_common_library/v2/jenkins/jenkins_pipeline_data_importer.py +31 -0
- qubership_pipelines_common_library/v2/jenkins/jenkins_run_pipeline_command.py +165 -0
- qubership_pipelines_common_library/v2/jenkins/safe_jenkins_client.py +14 -0
- qubership_pipelines_common_library/v2/podman/__init__.py +0 -0
- qubership_pipelines_common_library/v2/podman/podman_command.md +178 -0
- qubership_pipelines_common_library/v2/podman/podman_command.py +311 -0
- qubership_pipelines_common_library/v2/sops/sops_client.py +116 -0
- qubership_pipelines_common_library/v2/utils/crypto_utils.py +48 -0
- qubership_pipelines_common_library/v2/utils/extension_utils.py +22 -0
- qubership_pipelines_common_library/v2/utils/retry_decorator.py +93 -0
- {qubership_pipelines_common_library-0.2.6.dist-info → qubership_pipelines_common_library-2.0.1.dist-info}/METADATA +5 -3
- qubership_pipelines_common_library-2.0.1.dist-info/RECORD +76 -0
- qubership_pipelines_common_library-0.2.6.dist-info/RECORD +0 -32
- {qubership_pipelines_common_library-0.2.6.dist-info → qubership_pipelines_common_library-2.0.1.dist-info}/WHEEL +0 -0
- {qubership_pipelines_common_library-0.2.6.dist-info → qubership_pipelines_common_library-2.0.1.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
import os
|
|
3
|
+
import shutil
|
|
4
|
+
import subprocess
|
|
5
|
+
import uuid
|
|
6
|
+
import yaml
|
|
7
|
+
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class SopsClient:
|
|
12
|
+
|
|
13
|
+
def __init__(self, sops_artifact_configs_folder_path: Path):
|
|
14
|
+
self.sops_artifact_configs_folder_path = sops_artifact_configs_folder_path
|
|
15
|
+
self.sops_executable = Path(os.environ.get("SOPS_EXECUTABLE", "/usr/local/bin/sops"))
|
|
16
|
+
self.logger = logging.getLogger()
|
|
17
|
+
|
|
18
|
+
def encrypt_content_by_path(
|
|
19
|
+
self, age_public_key: str, source_file_path_to_encrypt: Path, target_file_path: Path = None):
|
|
20
|
+
"""
|
|
21
|
+
Encrypts file and saves result into file by path
|
|
22
|
+
Args:
|
|
23
|
+
age_public_key: age public key
|
|
24
|
+
source_file_path_to_encrypt: file to encrypt
|
|
25
|
+
target_file_path: file to save result of encryption. If None then `source_file_path_to_encrypt` will be used
|
|
26
|
+
"""
|
|
27
|
+
if not self.sops_executable.exists():
|
|
28
|
+
self.logger.error(f"Sops executable doesn't exist. Can't encrypt file {source_file_path_to_encrypt}")
|
|
29
|
+
return
|
|
30
|
+
|
|
31
|
+
sops_config_path = self._get_prepared_sops_config_path(age_public_key)
|
|
32
|
+
encrypted_file_path = target_file_path
|
|
33
|
+
if not encrypted_file_path:
|
|
34
|
+
encrypted_file_path = source_file_path_to_encrypt
|
|
35
|
+
|
|
36
|
+
args = (self.sops_executable, "--config", sops_config_path, "encrypt", source_file_path_to_encrypt)
|
|
37
|
+
sops_encrypt_result = subprocess.run(args, capture_output=True, text=True)
|
|
38
|
+
if sops_encrypt_result.stderr:
|
|
39
|
+
self.logger.error(f"Error during encryption of {source_file_path_to_encrypt}. "
|
|
40
|
+
f"Saving empty content into {encrypted_file_path}"
|
|
41
|
+
f"Error: {sops_encrypt_result.stderr}")
|
|
42
|
+
|
|
43
|
+
with open(encrypted_file_path, 'w') as encrypted_file:
|
|
44
|
+
encrypted_file.write("")
|
|
45
|
+
self._remove_sops_config(sops_config_path.parent)
|
|
46
|
+
return
|
|
47
|
+
|
|
48
|
+
with open(encrypted_file_path, 'w') as encrypted_file:
|
|
49
|
+
encrypted_file.write(sops_encrypt_result.stdout)
|
|
50
|
+
self.logger.debug(f"Content {source_file_path_to_encrypt} was encrypted by sops. "
|
|
51
|
+
f"Result saved into {encrypted_file_path}")
|
|
52
|
+
self._remove_sops_config(sops_config_path.parent)
|
|
53
|
+
|
|
54
|
+
def get_decrypted_content_by_path(self, age_private_key: str, source_file_path_to_decrypt: Path) -> str:
|
|
55
|
+
"""
|
|
56
|
+
Decrypts file by path
|
|
57
|
+
Args:
|
|
58
|
+
age_private_key: age private key
|
|
59
|
+
source_file_path_to_decrypt: file path to decrypt
|
|
60
|
+
|
|
61
|
+
Returns:
|
|
62
|
+
decrypted file content or empty string if error occurs
|
|
63
|
+
"""
|
|
64
|
+
if not self.sops_executable.exists():
|
|
65
|
+
self.logger.error(f"Sops executable doesn't exist. Can't decrypt file {source_file_path_to_decrypt}")
|
|
66
|
+
return ""
|
|
67
|
+
if not age_private_key:
|
|
68
|
+
self.logger.warning("sops_private_key is not defined, skipping decryption")
|
|
69
|
+
return ""
|
|
70
|
+
environment_variables = os.environ.copy()
|
|
71
|
+
environment_variables["SOPS_AGE_KEY"] = age_private_key.strip()
|
|
72
|
+
args = (self.sops_executable, "-d", source_file_path_to_decrypt)
|
|
73
|
+
sops_decrypt_result = subprocess.run(args, env=environment_variables, capture_output=True, text=True)
|
|
74
|
+
if sops_decrypt_result.stderr:
|
|
75
|
+
self.logger.error(f"Error during {source_file_path_to_decrypt} decrypt. Error: {sops_decrypt_result.stderr}")
|
|
76
|
+
return ""
|
|
77
|
+
self.logger.debug(f"Content {source_file_path_to_decrypt} was decrypted by sops")
|
|
78
|
+
return sops_decrypt_result.stdout
|
|
79
|
+
|
|
80
|
+
def _get_prepared_sops_config_path(self, age_public_key) -> Path:
|
|
81
|
+
"""
|
|
82
|
+
Generates `.sops.yaml` file `age-public-key`
|
|
83
|
+
Creates folder `uuid.uuid4()` under `self.sops_artifact_configs_folder_path` to make `.sops.yaml`
|
|
84
|
+
unique for exact encryption
|
|
85
|
+
Args:
|
|
86
|
+
age_public_key: age public key
|
|
87
|
+
|
|
88
|
+
Returns:
|
|
89
|
+
path to generated `.sops.yaml`
|
|
90
|
+
"""
|
|
91
|
+
self.logger.debug("Preparing sops config for encryption")
|
|
92
|
+
sops_config_content = {
|
|
93
|
+
"creation_rules": [
|
|
94
|
+
{
|
|
95
|
+
"age": age_public_key
|
|
96
|
+
}
|
|
97
|
+
]
|
|
98
|
+
}
|
|
99
|
+
sops_config_path = self.sops_artifact_configs_folder_path.joinpath(str(uuid.uuid4()), ".sops.yaml")
|
|
100
|
+
sops_config_path.parent.mkdir(parents=True, exist_ok=True)
|
|
101
|
+
with open(sops_config_path, mode="w") as file:
|
|
102
|
+
yaml.dump(sops_config_content, file)
|
|
103
|
+
return sops_config_path
|
|
104
|
+
|
|
105
|
+
def _remove_sops_config(self, sops_config_folder: Path):
|
|
106
|
+
"""
|
|
107
|
+
Removes folder with generated sops config
|
|
108
|
+
Args:
|
|
109
|
+
sops_config_folder: path to folder with sops config
|
|
110
|
+
|
|
111
|
+
Returns:
|
|
112
|
+
|
|
113
|
+
"""
|
|
114
|
+
self.logger.debug("Removing sops config")
|
|
115
|
+
if sops_config_folder.exists() and sops_config_folder.is_dir():
|
|
116
|
+
shutil.rmtree(sops_config_folder)
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
class CryptoUtils:
|
|
2
|
+
EXCLUDE_KEYS = {"kind", "apiVersion"}
|
|
3
|
+
|
|
4
|
+
@staticmethod
|
|
5
|
+
def is_base64(s) -> bool:
|
|
6
|
+
try:
|
|
7
|
+
if isinstance(s, str):
|
|
8
|
+
s_bytes = s.encode('utf-8')
|
|
9
|
+
else:
|
|
10
|
+
s_bytes = s
|
|
11
|
+
import base64
|
|
12
|
+
return base64.b64encode(base64.b64decode(s_bytes)) == s_bytes
|
|
13
|
+
except Exception:
|
|
14
|
+
return False
|
|
15
|
+
|
|
16
|
+
@staticmethod
|
|
17
|
+
def get_base64_encrypted_str(s) -> str:
|
|
18
|
+
if isinstance(s, str):
|
|
19
|
+
s_bytes = s.encode('utf-8')
|
|
20
|
+
else:
|
|
21
|
+
s_bytes = s
|
|
22
|
+
import base64
|
|
23
|
+
return base64.b64encode(s_bytes).decode('utf-8')
|
|
24
|
+
|
|
25
|
+
@staticmethod
|
|
26
|
+
def mask_values(data, path=None):
|
|
27
|
+
if path is None:
|
|
28
|
+
path = []
|
|
29
|
+
|
|
30
|
+
if isinstance(data, dict):
|
|
31
|
+
return {
|
|
32
|
+
key: (CryptoUtils.mask_values(value, path + [key])
|
|
33
|
+
if not (len(path) == 0 and key in CryptoUtils.EXCLUDE_KEYS)
|
|
34
|
+
else value)
|
|
35
|
+
for key, value in data.items()
|
|
36
|
+
}
|
|
37
|
+
elif isinstance(data, list):
|
|
38
|
+
return [CryptoUtils.mask_values(item, path) for item in data]
|
|
39
|
+
else:
|
|
40
|
+
return "[MASKED]"
|
|
41
|
+
|
|
42
|
+
@staticmethod
|
|
43
|
+
def get_parameters_for_print(content: dict, need_mask: bool):
|
|
44
|
+
import yaml
|
|
45
|
+
if need_mask:
|
|
46
|
+
return yaml.dump(CryptoUtils.mask_values(content), default_flow_style=False)
|
|
47
|
+
else:
|
|
48
|
+
return yaml.dump(content, default_flow_style=False)
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import importlib
|
|
2
|
+
from typing import Type, Any, Optional
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class ExtensionLoader:
|
|
6
|
+
"""Utility methods to create instance of a class by its classpath and validate its expected base class"""
|
|
7
|
+
|
|
8
|
+
@staticmethod
|
|
9
|
+
def load_class(class_path: str) -> Type[Any]:
|
|
10
|
+
try:
|
|
11
|
+
module_path, class_name = class_path.rsplit('.', 1)
|
|
12
|
+
module = importlib.import_module(module_path)
|
|
13
|
+
return getattr(module, class_name)
|
|
14
|
+
except (ImportError, AttributeError, ValueError) as e:
|
|
15
|
+
raise ImportError(f"Failed to load class {class_path}: {e}")
|
|
16
|
+
|
|
17
|
+
@staticmethod
|
|
18
|
+
def create_instance(class_path: str, expected_base_class: Optional[Type] = None, **kwargs) -> Any:
|
|
19
|
+
klass = ExtensionLoader.load_class(class_path)
|
|
20
|
+
if expected_base_class and not issubclass(klass, expected_base_class):
|
|
21
|
+
raise TypeError(f"Class {class_path} must inherit from {expected_base_class.__name__}")
|
|
22
|
+
return klass(**kwargs)
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
import sys
|
|
3
|
+
import time
|
|
4
|
+
from functools import wraps
|
|
5
|
+
from typing import Callable
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class RetryDecorator:
|
|
9
|
+
|
|
10
|
+
def __init__(self, condition_func, retry_timeout_seconds: int = 180, retry_wait_seconds: int = 1):
|
|
11
|
+
self.condition_func = condition_func
|
|
12
|
+
self.retry_timeout_seconds = retry_timeout_seconds
|
|
13
|
+
self.retry_wait_seconds = retry_wait_seconds
|
|
14
|
+
self.logger = logging.getLogger()
|
|
15
|
+
|
|
16
|
+
def __call__(self, func: Callable) -> Callable:
|
|
17
|
+
@wraps(func)
|
|
18
|
+
def wrapper(*args, **kwargs):
|
|
19
|
+
self._update_retry_timeout_seconds_from_kwargs(kwargs, func)
|
|
20
|
+
self._update_retry_wait_seconds_from_kwargs(kwargs, func)
|
|
21
|
+
|
|
22
|
+
count_seconds = 0
|
|
23
|
+
retries = 0
|
|
24
|
+
last_log_time = time.perf_counter()
|
|
25
|
+
last_result = None
|
|
26
|
+
estimated_max_attempts = self.retry_timeout_seconds // self.retry_wait_seconds
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
while count_seconds < self.retry_timeout_seconds and not self.condition_func(last_result):
|
|
30
|
+
try:
|
|
31
|
+
last_result = func(*args, **kwargs)
|
|
32
|
+
if self.condition_func(last_result):
|
|
33
|
+
self.logger.debug(f"Function {func.__name__} successfully executed after {retries} attempts in {count_seconds}s")
|
|
34
|
+
return last_result
|
|
35
|
+
retries += 1
|
|
36
|
+
|
|
37
|
+
now = time.perf_counter()
|
|
38
|
+
if now - last_log_time >= 10:
|
|
39
|
+
self._sleep_with_warning_log(
|
|
40
|
+
f"Made [{retries} of {estimated_max_attempts}] retries with {self.retry_wait_seconds} seconds between attempts. Trying to execute func: {self.condition_func.__name__}. {count_seconds} of {self.retry_timeout_seconds} seconds left")
|
|
41
|
+
last_log_time = now
|
|
42
|
+
else:
|
|
43
|
+
time.sleep(self.retry_wait_seconds)
|
|
44
|
+
|
|
45
|
+
except Exception as e:
|
|
46
|
+
retries += 1
|
|
47
|
+
now = time.perf_counter()
|
|
48
|
+
if now - last_log_time >= 10:
|
|
49
|
+
self._process_exception_during_func_execution(e, count_seconds, func.__name__, retries, estimated_max_attempts)
|
|
50
|
+
last_log_time = now
|
|
51
|
+
else:
|
|
52
|
+
time.sleep(self.retry_wait_seconds)
|
|
53
|
+
|
|
54
|
+
finally:
|
|
55
|
+
count_seconds += self.retry_wait_seconds
|
|
56
|
+
|
|
57
|
+
if self.condition_func(last_result):
|
|
58
|
+
self.logger.debug(f"Function {func.__name__} successfully executed after {retries} attempts in {count_seconds}s")
|
|
59
|
+
return last_result
|
|
60
|
+
|
|
61
|
+
self._exit_with_error_message(func.__name__)
|
|
62
|
+
return wrapper
|
|
63
|
+
|
|
64
|
+
def _sleep_with_warning_log(self, message):
|
|
65
|
+
self.logger.warning(message)
|
|
66
|
+
time.sleep(self.retry_wait_seconds)
|
|
67
|
+
|
|
68
|
+
def _update_retry_timeout_seconds_from_kwargs(self, kwargs, func):
|
|
69
|
+
kwargs_retry_timeout_seconds = kwargs.get('retry_timeout_seconds')
|
|
70
|
+
if kwargs_retry_timeout_seconds:
|
|
71
|
+
self.retry_timeout_seconds = kwargs_retry_timeout_seconds
|
|
72
|
+
else:
|
|
73
|
+
self.logger.debug(
|
|
74
|
+
f"`retry_timeout_seconds` is not found in func {func.__name__} arguments. Using default value = {self.retry_timeout_seconds}")
|
|
75
|
+
|
|
76
|
+
def _update_retry_wait_seconds_from_kwargs(self, kwargs, func):
|
|
77
|
+
kwargs_retry_wait_seconds = kwargs.get('retry_wait_seconds')
|
|
78
|
+
if kwargs_retry_wait_seconds:
|
|
79
|
+
self.retry_wait_seconds = kwargs_retry_wait_seconds
|
|
80
|
+
else:
|
|
81
|
+
self.logger.debug(
|
|
82
|
+
f"`retry_wait_seconds` is not found in func {func.__name__} arguments. Using default value = {self.retry_wait_seconds}")
|
|
83
|
+
|
|
84
|
+
def _process_exception_during_func_execution(self, exception, count_seconds, func_name, retries, estimated_max_attempts):
|
|
85
|
+
if count_seconds < self.retry_timeout_seconds:
|
|
86
|
+
self._sleep_with_warning_log(
|
|
87
|
+
f"Made [{retries} of {estimated_max_attempts}] retries. Exception happened during function {func_name} execution, waiting {count_seconds} of {self.retry_timeout_seconds}. Exception: {exception}")
|
|
88
|
+
else:
|
|
89
|
+
self._exit_with_error_message(func_name)
|
|
90
|
+
|
|
91
|
+
def _exit_with_error_message(self, func_name):
|
|
92
|
+
self.logger.error(f"Can't execute function {func_name} in {self.retry_timeout_seconds} seconds")
|
|
93
|
+
sys.exit(1)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: qubership-pipelines-common-library
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 2.0.1
|
|
4
4
|
Summary: Qubership Pipelines common library
|
|
5
5
|
License: Apache-2.0
|
|
6
6
|
License-File: LICENSE
|
|
@@ -24,6 +24,7 @@ Requires-Dist: python-gitlab (>=4.13.0,<5.0.0)
|
|
|
24
24
|
Requires-Dist: python-jenkins (>=1.8.2,<2.0.0)
|
|
25
25
|
Requires-Dist: pyyaml (>=6.0.2,<7.0.0)
|
|
26
26
|
Requires-Dist: requests (>=2.32.3,<3.0.0)
|
|
27
|
+
Requires-Dist: rich (>=14.2.0,<15.0.0)
|
|
27
28
|
Requires-Dist: urllib3 (>=2.2.3,<3.0.0)
|
|
28
29
|
Requires-Dist: webexpythonsdk (==2.0.1)
|
|
29
30
|
Description-Content-Type: text/markdown
|
|
@@ -37,7 +38,7 @@ Description-Content-Type: text/markdown
|
|
|
37
38
|
|
|
38
39
|
Open-source python library of clients used by Qubership pipelines/modules.
|
|
39
40
|
|
|
40
|
-
Library provides easy-to-use clients and wrappers for common
|
|
41
|
+
Library provides easy-to-use clients and wrappers for common DevOps services (e.g. Jenkins, MiniO, GitLab Pipelines)
|
|
41
42
|
|
|
42
43
|
## Sample implementation
|
|
43
44
|
|
|
@@ -49,7 +50,7 @@ It includes reference python implementation along with the [Development Guide](h
|
|
|
49
50
|
|
|
50
51
|
Library is presented as a set of clients with predefined operations
|
|
51
52
|
|
|
52
|
-
Auto-generated reference (via mkdocs) is available on [this repo's GitHub Pages](https://netcracker.github.io/qubership-pipelines-common-python-library)
|
|
53
|
+
Auto-generated reference (via mkdocs) is available on [this repo's GitHub Pages](https://netcracker.github.io/qubership-pipelines-common-python-library/mkdocs)
|
|
53
54
|
|
|
54
55
|
## Installation
|
|
55
56
|
|
|
@@ -61,6 +62,7 @@ Auto-generated reference (via mkdocs) is available on [this repo's GitHub Pages]
|
|
|
61
62
|
```
|
|
62
63
|
|
|
63
64
|
- Or you can install it via `pip`:
|
|
65
|
+
|
|
64
66
|
```bash
|
|
65
67
|
pip install qubership-pipelines-common-library
|
|
66
68
|
```
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
qubership_pipelines_common_library/__init__.py,sha256=1ipKsZu0XaIlnWobDyzTjFYBMMmAMgDII4s9QNAPx1w,704
|
|
2
|
+
qubership_pipelines_common_library/v1/__init__.py,sha256=QczIlSYNOtXMuMWSznhV_BkXMM5KLn1wOogtlT2kcy0,598
|
|
3
|
+
qubership_pipelines_common_library/v1/artifactory_client.py,sha256=hSMh7hQ0KWkgiCNKGEQzPV4TuIOl-tpQ-i2xLd1b7qo,4107
|
|
4
|
+
qubership_pipelines_common_library/v1/execution/__init__.py,sha256=QczIlSYNOtXMuMWSznhV_BkXMM5KLn1wOogtlT2kcy0,598
|
|
5
|
+
qubership_pipelines_common_library/v1/execution/exec_command.py,sha256=3LwDBgnoSc0LCWTmQgsKEujSqMUzCp0iJb8ZM4gu7qE,5727
|
|
6
|
+
qubership_pipelines_common_library/v1/execution/exec_context.py,sha256=j9NaxdsvoIygidWHkxzl7Kg2Jr6l2L5P8E1i-maHDZE,6073
|
|
7
|
+
qubership_pipelines_common_library/v1/execution/exec_context_file.py,sha256=oovjNvudgzdopaNHDbbLv95skEA7z-kPp3CPE0N-8Xc,7392
|
|
8
|
+
qubership_pipelines_common_library/v1/execution/exec_info.py,sha256=c1ksds6c-NcegSH9SPknzFxd1iw8xT8qS2_aZaVZ7F0,4280
|
|
9
|
+
qubership_pipelines_common_library/v1/execution/exec_logger.py,sha256=ZKEfCfBXluer6gP_zIpyLIh31a-xx3LBvUALIowcbU0,3231
|
|
10
|
+
qubership_pipelines_common_library/v1/git_client.py,sha256=uop4dREW0HoaAbGHSzp3P4vk1Hk-VrPK5RhAP3Hj51o,6100
|
|
11
|
+
qubership_pipelines_common_library/v1/github_client.py,sha256=hgChgE2Qiz2nS0WmpO334h8sivyD5kVg0Ck-wBsGdsk,15068
|
|
12
|
+
qubership_pipelines_common_library/v1/gitlab_client.py,sha256=zotW68yhlD2xZJce8N91K_4njrGBGh2hSAutR6MMHw8,15800
|
|
13
|
+
qubership_pipelines_common_library/v1/jenkins_client.py,sha256=_a86Nd72QUzmixtV__SkEb0M3wq2ONS5OhbZWH1eCiU,10554
|
|
14
|
+
qubership_pipelines_common_library/v1/kube_client.py,sha256=rbdc0Q2r6AhJ49FKr-15_1r9Uit4_6U68rWwGYDjdWc,12715
|
|
15
|
+
qubership_pipelines_common_library/v1/log_client.py,sha256=DTJ8aI_37l570RyolDC2cHaOkkccZWi7cFE6qYUuQeo,1514
|
|
16
|
+
qubership_pipelines_common_library/v1/maven_client.py,sha256=bHB5Hox-YABDZWKXQRC8JosJUUKTzQDm6y2RpNtA-6o,15036
|
|
17
|
+
qubership_pipelines_common_library/v1/minio_client.py,sha256=JDS90KLC12WHs7wvSVKmN_eZOqz-JNkhmAmoFCNjeGo,4334
|
|
18
|
+
qubership_pipelines_common_library/v1/utils/__init__.py,sha256=QczIlSYNOtXMuMWSznhV_BkXMM5KLn1wOogtlT2kcy0,598
|
|
19
|
+
qubership_pipelines_common_library/v1/utils/rest.py,sha256=OfYGPE2tM-vDUg__ytZKfpCeGVCDePSjXDHK61A2KDM,3069
|
|
20
|
+
qubership_pipelines_common_library/v1/utils/utils.py,sha256=aMyUrJqlnRcFSjNtiyKa5TDJ31m2ABpljeQdnil3A20,1866
|
|
21
|
+
qubership_pipelines_common_library/v1/utils/utils_aws.py,sha256=BPPnHBzPPXPqFijtAiw16sTPu1tFZjS95GkSMX_HdjA,808
|
|
22
|
+
qubership_pipelines_common_library/v1/utils/utils_cli.py,sha256=URmspvyL2kzRyoaXJbxsVEEcy9n4l9ezuvFYVW4W1hk,4188
|
|
23
|
+
qubership_pipelines_common_library/v1/utils/utils_context.py,sha256=IlMFXGxS8zJw33Gu3SbOUcj88wquIkobBlWkdFbR7MA,3767
|
|
24
|
+
qubership_pipelines_common_library/v1/utils/utils_dictionary.py,sha256=xe8ftnigzyCKWCZaUnI2Xu2ykYlOl1Nc9ATimXuCbgM,1366
|
|
25
|
+
qubership_pipelines_common_library/v1/utils/utils_file.py,sha256=E4RhpeCRhUt-EQ_6pUz-QEKkH8JidJWwYxZmrAvpHBk,2905
|
|
26
|
+
qubership_pipelines_common_library/v1/utils/utils_json.py,sha256=QczIlSYNOtXMuMWSznhV_BkXMM5KLn1wOogtlT2kcy0,598
|
|
27
|
+
qubership_pipelines_common_library/v1/utils/utils_logging.py,sha256=2kPBjPyQfPOZ8_Zv4W-aBWBlZtN_mDCc3JWHzdW4BJo,1506
|
|
28
|
+
qubership_pipelines_common_library/v1/utils/utils_string.py,sha256=Phx5ZXPRjhjg9AaSPx6WLX9zQvwJH1txslfnG3jJ43w,993
|
|
29
|
+
qubership_pipelines_common_library/v1/webex_client.py,sha256=JU_0NgLu_p6zgaUi-ixgZeFMlJaTAvXwrU1oA607Bv0,2997
|
|
30
|
+
qubership_pipelines_common_library/v2/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
31
|
+
qubership_pipelines_common_library/v2/artifacts_finder/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
32
|
+
qubership_pipelines_common_library/v2/artifacts_finder/artifact_finder.py,sha256=mhnnt93XMqUV5dfJkBxmjfvFdnmrDeAMb5-FSG3txM4,3180
|
|
33
|
+
qubership_pipelines_common_library/v2/artifacts_finder/auth/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
34
|
+
qubership_pipelines_common_library/v2/artifacts_finder/auth/aws_credentials.py,sha256=Bmq6tPHbTyEiNShypU1gb44b_hhvasHggMxjEjHQUoA,4042
|
|
35
|
+
qubership_pipelines_common_library/v2/artifacts_finder/auth/azure_credentials.py,sha256=fcEzDKONg4QXwZoV6PfWKMRnhJrAfCEFvdpGL6V9ix4,2616
|
|
36
|
+
qubership_pipelines_common_library/v2/artifacts_finder/auth/gcp_credentials.py,sha256=RXK1U_d1wHgcpxZESb9NziWVTeRQdzDHhw5SFy1eRYg,3760
|
|
37
|
+
qubership_pipelines_common_library/v2/artifacts_finder/model/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
38
|
+
qubership_pipelines_common_library/v2/artifacts_finder/model/artifact.py,sha256=5EmS58kOw6TTfilmW1lllpQCgawVPTl-FYOBY2aaedU,776
|
|
39
|
+
qubership_pipelines_common_library/v2/artifacts_finder/model/artifact_provider.py,sha256=vLGLcOYKejII4aIZWXdrP_xpPPK0kUPUz9wm2e7Y3CI,1171
|
|
40
|
+
qubership_pipelines_common_library/v2/artifacts_finder/model/credentials.py,sha256=O5T-hiJ2QXIo1flInywkhUKFusrgLkKMLu38EGjNPXk,415
|
|
41
|
+
qubership_pipelines_common_library/v2/artifacts_finder/model/credentials_provider.py,sha256=eLQoVmZJND73A5ATXWgtldcNzZtmJYiEznLu7-Qywgk,588
|
|
42
|
+
qubership_pipelines_common_library/v2/artifacts_finder/providers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
43
|
+
qubership_pipelines_common_library/v2/artifacts_finder/providers/artifactory.py,sha256=sd0Pqwyr7yJ7vEEPcgXB4tW0PcANW-JSanWqiK5WGQ8,2338
|
|
44
|
+
qubership_pipelines_common_library/v2/artifacts_finder/providers/aws_code_artifact.py,sha256=kM1w5ZIXyNWqUfhpIjPNWIN84TFW4MnYVvXm4R5XGDY,3908
|
|
45
|
+
qubership_pipelines_common_library/v2/artifacts_finder/providers/azure_artifacts.py,sha256=TvXeyORDKbwgAvseDAYoKuckqo-dA5NTGAWaYrKkofc,5150
|
|
46
|
+
qubership_pipelines_common_library/v2/artifacts_finder/providers/gcp_artifact_registry.py,sha256=STADO5wILFqzfQqax-u89h4XexLH6QuUSJ5kEHZyzJ0,2401
|
|
47
|
+
qubership_pipelines_common_library/v2/artifacts_finder/providers/nexus.py,sha256=8RYW2BmMYcMnkPEwm2jbS1sfEP7mSW1k7aPUgwerXSA,1929
|
|
48
|
+
qubership_pipelines_common_library/v2/extensions/pipeline_data_importer.py,sha256=3I6hvqZy19kZsjhhqaluBFoaGBeDeF0DVOmXjYwibAA,784
|
|
49
|
+
qubership_pipelines_common_library/v2/github/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
50
|
+
qubership_pipelines_common_library/v2/github/github_client.py,sha256=8ZLFnJDXveoxS4-agiYTqv0sZFDT7FCvMRfIln51QnQ,142
|
|
51
|
+
qubership_pipelines_common_library/v2/github/github_pipeline_data_importer.py,sha256=BXq549psTvErvUYOrx38QkpglgZg-TH10TfGk0PcQxE,1035
|
|
52
|
+
qubership_pipelines_common_library/v2/github/github_run_pipeline_command.py,sha256=h9Ldt3RVBBMGWZa_fHoTg4Z016isIsF3pzFCGrtN6bM,11242
|
|
53
|
+
qubership_pipelines_common_library/v2/github/safe_github_client.py,sha256=tS6Huv5K_lkv4mKAY3Uw0PoG21kJkrXQ9e1NdGLvpws,1295
|
|
54
|
+
qubership_pipelines_common_library/v2/gitlab/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
55
|
+
qubership_pipelines_common_library/v2/gitlab/custom_extensions.py,sha256=Va7BU0sh74hz2A2xniM2F709MHfE5v_4X6nIIGUMLTc,5627
|
|
56
|
+
qubership_pipelines_common_library/v2/gitlab/gitlab_client.py,sha256=OdAZOZbLwpfxLqvqDMT3uGdNxD1SfRKAWyemIr7lVss,1707
|
|
57
|
+
qubership_pipelines_common_library/v2/gitlab/gitlab_pipeline_data_importer.py,sha256=eWB92mGQl5L2XQpUnzpAPTVFm-p8k6H6LMF6T4VkR7o,1413
|
|
58
|
+
qubership_pipelines_common_library/v2/gitlab/gitlab_run_pipeline_command.py,sha256=IIpImf-aSBqMrtWK4S69QaF0_TscjG5MV4eDsF_LFrw,11829
|
|
59
|
+
qubership_pipelines_common_library/v2/gitlab/safe_gitlab_client.py,sha256=Ptlmgw5OCO0S24B-fAVxSdBO1yxx0LadVTLZXyhOwuI,1813
|
|
60
|
+
qubership_pipelines_common_library/v2/jenkins/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
61
|
+
qubership_pipelines_common_library/v2/jenkins/custom_extensions.py,sha256=CeNEp1ZCMGobKyZy88XuW3hntji4iZ1SgvMDJCGNobE,3732
|
|
62
|
+
qubership_pipelines_common_library/v2/jenkins/jenkins_client.py,sha256=h-EWIBYHxJ4FEv26N6ZKTJ7x4K3tgEvJ2EhN-gBzkgk,147
|
|
63
|
+
qubership_pipelines_common_library/v2/jenkins/jenkins_pipeline_data_importer.py,sha256=zWNejXoAw1y25Jf6cl6f7UhwnJsyEK87hw7MDdoL0Mk,1572
|
|
64
|
+
qubership_pipelines_common_library/v2/jenkins/jenkins_run_pipeline_command.py,sha256=7ws_V2QO8QwpOKUtgl8PbcnhsUo_pHruue-if-79ee8,10136
|
|
65
|
+
qubership_pipelines_common_library/v2/jenkins/safe_jenkins_client.py,sha256=PD1BaF4TbvzIy49g3EdxsliRyUp_zy6TFAuhBt29FEw,620
|
|
66
|
+
qubership_pipelines_common_library/v2/podman/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
67
|
+
qubership_pipelines_common_library/v2/podman/podman_command.md,sha256=EKctWLIXZhoaxe579f-OgqFfjISk2UYgFD8JyzJeAVU,6500
|
|
68
|
+
qubership_pipelines_common_library/v2/podman/podman_command.py,sha256=o78MYtieAD4rdOyRQEioQREhhw0e0Zqa1kNyygvOOSI,15541
|
|
69
|
+
qubership_pipelines_common_library/v2/sops/sops_client.py,sha256=vB1czEqIQ6aRywkfvIQfqGZOTtPy39cnOExhfJbPw4s,4946
|
|
70
|
+
qubership_pipelines_common_library/v2/utils/crypto_utils.py,sha256=zZ32IJY7WKzJEJNyZQVCPdWC4uujo6goR0MyzBAhn78,1504
|
|
71
|
+
qubership_pipelines_common_library/v2/utils/extension_utils.py,sha256=-OyT6xrIg-PdHHy2Y712rbOAB6Q7WXTqGwP7oVne4k4,965
|
|
72
|
+
qubership_pipelines_common_library/v2/utils/retry_decorator.py,sha256=ItYYL7zam4LrpQrsihis_n6aFCAa32ZAOKKSmxkaENM,4391
|
|
73
|
+
qubership_pipelines_common_library-2.0.1.dist-info/METADATA,sha256=leOGiAkgcUaDCECQTxt3p0jzG1vOSno68GLK4UXPr7U,3063
|
|
74
|
+
qubership_pipelines_common_library-2.0.1.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
|
|
75
|
+
qubership_pipelines_common_library-2.0.1.dist-info/licenses/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
|
|
76
|
+
qubership_pipelines_common_library-2.0.1.dist-info/RECORD,,
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
qubership_pipelines_common_library/__init__.py,sha256=91r6ljRCMIXiH1mE5cME45OstbTMJTicNEbTpGgJjQY,703
|
|
2
|
-
qubership_pipelines_common_library/v1/__init__.py,sha256=QczIlSYNOtXMuMWSznhV_BkXMM5KLn1wOogtlT2kcy0,598
|
|
3
|
-
qubership_pipelines_common_library/v1/artifactory_client.py,sha256=Gwf21BXUYNpKT_Y_wMyM07WlpDNTIBSUkSIsJlWfURg,4105
|
|
4
|
-
qubership_pipelines_common_library/v1/execution/__init__.py,sha256=QczIlSYNOtXMuMWSznhV_BkXMM5KLn1wOogtlT2kcy0,598
|
|
5
|
-
qubership_pipelines_common_library/v1/execution/exec_command.py,sha256=q499vODvHg4oP5Bd6xCAjrAMjTKtMZLGE5njth7vuY0,3317
|
|
6
|
-
qubership_pipelines_common_library/v1/execution/exec_context.py,sha256=R9Kmb4t3QRXCJTMhC3qcPtxtyvCrIV037Ix9P_VD5YI,6055
|
|
7
|
-
qubership_pipelines_common_library/v1/execution/exec_context_file.py,sha256=kbuL9mA21qhaueVe6SWvI3OM49Ekrm8v1lj1FFspBq4,7397
|
|
8
|
-
qubership_pipelines_common_library/v1/execution/exec_info.py,sha256=RsHaSdzAnOzR5XRlpU2F0IYkEAcaWBEONDlkgUPpFWs,4102
|
|
9
|
-
qubership_pipelines_common_library/v1/execution/exec_logger.py,sha256=rtSCLo3mqtwIc2S_tBs0uizehdthBGfygB1Vpwa-sRA,3102
|
|
10
|
-
qubership_pipelines_common_library/v1/git_client.py,sha256=uop4dREW0HoaAbGHSzp3P4vk1Hk-VrPK5RhAP3Hj51o,6100
|
|
11
|
-
qubership_pipelines_common_library/v1/github_client.py,sha256=cyAbPau94XfpVVvgRVk7sVgPWtp4Q-Bx-6HHgjQG3Xc,14607
|
|
12
|
-
qubership_pipelines_common_library/v1/gitlab_client.py,sha256=aKvkBRDIxyZ7TG0_AP8SXM2f4sgk7BCL1ZL2JKG-nEc,8658
|
|
13
|
-
qubership_pipelines_common_library/v1/jenkins_client.py,sha256=VsD4KQNmLTeFvyVnY0m1xPv3s5bb-sNbgO6SwTJ2FfY,8597
|
|
14
|
-
qubership_pipelines_common_library/v1/kube_client.py,sha256=rbdc0Q2r6AhJ49FKr-15_1r9Uit4_6U68rWwGYDjdWc,12715
|
|
15
|
-
qubership_pipelines_common_library/v1/log_client.py,sha256=DTJ8aI_37l570RyolDC2cHaOkkccZWi7cFE6qYUuQeo,1514
|
|
16
|
-
qubership_pipelines_common_library/v1/maven_client.py,sha256=DbyPp6lh17op04GGeq2jIbk-SyVzCCHRcr2ox-eUv54,15054
|
|
17
|
-
qubership_pipelines_common_library/v1/minio_client.py,sha256=4KlkCJvtgGKQOujChxRtKrpoZVukooMLfj5D8C9CKC4,4343
|
|
18
|
-
qubership_pipelines_common_library/v1/utils/__init__.py,sha256=QczIlSYNOtXMuMWSznhV_BkXMM5KLn1wOogtlT2kcy0,598
|
|
19
|
-
qubership_pipelines_common_library/v1/utils/rest.py,sha256=MaCS6L6Khs_HaWoi3WNj9Go33d9zEVErLP5T8iVRyHA,3068
|
|
20
|
-
qubership_pipelines_common_library/v1/utils/utils.py,sha256=5PhXyFC1Zfuz0KDrWC9QgacTLVVk8zu0-6wxYS0bmzE,1865
|
|
21
|
-
qubership_pipelines_common_library/v1/utils/utils_aws.py,sha256=BPPnHBzPPXPqFijtAiw16sTPu1tFZjS95GkSMX_HdjA,808
|
|
22
|
-
qubership_pipelines_common_library/v1/utils/utils_cli.py,sha256=3b4SbAKUearf2d_W6S8kuMNaB_Up1Qiblm8Nc5DHEqE,3199
|
|
23
|
-
qubership_pipelines_common_library/v1/utils/utils_context.py,sha256=IlMFXGxS8zJw33Gu3SbOUcj88wquIkobBlWkdFbR7MA,3767
|
|
24
|
-
qubership_pipelines_common_library/v1/utils/utils_dictionary.py,sha256=6wGAoBmLzPGGqdtkoqU9RtMBYuOO-UkZsZDh7GzubjA,1365
|
|
25
|
-
qubership_pipelines_common_library/v1/utils/utils_file.py,sha256=6tCGosFjtycGJq0LtR53MiAyR8-VAxiT0-1quJ6FhcE,2233
|
|
26
|
-
qubership_pipelines_common_library/v1/utils/utils_json.py,sha256=QczIlSYNOtXMuMWSznhV_BkXMM5KLn1wOogtlT2kcy0,598
|
|
27
|
-
qubership_pipelines_common_library/v1/utils/utils_string.py,sha256=Phx5ZXPRjhjg9AaSPx6WLX9zQvwJH1txslfnG3jJ43w,993
|
|
28
|
-
qubership_pipelines_common_library/v1/webex_client.py,sha256=JU_0NgLu_p6zgaUi-ixgZeFMlJaTAvXwrU1oA607Bv0,2997
|
|
29
|
-
qubership_pipelines_common_library-0.2.6.dist-info/METADATA,sha256=DM_ePVDk5_z7ZmrEj1_cjN8Gw6l4URj8mTsIZauKYw8,3017
|
|
30
|
-
qubership_pipelines_common_library-0.2.6.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
|
|
31
|
-
qubership_pipelines_common_library-0.2.6.dist-info/licenses/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
|
|
32
|
-
qubership_pipelines_common_library-0.2.6.dist-info/RECORD,,
|
|
File without changes
|