krkn-lib 5.1.13__tar.gz → 6.0.1__tar.gz
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.
- {krkn_lib-5.1.13 → krkn_lib-6.0.1}/PKG-INFO +5 -9
- {krkn_lib-5.1.13 → krkn_lib-6.0.1}/pyproject.toml +4 -4
- krkn_lib-6.0.1/src/krkn_lib/aws_tests/__init__.py +1 -0
- {krkn_lib-5.1.13 → krkn_lib-6.0.1}/src/krkn_lib/elastic/krkn_elastic.py +3 -1
- {krkn_lib-5.1.13 → krkn_lib-6.0.1}/src/krkn_lib/k8s/krkn_kubernetes.py +72 -58
- {krkn_lib-5.1.13 → krkn_lib-6.0.1}/src/krkn_lib/k8s/pod_monitor/__init__.py +1 -2
- {krkn_lib-5.1.13 → krkn_lib-6.0.1}/src/krkn_lib/k8s/pod_monitor/pod_monitor.py +7 -5
- {krkn_lib-5.1.13 → krkn_lib-6.0.1}/src/krkn_lib/k8s/templates/snapshot.j2 +1 -1
- {krkn_lib-5.1.13 → krkn_lib-6.0.1}/src/krkn_lib/models/k8s/models.py +1 -1
- {krkn_lib-5.1.13 → krkn_lib-6.0.1}/src/krkn_lib/models/pod_monitor/models.py +2 -2
- {krkn_lib-5.1.13 → krkn_lib-6.0.1}/src/krkn_lib/ocp/krkn_openshift.py +4 -4
- {krkn_lib-5.1.13 → krkn_lib-6.0.1}/src/krkn_lib/prometheus/krkn_prometheus.py +1 -1
- {krkn_lib-5.1.13 → krkn_lib-6.0.1}/src/krkn_lib/telemetry/k8s/krkn_telemetry_kubernetes.py +1 -1
- {krkn_lib-5.1.13 → krkn_lib-6.0.1}/src/krkn_lib/telemetry/ocp/krkn_telemetry_openshift.py +1 -1
- {krkn_lib-5.1.13 → krkn_lib-6.0.1}/src/krkn_lib/tests/base_test.py +4 -4
- {krkn_lib-5.1.13 → krkn_lib-6.0.1}/src/krkn_lib/tests/test_krkn_elastic_models.py +2 -4
- {krkn_lib-5.1.13 → krkn_lib-6.0.1}/src/krkn_lib/tests/test_krkn_kubernetes_check.py +3 -2
- {krkn_lib-5.1.13 → krkn_lib-6.0.1}/src/krkn_lib/tests/test_krkn_kubernetes_create.py +5 -3
- {krkn_lib-5.1.13 → krkn_lib-6.0.1}/src/krkn_lib/tests/test_krkn_kubernetes_delete.py +3 -2
- {krkn_lib-5.1.13 → krkn_lib-6.0.1}/src/krkn_lib/tests/test_krkn_kubernetes_get.py +5 -4
- {krkn_lib-5.1.13 → krkn_lib-6.0.1}/src/krkn_lib/tests/test_krkn_kubernetes_misc.py +3 -3
- {krkn_lib-5.1.13 → krkn_lib-6.0.1}/src/krkn_lib/tests/test_krkn_kubernetes_pods_monitor_models.py +3 -4
- {krkn_lib-5.1.13 → krkn_lib-6.0.1}/src/krkn_lib/tests/test_krkn_kubernetes_virt.py +91 -146
- {krkn_lib-5.1.13 → krkn_lib-6.0.1}/src/krkn_lib/tests/test_krkn_openshift.py +7 -6
- {krkn_lib-5.1.13 → krkn_lib-6.0.1}/src/krkn_lib/tests/test_krkn_telemetry_kubernetes.py +1 -3
- {krkn_lib-5.1.13 → krkn_lib-6.0.1}/src/krkn_lib/tests/test_safe_logger.py +3 -1
- {krkn_lib-5.1.13 → krkn_lib-6.0.1}/src/krkn_lib/tests/test_utils.py +4 -5
- {krkn_lib-5.1.13 → krkn_lib-6.0.1}/src/krkn_lib/utils/functions.py +4 -3
- krkn_lib-6.0.1/src/krkn_lib/version/version.py +6 -0
- krkn_lib-5.1.13/src/krkn_lib/aws_tests/__init__.py +0 -1
- krkn_lib-5.1.13/src/krkn_lib/version/version.py +0 -3
- {krkn_lib-5.1.13 → krkn_lib-6.0.1}/LICENSE +0 -0
- {krkn_lib-5.1.13 → krkn_lib-6.0.1}/README.md +0 -0
- {krkn_lib-5.1.13 → krkn_lib-6.0.1}/src/krkn_lib/__init__.py +0 -0
- {krkn_lib-5.1.13 → krkn_lib-6.0.1}/src/krkn_lib/aws_tests/test_krkn_telemetry_kubernetes.py +0 -0
- {krkn_lib-5.1.13 → krkn_lib-6.0.1}/src/krkn_lib/aws_tests/test_krkn_telemetry_openshift.py +0 -0
- {krkn_lib-5.1.13 → krkn_lib-6.0.1}/src/krkn_lib/elastic/__init__.py +0 -0
- {krkn_lib-5.1.13 → krkn_lib-6.0.1}/src/krkn_lib/k8s/__init__.py +0 -0
- {krkn_lib-5.1.13 → krkn_lib-6.0.1}/src/krkn_lib/k8s/templates/hog_pod.j2 +0 -0
- {krkn_lib-5.1.13 → krkn_lib-6.0.1}/src/krkn_lib/k8s/templates/node_exec_pod.j2 +0 -0
- {krkn_lib-5.1.13 → krkn_lib-6.0.1}/src/krkn_lib/k8s/templates/service_hijacking_config_map.j2 +0 -0
- {krkn_lib-5.1.13 → krkn_lib-6.0.1}/src/krkn_lib/k8s/templates/service_hijacking_pod.j2 +0 -0
- {krkn_lib-5.1.13 → krkn_lib-6.0.1}/src/krkn_lib/k8s/templates/syn_flood_pod.j2 +0 -0
- {krkn_lib-5.1.13 → krkn_lib-6.0.1}/src/krkn_lib/models/__init__.py +0 -0
- {krkn_lib-5.1.13 → krkn_lib-6.0.1}/src/krkn_lib/models/elastic/__init__.py +0 -0
- {krkn_lib-5.1.13 → krkn_lib-6.0.1}/src/krkn_lib/models/elastic/models.py +1 -1
- {krkn_lib-5.1.13 → krkn_lib-6.0.1}/src/krkn_lib/models/k8s/__init__.py +0 -0
- {krkn_lib-5.1.13 → krkn_lib-6.0.1}/src/krkn_lib/models/krkn/__init__.py +0 -0
- {krkn_lib-5.1.13 → krkn_lib-6.0.1}/src/krkn_lib/models/krkn/models.py +0 -0
- {krkn_lib-5.1.13 → krkn_lib-6.0.1}/src/krkn_lib/models/pod_monitor/__init__.py +0 -0
- {krkn_lib-5.1.13 → krkn_lib-6.0.1}/src/krkn_lib/models/telemetry/__init__.py +0 -0
- {krkn_lib-5.1.13 → krkn_lib-6.0.1}/src/krkn_lib/models/telemetry/models.py +0 -0
- {krkn_lib-5.1.13 → krkn_lib-6.0.1}/src/krkn_lib/ocp/__init__.py +0 -0
- {krkn_lib-5.1.13 → krkn_lib-6.0.1}/src/krkn_lib/prometheus/__init__.py +0 -0
- {krkn_lib-5.1.13 → krkn_lib-6.0.1}/src/krkn_lib/telemetry/__init__.py +0 -0
- {krkn_lib-5.1.13 → krkn_lib-6.0.1}/src/krkn_lib/telemetry/k8s/__init__.py +0 -0
- {krkn_lib-5.1.13 → krkn_lib-6.0.1}/src/krkn_lib/telemetry/ocp/__init__.py +0 -0
- {krkn_lib-5.1.13 → krkn_lib-6.0.1}/src/krkn_lib/tests/__init__.py +0 -0
- {krkn_lib-5.1.13 → krkn_lib-6.0.1}/src/krkn_lib/tests/test_krkn_elastic.py +0 -0
- {krkn_lib-5.1.13 → krkn_lib-6.0.1}/src/krkn_lib/tests/test_krkn_kubernetes_exec.py +0 -0
- {krkn_lib-5.1.13 → krkn_lib-6.0.1}/src/krkn_lib/tests/test_krkn_kubernetes_list.py +0 -0
- {krkn_lib-5.1.13 → krkn_lib-6.0.1}/src/krkn_lib/tests/test_krkn_kubernetes_models.py +1 -1
- {krkn_lib-5.1.13 → krkn_lib-6.0.1}/src/krkn_lib/tests/test_krkn_kubernetes_pods_monitor.py +0 -0
- {krkn_lib-5.1.13 → krkn_lib-6.0.1}/src/krkn_lib/tests/test_krkn_prometheus.py +0 -0
- {krkn_lib-5.1.13 → krkn_lib-6.0.1}/src/krkn_lib/tests/test_krkn_telemetry_models.py +0 -0
- {krkn_lib-5.1.13 → krkn_lib-6.0.1}/src/krkn_lib/tests/test_version.py +0 -0
- {krkn_lib-5.1.13 → krkn_lib-6.0.1}/src/krkn_lib/utils/__init__.py +0 -0
- {krkn_lib-5.1.13 → krkn_lib-6.0.1}/src/krkn_lib/utils/safe_logger.py +0 -0
- {krkn_lib-5.1.13 → krkn_lib-6.0.1}/src/krkn_lib/version/__init__.py +0 -0
|
@@ -1,19 +1,16 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.1
|
|
2
2
|
Name: krkn-lib
|
|
3
|
-
Version:
|
|
3
|
+
Version: 6.0.1
|
|
4
4
|
Summary: Foundation library for Kraken
|
|
5
|
+
Home-page: https://github.com/redhat-chaos/krkn
|
|
5
6
|
License: Apache-2.0
|
|
6
|
-
License-File: LICENSE
|
|
7
7
|
Author: Red Hat Chaos Team
|
|
8
|
-
Requires-Python: >=3.
|
|
8
|
+
Requires-Python: >=3.11,<4.0
|
|
9
9
|
Classifier: License :: OSI Approved :: Apache Software License
|
|
10
10
|
Classifier: Programming Language :: Python :: 3
|
|
11
|
-
Classifier: Programming Language :: Python :: 3.9
|
|
12
|
-
Classifier: Programming Language :: Python :: 3.10
|
|
13
11
|
Classifier: Programming Language :: Python :: 3.11
|
|
14
12
|
Classifier: Programming Language :: Python :: 3.12
|
|
15
13
|
Classifier: Programming Language :: Python :: 3.13
|
|
16
|
-
Classifier: Programming Language :: Python :: 3.14
|
|
17
14
|
Requires-Dist: PyYAML (==6.0.1)
|
|
18
15
|
Requires-Dist: base64io (>=1.0.3,<2.0.0)
|
|
19
16
|
Requires-Dist: coverage (>=7.6.12,<8.0.0)
|
|
@@ -31,8 +28,7 @@ Requires-Dist: requests (>=2.29.0,<3.0.0)
|
|
|
31
28
|
Requires-Dist: sphinx-rtd-theme (>=1.2.2,<2.0.0)
|
|
32
29
|
Requires-Dist: sphinxnotes-markdown-builder (>=0.5.6,<0.6.0)
|
|
33
30
|
Requires-Dist: tzlocal (==5.1)
|
|
34
|
-
Requires-Dist: wheel (
|
|
35
|
-
Project-URL: Homepage, https://github.com/redhat-chaos/krkn
|
|
31
|
+
Requires-Dist: wheel (==0.46.2)
|
|
36
32
|
Description-Content-Type: text/markdown
|
|
37
33
|
|
|
38
34
|

|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[tool.poetry]
|
|
2
2
|
name = "krkn-lib"
|
|
3
|
-
version = "
|
|
3
|
+
version = "6.0.1"
|
|
4
4
|
description = "Foundation library for Kraken"
|
|
5
5
|
authors = ["Red Hat Chaos Team"]
|
|
6
6
|
license = "Apache-2.0"
|
|
@@ -9,7 +9,7 @@ homepage = "https://github.com/redhat-chaos/krkn"
|
|
|
9
9
|
#packages = [{include= "src/krkn_lib"}]
|
|
10
10
|
|
|
11
11
|
[tool.poetry.dependencies]
|
|
12
|
-
python = "^3.
|
|
12
|
+
python = "^3.11"
|
|
13
13
|
kubernetes ="34.1.0"
|
|
14
14
|
sphinxnotes-markdown-builder="^0.5.6"
|
|
15
15
|
requests="^2.29.0"
|
|
@@ -22,7 +22,7 @@ PyYAML = "6.0.1"
|
|
|
22
22
|
prometheus-api-client = "^0.5.4"
|
|
23
23
|
elasticsearch = "7.13.4"
|
|
24
24
|
elasticsearch-dsl = "7.4.1"
|
|
25
|
-
wheel = "
|
|
25
|
+
wheel = "0.46.2"
|
|
26
26
|
cython = "3.0"
|
|
27
27
|
numpy= "1.26.4"
|
|
28
28
|
deprecation="2.1.0"
|
|
@@ -35,7 +35,7 @@ boto3 = "^1.28.12"
|
|
|
35
35
|
|
|
36
36
|
[tool.black]
|
|
37
37
|
line-length = 79
|
|
38
|
-
target-version = ['
|
|
38
|
+
target-version = ['py311', 'py312']
|
|
39
39
|
include = '\.pyi?$'
|
|
40
40
|
exclude = '''
|
|
41
41
|
/(
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
from ..tests.base_test import * # NOQA
|
|
@@ -53,7 +53,9 @@ class KrknElastic:
|
|
|
53
53
|
ssl_show_warn=False,
|
|
54
54
|
)
|
|
55
55
|
except Exception as e:
|
|
56
|
-
self.safe_logger.error(
|
|
56
|
+
self.safe_logger.error(
|
|
57
|
+
"Failed to initialize elasticsearch: %s" % e
|
|
58
|
+
)
|
|
57
59
|
raise e
|
|
58
60
|
|
|
59
61
|
def upload_data_to_elasticsearch(self, item: dict, index: str = "") -> int:
|
|
@@ -159,10 +159,16 @@ class KrknKubernetes:
|
|
|
159
159
|
os.environ["HTTP_PROXY"] = http_proxy
|
|
160
160
|
self.client_config.proxy = http_proxy
|
|
161
161
|
proxy_auth = urlparse(http_proxy)
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
)
|
|
162
|
+
if (
|
|
163
|
+
proxy_auth.username is not None
|
|
164
|
+
and proxy_auth.password is not None
|
|
165
|
+
):
|
|
166
|
+
auth_string = (
|
|
167
|
+
proxy_auth.username + ":" + proxy_auth.password
|
|
168
|
+
)
|
|
169
|
+
self.client_config.proxy_headers = (
|
|
170
|
+
urllib3.util.make_headers(proxy_basic_auth=auth_string)
|
|
171
|
+
)
|
|
166
172
|
|
|
167
173
|
client.Configuration.set_default(self.client_config)
|
|
168
174
|
self.watch_resource = watch.Watch()
|
|
@@ -185,7 +191,7 @@ class KrknKubernetes:
|
|
|
185
191
|
on other distributions
|
|
186
192
|
|
|
187
193
|
*** IT MUST BE CONSIDERED A PRIVATE METHOD (CANNOT USE
|
|
188
|
-
*** DOUBLE UNDERSCORE TO
|
|
194
|
+
*** DOUBLE UNDERSCORE TO MAINTAIN IT VISIBLE ON SUB-CLASSES)
|
|
189
195
|
*** USED IN KrknKubernetes and KrknOpenshift TO AUTODETECT
|
|
190
196
|
*** THE CLUSTER TYPE
|
|
191
197
|
|
|
@@ -237,7 +243,10 @@ class KrknKubernetes:
|
|
|
237
243
|
minor_version = api_response.minor
|
|
238
244
|
return major_version + "." + minor_version
|
|
239
245
|
except ApiException as e:
|
|
240
|
-
|
|
246
|
+
logging.error(
|
|
247
|
+
"Exception when calling VersionApi->get_code: %s", str(e)
|
|
248
|
+
)
|
|
249
|
+
raise e
|
|
241
250
|
|
|
242
251
|
def get_host(self) -> str:
|
|
243
252
|
"""
|
|
@@ -874,7 +883,7 @@ class KrknKubernetes:
|
|
|
874
883
|
services.append(serv.metadata.name)
|
|
875
884
|
return services
|
|
876
885
|
|
|
877
|
-
# Outputs a json blob with
|
|
886
|
+
# Outputs a json blob with information about all pods in a given namespace
|
|
878
887
|
def get_all_pod_info(
|
|
879
888
|
self,
|
|
880
889
|
namespace: str = "default",
|
|
@@ -978,7 +987,7 @@ class KrknKubernetes:
|
|
|
978
987
|
:param command: command parameters list or full command string
|
|
979
988
|
if the command must be piped to `bash -c`
|
|
980
989
|
(in that case `base_command` parameter
|
|
981
|
-
must
|
|
990
|
+
must be omitted`)
|
|
982
991
|
:param pod_name: pod where the command must be executed
|
|
983
992
|
:param namespace: namespace of the pod
|
|
984
993
|
:param container: container where the command
|
|
@@ -1038,7 +1047,7 @@ class KrknKubernetes:
|
|
|
1038
1047
|
:param command: command parameters list or full command string
|
|
1039
1048
|
if the command must be piped to `bash -c`
|
|
1040
1049
|
(in that case `base_command` parameter
|
|
1041
|
-
must
|
|
1050
|
+
must be omitted`)
|
|
1042
1051
|
:param pod_name: pod where the command must be executed
|
|
1043
1052
|
:param namespace: namespace of the pod
|
|
1044
1053
|
:param container: container where the command
|
|
@@ -1093,7 +1102,7 @@ class KrknKubernetes:
|
|
|
1093
1102
|
)
|
|
1094
1103
|
except Exception as e:
|
|
1095
1104
|
raise e
|
|
1096
|
-
# apparently stream API doesn't
|
|
1105
|
+
# apparently stream API doesn't raise an Exception
|
|
1097
1106
|
# if the command fails to be executed
|
|
1098
1107
|
|
|
1099
1108
|
if "OCI runtime exec failed" in ret:
|
|
@@ -1486,7 +1495,9 @@ class KrknKubernetes:
|
|
|
1486
1495
|
raise
|
|
1487
1496
|
return vmis_list
|
|
1488
1497
|
|
|
1489
|
-
def create_vmi(
|
|
1498
|
+
def create_vmi(
|
|
1499
|
+
self, name: str, namespace: str, vm_name: str, vmi_body: dict
|
|
1500
|
+
) -> Optional[Dict]:
|
|
1490
1501
|
"""
|
|
1491
1502
|
Create a Virtual Machine Instance by name and namespace.
|
|
1492
1503
|
|
|
@@ -1501,13 +1512,14 @@ class KrknKubernetes:
|
|
|
1501
1512
|
version="v1",
|
|
1502
1513
|
namespace=namespace,
|
|
1503
1514
|
plural="virtualmachineinstances",
|
|
1504
|
-
name=name,
|
|
1505
1515
|
body=vmi_body,
|
|
1506
1516
|
)
|
|
1507
1517
|
return vmi
|
|
1508
1518
|
except ApiException as e:
|
|
1509
1519
|
if e.status == 404:
|
|
1510
|
-
logging.warning(
|
|
1520
|
+
logging.warning(
|
|
1521
|
+
f"VMI {name} not found in namespace {namespace}"
|
|
1522
|
+
)
|
|
1511
1523
|
return None
|
|
1512
1524
|
else:
|
|
1513
1525
|
logging.error(f"Error creating VMI {name}: {e}")
|
|
@@ -1516,7 +1528,9 @@ class KrknKubernetes:
|
|
|
1516
1528
|
logging.error(f"Unexpected error creating VMI {name}: {e}")
|
|
1517
1529
|
raise
|
|
1518
1530
|
|
|
1519
|
-
def patch_vm(
|
|
1531
|
+
def patch_vm(
|
|
1532
|
+
self, name: str, namespace: str, vm_body: dict
|
|
1533
|
+
) -> Optional[Dict]:
|
|
1520
1534
|
"""
|
|
1521
1535
|
Patch a Virtual Machine by name and namespace.
|
|
1522
1536
|
|
|
@@ -1537,7 +1551,9 @@ class KrknKubernetes:
|
|
|
1537
1551
|
return vmi
|
|
1538
1552
|
except ApiException as e:
|
|
1539
1553
|
if e.status == 404:
|
|
1540
|
-
logging.warning(
|
|
1554
|
+
logging.warning(
|
|
1555
|
+
f"VM {name} not found in namespace {namespace}"
|
|
1556
|
+
)
|
|
1541
1557
|
return None
|
|
1542
1558
|
else:
|
|
1543
1559
|
logging.error(f"Error patching VM {name}: {e}")
|
|
@@ -1546,7 +1562,9 @@ class KrknKubernetes:
|
|
|
1546
1562
|
logging.error(f"Unexpected error patching VM {name}: {e}")
|
|
1547
1563
|
raise
|
|
1548
1564
|
|
|
1549
|
-
def patch_vmi(
|
|
1565
|
+
def patch_vmi(
|
|
1566
|
+
self, name: str, namespace: str, vmi_body: dict
|
|
1567
|
+
) -> Optional[Dict]:
|
|
1550
1568
|
"""
|
|
1551
1569
|
Patch a Virtual Machine Instance by name and namespace.
|
|
1552
1570
|
|
|
@@ -1567,7 +1585,9 @@ class KrknKubernetes:
|
|
|
1567
1585
|
return vmi
|
|
1568
1586
|
except ApiException as e:
|
|
1569
1587
|
if e.status == 404:
|
|
1570
|
-
logging.warning(
|
|
1588
|
+
logging.warning(
|
|
1589
|
+
f"VMI {name} not found in namespace {namespace}"
|
|
1590
|
+
)
|
|
1571
1591
|
return None
|
|
1572
1592
|
else:
|
|
1573
1593
|
logging.error(f"Error patching VMI {name}: {e}")
|
|
@@ -1613,7 +1633,7 @@ class KrknKubernetes:
|
|
|
1613
1633
|
except Exception as e:
|
|
1614
1634
|
logging.error(f"Unexpected error getting VM {regex_name}: {e}")
|
|
1615
1635
|
raise
|
|
1616
|
-
|
|
1636
|
+
|
|
1617
1637
|
def get_snapshot(self, name: str, namespace: str) -> Optional[Dict]:
|
|
1618
1638
|
"""
|
|
1619
1639
|
Get a Snapshot by name and namespace.
|
|
@@ -1623,25 +1643,25 @@ class KrknKubernetes:
|
|
|
1623
1643
|
:return: The Snapshot object if found, None otherwise
|
|
1624
1644
|
"""
|
|
1625
1645
|
try:
|
|
1626
|
-
|
|
1627
|
-
group="kubevirt.io",
|
|
1628
|
-
version="
|
|
1646
|
+
snapshot = self.custom_object_client.get_namespaced_custom_object(
|
|
1647
|
+
group="snapshot.kubevirt.io",
|
|
1648
|
+
version="v1beta1",
|
|
1629
1649
|
namespace=namespace,
|
|
1630
|
-
plural="
|
|
1650
|
+
plural="virtualmachinesnapshots",
|
|
1631
1651
|
name=name,
|
|
1632
1652
|
)
|
|
1633
|
-
return
|
|
1653
|
+
return snapshot
|
|
1634
1654
|
except ApiException as e:
|
|
1635
1655
|
if e.status == 404:
|
|
1636
1656
|
logging.warning(
|
|
1637
|
-
f"
|
|
1657
|
+
f"SnapShot {name} not found in namespace {namespace}"
|
|
1638
1658
|
)
|
|
1639
1659
|
return None
|
|
1640
1660
|
else:
|
|
1641
|
-
logging.error(f"Error getting
|
|
1661
|
+
logging.error(f"Error getting snapshot {name}: {e}")
|
|
1642
1662
|
raise
|
|
1643
1663
|
except Exception as e:
|
|
1644
|
-
logging.error(f"Unexpected error getting
|
|
1664
|
+
logging.error(f"Unexpected error getting snapshot {name}: {e}")
|
|
1645
1665
|
raise
|
|
1646
1666
|
|
|
1647
1667
|
def create_snapshot(
|
|
@@ -1664,24 +1684,20 @@ class KrknKubernetes:
|
|
|
1664
1684
|
name=name, namespace=namespace, vm_name=vm_name
|
|
1665
1685
|
)
|
|
1666
1686
|
)
|
|
1667
|
-
|
|
1668
|
-
|
|
1669
|
-
|
|
1670
|
-
|
|
1671
|
-
|
|
1672
|
-
|
|
1673
|
-
|
|
1687
|
+
snapshot = (
|
|
1688
|
+
self.custom_object_client.create_namespaced_custom_object(
|
|
1689
|
+
group="snapshot.kubevirt.io",
|
|
1690
|
+
version="v1beta1",
|
|
1691
|
+
namespace=namespace,
|
|
1692
|
+
plural="virtualmachinesnapshots",
|
|
1693
|
+
body=ss_body,
|
|
1694
|
+
)
|
|
1674
1695
|
)
|
|
1675
|
-
return
|
|
1696
|
+
return snapshot
|
|
1676
1697
|
except ApiException as e:
|
|
1677
|
-
|
|
1678
|
-
|
|
1679
|
-
|
|
1680
|
-
)
|
|
1681
|
-
return None
|
|
1682
|
-
else:
|
|
1683
|
-
logging.error(f"Error creating Snapshot {name}: {e}")
|
|
1684
|
-
raise
|
|
1698
|
+
|
|
1699
|
+
logging.error(f"Error creating Snapshot {name}: {e}")
|
|
1700
|
+
raise
|
|
1685
1701
|
except Exception as e:
|
|
1686
1702
|
logging.error(f"Unexpected error creating Snapshot {name}: {e}")
|
|
1687
1703
|
raise
|
|
@@ -1766,20 +1782,18 @@ class KrknKubernetes:
|
|
|
1766
1782
|
|
|
1767
1783
|
def delete_snapshot(self, snapshot_name: str, namespace: str):
|
|
1768
1784
|
"""Helper method to delete any snapshot created by the scenario."""
|
|
1769
|
-
|
|
1785
|
+
logging.info(f"Deleting snapshot '{snapshot_name}'...")
|
|
1770
1786
|
try:
|
|
1771
1787
|
self.custom_object_client.delete_namespaced_custom_object(
|
|
1772
|
-
group="kubevirt.io",
|
|
1773
|
-
version="
|
|
1788
|
+
group="snapshot.kubevirt.io",
|
|
1789
|
+
version="v1beta1",
|
|
1774
1790
|
namespace=namespace,
|
|
1775
|
-
plural="
|
|
1791
|
+
plural="virtualmachinesnapshots",
|
|
1776
1792
|
name=snapshot_name,
|
|
1777
1793
|
)
|
|
1778
|
-
|
|
1779
|
-
f"Snapshot '{self.snapshot_name}' deleted successfully."
|
|
1780
|
-
)
|
|
1794
|
+
logging.info(f"Snapshot '{snapshot_name}' deleted successfully.")
|
|
1781
1795
|
except Exception as e:
|
|
1782
|
-
|
|
1796
|
+
logging.warning(
|
|
1783
1797
|
"Failed to delete snapshot, "
|
|
1784
1798
|
f"might have been already deleted: {e}"
|
|
1785
1799
|
)
|
|
@@ -1806,6 +1820,7 @@ class KrknKubernetes:
|
|
|
1806
1820
|
str(e),
|
|
1807
1821
|
)
|
|
1808
1822
|
raise e
|
|
1823
|
+
node_ready_status = "False"
|
|
1809
1824
|
for condition in node_info.status.conditions:
|
|
1810
1825
|
if condition.type == "KernelDeadlock":
|
|
1811
1826
|
node_kerneldeadlock_status = condition.status
|
|
@@ -2379,7 +2394,7 @@ class KrknKubernetes:
|
|
|
2379
2394
|
)
|
|
2380
2395
|
|
|
2381
2396
|
path = f"/api/{api_version}/{resource.name}"
|
|
2382
|
-
|
|
2397
|
+
data = self.api_client.call_api(
|
|
2383
2398
|
path,
|
|
2384
2399
|
"GET",
|
|
2385
2400
|
path_params,
|
|
@@ -2542,7 +2557,6 @@ class KrknKubernetes:
|
|
|
2542
2557
|
else:
|
|
2543
2558
|
node_info.nodes_type = "unknown"
|
|
2544
2559
|
|
|
2545
|
-
node_info.architecture = node.status.node_info.architecture
|
|
2546
2560
|
node_info.architecture = node.status.node_info.architecture
|
|
2547
2561
|
node_info.kernel_version = node.status.node_info.kernel_version
|
|
2548
2562
|
node_info.kubelet_version = (
|
|
@@ -2629,7 +2643,7 @@ class KrknKubernetes:
|
|
|
2629
2643
|
sequential number of the archive assigned to the worker
|
|
2630
2644
|
and the extension tar.b64
|
|
2631
2645
|
:param queue: the queue from which the sequential
|
|
2632
|
-
number
|
|
2646
|
+
number will be popped
|
|
2633
2647
|
:param queue_size: total size of the queue
|
|
2634
2648
|
:param downloaded_file_list: the list of
|
|
2635
2649
|
archive number and local filename downloaded
|
|
@@ -2751,7 +2765,7 @@ class KrknKubernetes:
|
|
|
2751
2765
|
where the temporary archive
|
|
2752
2766
|
will be stored (will be deleted once the download
|
|
2753
2767
|
terminates, must be writable
|
|
2754
|
-
and must have enough space to
|
|
2768
|
+
and must have enough space to temporarily store the archive)
|
|
2755
2769
|
:param target_path: the path that will be archived
|
|
2756
2770
|
and downloaded from the container
|
|
2757
2771
|
:param archive_files_prefix: prefix string that will be added
|
|
@@ -3014,7 +3028,7 @@ class KrknKubernetes:
|
|
|
3014
3028
|
["application/json"]
|
|
3015
3029
|
)
|
|
3016
3030
|
try:
|
|
3017
|
-
|
|
3031
|
+
data = self.api_client.call_api(
|
|
3018
3032
|
path,
|
|
3019
3033
|
"POST",
|
|
3020
3034
|
path_params,
|
|
@@ -3255,7 +3269,7 @@ class KrknKubernetes:
|
|
|
3255
3269
|
default 5000
|
|
3256
3270
|
:param port_name: the port name if the Service is pointing to
|
|
3257
3271
|
a string name instead of a port number
|
|
3258
|
-
:param stats_route: overrides the
|
|
3272
|
+
:param stats_route: overrides the default route where the stats
|
|
3259
3273
|
action will be mapped, change it only if you have a /stats
|
|
3260
3274
|
route in your test_plan
|
|
3261
3275
|
:return: a structure containing all the infos of the
|
|
@@ -3320,7 +3334,7 @@ class KrknKubernetes:
|
|
|
3320
3334
|
|
|
3321
3335
|
def service_exists(self, service_name: str, namespace: str) -> bool:
|
|
3322
3336
|
"""
|
|
3323
|
-
Checks
|
|
3337
|
+
Checks whether a kubernetes Service exist or not
|
|
3324
3338
|
:param service_name: the name of the service to check
|
|
3325
3339
|
:param namespace: the namespace where the service should exist
|
|
3326
3340
|
:return: True if the service exists, False if not
|
|
@@ -3433,7 +3447,7 @@ class KrknKubernetes:
|
|
|
3433
3447
|
["application/json"]
|
|
3434
3448
|
)
|
|
3435
3449
|
path = f"/api/v1/nodes/{node_name}/proxy/stats/summary"
|
|
3436
|
-
|
|
3450
|
+
data = self.api_client.call_api(
|
|
3437
3451
|
path,
|
|
3438
3452
|
"GET",
|
|
3439
3453
|
path_params,
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
from .pod_monitor import (
|
|
2
2
|
select_and_monitor_by_label,
|
|
3
|
-
select_and_monitor_by_namespace_pattern_and_label,
|
|
4
3
|
select_and_monitor_by_name_pattern_and_namespace_pattern,
|
|
4
|
+
select_and_monitor_by_namespace_pattern_and_label,
|
|
5
5
|
)
|
|
6
6
|
|
|
7
|
-
|
|
8
7
|
__all__ = [
|
|
9
8
|
"select_and_monitor_by_label",
|
|
10
9
|
"select_and_monitor_by_namespace_pattern_and_label",
|
|
@@ -7,13 +7,13 @@ from concurrent.futures.thread import ThreadPoolExecutor
|
|
|
7
7
|
from functools import partial
|
|
8
8
|
|
|
9
9
|
from kubernetes import watch
|
|
10
|
-
from kubernetes.client import
|
|
10
|
+
from kubernetes.client import CoreV1Api, V1Pod
|
|
11
11
|
from urllib3.exceptions import ProtocolError
|
|
12
12
|
|
|
13
13
|
from krkn_lib.models.pod_monitor.models import (
|
|
14
|
-
PodsSnapshot,
|
|
15
14
|
MonitoredPod,
|
|
16
15
|
PodEvent,
|
|
16
|
+
PodsSnapshot,
|
|
17
17
|
PodStatus,
|
|
18
18
|
)
|
|
19
19
|
|
|
@@ -80,7 +80,9 @@ def _monitor_pods(
|
|
|
80
80
|
remain_timeout = max(1, int(max_timeout - elapsed))
|
|
81
81
|
logging.info("remain timeout " + str(remain_timeout))
|
|
82
82
|
if remain_timeout <= 0:
|
|
83
|
-
logging.info(
|
|
83
|
+
logging.info(
|
|
84
|
+
"Maximum timeout reached, stopping monitoring"
|
|
85
|
+
)
|
|
84
86
|
break
|
|
85
87
|
logging.info(
|
|
86
88
|
"Reconnecting watch stream"
|
|
@@ -132,7 +134,7 @@ def _monitor_pods(
|
|
|
132
134
|
pod_event.status = PodStatus.ADDED
|
|
133
135
|
|
|
134
136
|
if pod_event.status == PodStatus.ADDED:
|
|
135
|
-
|
|
137
|
+
|
|
136
138
|
if pod_name not in snapshot.added_pods:
|
|
137
139
|
snapshot.added_pods.append(pod_name)
|
|
138
140
|
# in case a pod is respawn with the same name
|
|
@@ -194,7 +196,7 @@ def _monitor_pods(
|
|
|
194
196
|
logging.error("Error in monitor pods: " + str(e))
|
|
195
197
|
logging.error("Stack trace:\n%s", traceback.format_exc())
|
|
196
198
|
raise Exception(e)
|
|
197
|
-
|
|
199
|
+
|
|
198
200
|
retry_count += 1
|
|
199
201
|
|
|
200
202
|
return snapshot
|
|
@@ -326,7 +326,7 @@ class AffectedNodeStatus:
|
|
|
326
326
|
match_found = []
|
|
327
327
|
for affected_node in self.affected_nodes:
|
|
328
328
|
counter2 = counter + 1
|
|
329
|
-
for aff_node2 in self.affected_nodes[counter + 1:]: #
|
|
329
|
+
for aff_node2 in self.affected_nodes[counter + 1 :]: # noqa: E203
|
|
330
330
|
if affected_node.node_name == aff_node2.node_name:
|
|
331
331
|
match_found.append(counter2)
|
|
332
332
|
cur_node = self.affected_nodes[counter]
|
|
@@ -2,9 +2,9 @@ import json
|
|
|
2
2
|
import time
|
|
3
3
|
from dataclasses import dataclass
|
|
4
4
|
from enum import Enum
|
|
5
|
-
from typing import
|
|
5
|
+
from typing import Any, Optional
|
|
6
6
|
|
|
7
|
-
from krkn_lib.models.k8s import
|
|
7
|
+
from krkn_lib.models.k8s import AffectedPod, PodsStatus
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
class PodStatus(Enum):
|
|
@@ -65,7 +65,7 @@ class KrknOpenshift(KrknKubernetes):
|
|
|
65
65
|
)
|
|
66
66
|
|
|
67
67
|
path = "/apis/config.openshift.io/v1/infrastructures/cluster"
|
|
68
|
-
|
|
68
|
+
data = api_client.call_api(
|
|
69
69
|
path,
|
|
70
70
|
"GET",
|
|
71
71
|
path_params,
|
|
@@ -111,7 +111,7 @@ class KrknOpenshift(KrknKubernetes):
|
|
|
111
111
|
)
|
|
112
112
|
|
|
113
113
|
path = "/apis/config.openshift.io/v1/infrastructures/cluster"
|
|
114
|
-
|
|
114
|
+
data = api_client.call_api(
|
|
115
115
|
path,
|
|
116
116
|
"GET",
|
|
117
117
|
path_params,
|
|
@@ -147,7 +147,7 @@ class KrknOpenshift(KrknKubernetes):
|
|
|
147
147
|
)
|
|
148
148
|
|
|
149
149
|
path = "/apis/config.openshift.io/v1/networks"
|
|
150
|
-
|
|
150
|
+
data = api_client.call_api(
|
|
151
151
|
path,
|
|
152
152
|
"GET",
|
|
153
153
|
path_params,
|
|
@@ -440,7 +440,7 @@ class KrknOpenshift(KrknKubernetes):
|
|
|
440
440
|
["application/json"]
|
|
441
441
|
)
|
|
442
442
|
|
|
443
|
-
|
|
443
|
+
data = self.api_client.call_api(
|
|
444
444
|
path,
|
|
445
445
|
"GET",
|
|
446
446
|
path_params,
|
|
@@ -425,7 +425,7 @@ class KrknTelemetryKubernetes:
|
|
|
425
425
|
:param uploaded_file_list: uploaded file list shared between threads
|
|
426
426
|
:param max_retries: maximum number of retries from config.yaml.
|
|
427
427
|
If 0 will retry indefinitely.
|
|
428
|
-
:param remote_file_prefix: the prefix that will given to the file
|
|
428
|
+
:param remote_file_prefix: the prefix that will be given to the file
|
|
429
429
|
in the S3 bucket along with the progressive number
|
|
430
430
|
(if is a multiple file archive)
|
|
431
431
|
:param remote_file_extension: the extension of the remote
|
|
@@ -583,7 +583,7 @@ class BaseTest(unittest.TestCase):
|
|
|
583
583
|
"start_timestamp": "2025-03-12T14:57:34.555878",
|
|
584
584
|
"end_timestamp": "2025-03-12T14:57:54.904352",
|
|
585
585
|
"duration": 20.348474,
|
|
586
|
-
"new_ip_address": ""
|
|
586
|
+
"new_ip_address": "",
|
|
587
587
|
},
|
|
588
588
|
{
|
|
589
589
|
"node_name": "h27-r660",
|
|
@@ -594,7 +594,7 @@ class BaseTest(unittest.TestCase):
|
|
|
594
594
|
"start_timestamp": "2025-03-12T14:57:34.759105",
|
|
595
595
|
"end_timestamp": "2025-03-12T14:57:54.904352",
|
|
596
596
|
"duration": 20.145247,
|
|
597
|
-
"new_ip_address": ""
|
|
597
|
+
"new_ip_address": "",
|
|
598
598
|
},
|
|
599
599
|
{
|
|
600
600
|
"node_name": "h10-r660",
|
|
@@ -605,7 +605,7 @@ class BaseTest(unittest.TestCase):
|
|
|
605
605
|
"start_timestamp": "2025-03-12T14:57:35.308957",
|
|
606
606
|
"end_timestamp": "2025-03-12T14:57:54.904352",
|
|
607
607
|
"duration": 19.595395,
|
|
608
|
-
"new_ip_address": "0.0.0.3"
|
|
608
|
+
"new_ip_address": "0.0.0.3",
|
|
609
609
|
},
|
|
610
610
|
],
|
|
611
611
|
"post_virt_checks": [
|
|
@@ -618,7 +618,7 @@ class BaseTest(unittest.TestCase):
|
|
|
618
618
|
"start_timestamp": "2025-03-12T14:57:55.904352",
|
|
619
619
|
"end_timestamp": "2025-03-12T14:57:55.904352",
|
|
620
620
|
"duration": 0.00,
|
|
621
|
-
"new_ip_address": ""
|
|
621
|
+
"new_ip_address": "",
|
|
622
622
|
}
|
|
623
623
|
],
|
|
624
624
|
"total_node_count": 3,
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
+
import datetime
|
|
1
2
|
import uuid
|
|
2
3
|
|
|
3
4
|
from krkn_lib.models.elastic.models import ElasticChaosRunTelemetry
|
|
4
5
|
from krkn_lib.models.telemetry import ChaosRunTelemetry
|
|
5
6
|
from krkn_lib.tests import BaseTest
|
|
6
|
-
import datetime
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
class TestKrknElasticModels(BaseTest):
|
|
@@ -222,9 +222,7 @@ class TestKrknElasticModels(BaseTest):
|
|
|
222
222
|
self.assertEqual(
|
|
223
223
|
elastic_telemetry.virt_checks[0].ip_address, "0.0.0.0"
|
|
224
224
|
)
|
|
225
|
-
self.assertEqual(
|
|
226
|
-
elastic_telemetry.virt_checks[0].new_ip_address, ""
|
|
227
|
-
)
|
|
225
|
+
self.assertEqual(elastic_telemetry.virt_checks[0].new_ip_address, "")
|
|
228
226
|
self.assertEqual(
|
|
229
227
|
elastic_telemetry.virt_checks[2].new_ip_address, "0.0.0.3"
|
|
230
228
|
)
|
|
@@ -2,10 +2,11 @@ import logging
|
|
|
2
2
|
import time
|
|
3
3
|
import unittest
|
|
4
4
|
|
|
5
|
-
from krkn_lib.tests import BaseTest
|
|
6
|
-
from krkn_lib.k8s import ApiRequestException
|
|
7
5
|
from kubernetes.client import ApiException
|
|
8
6
|
|
|
7
|
+
from krkn_lib.k8s import ApiRequestException
|
|
8
|
+
from krkn_lib.tests import BaseTest
|
|
9
|
+
|
|
9
10
|
|
|
10
11
|
class KrknKubernetesTestsCheck(BaseTest):
|
|
11
12
|
def test_check_namespaces(self):
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import logging
|
|
2
|
+
import tempfile
|
|
2
3
|
import unittest
|
|
4
|
+
|
|
3
5
|
import yaml
|
|
4
|
-
import tempfile
|
|
5
|
-
from krkn_lib.tests import BaseTest
|
|
6
|
-
from kubernetes.client import ApiException
|
|
7
6
|
from jinja2 import Environment, FileSystemLoader
|
|
7
|
+
from kubernetes.client import ApiException
|
|
8
|
+
|
|
9
|
+
from krkn_lib.tests import BaseTest
|
|
8
10
|
|
|
9
11
|
|
|
10
12
|
class KrknKubernetesTestsCreate(BaseTest):
|