krkn-lib 5.1.5__tar.gz → 5.1.10__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.5 → krkn_lib-5.1.10}/PKG-INFO +7 -5
- {krkn_lib-5.1.5 → krkn_lib-5.1.10}/pyproject.toml +4 -4
- {krkn_lib-5.1.5 → krkn_lib-5.1.10}/src/krkn_lib/k8s/krkn_kubernetes.py +50 -0
- {krkn_lib-5.1.5 → krkn_lib-5.1.10}/src/krkn_lib/k8s/pod_monitor/pod_monitor.py +1 -4
- {krkn_lib-5.1.5 → krkn_lib-5.1.10}/src/krkn_lib/models/elastic/models.py +2 -0
- {krkn_lib-5.1.5 → krkn_lib-5.1.10}/src/krkn_lib/models/pod_monitor/models.py +8 -0
- {krkn_lib-5.1.5 → krkn_lib-5.1.10}/src/krkn_lib/models/telemetry/models.py +5 -0
- {krkn_lib-5.1.5 → krkn_lib-5.1.10}/src/krkn_lib/tests/base_test.py +5 -1
- {krkn_lib-5.1.5 → krkn_lib-5.1.10}/src/krkn_lib/tests/test_krkn_elastic_models.py +6 -0
- {krkn_lib-5.1.5 → krkn_lib-5.1.10}/src/krkn_lib/tests/test_krkn_kubernetes_check.py +6 -2
- {krkn_lib-5.1.5 → krkn_lib-5.1.10}/src/krkn_lib/tests/test_krkn_kubernetes_list.py +46 -0
- {krkn_lib-5.1.5 → krkn_lib-5.1.10}/src/krkn_lib/tests/test_krkn_kubernetes_pods_monitor.py +5 -1
- {krkn_lib-5.1.5 → krkn_lib-5.1.10}/src/krkn_lib/tests/test_utils.py +19 -1
- {krkn_lib-5.1.5 → krkn_lib-5.1.10}/src/krkn_lib/utils/functions.py +17 -2
- {krkn_lib-5.1.5 → krkn_lib-5.1.10}/LICENSE +0 -0
- {krkn_lib-5.1.5 → krkn_lib-5.1.10}/README.md +0 -0
- {krkn_lib-5.1.5 → krkn_lib-5.1.10}/src/krkn_lib/__init__.py +0 -0
- {krkn_lib-5.1.5 → krkn_lib-5.1.10}/src/krkn_lib/aws_tests/__init__.py +0 -0
- {krkn_lib-5.1.5 → krkn_lib-5.1.10}/src/krkn_lib/aws_tests/test_krkn_telemetry_kubernetes.py +0 -0
- {krkn_lib-5.1.5 → krkn_lib-5.1.10}/src/krkn_lib/aws_tests/test_krkn_telemetry_openshift.py +0 -0
- {krkn_lib-5.1.5 → krkn_lib-5.1.10}/src/krkn_lib/elastic/__init__.py +0 -0
- {krkn_lib-5.1.5 → krkn_lib-5.1.10}/src/krkn_lib/elastic/krkn_elastic.py +0 -0
- {krkn_lib-5.1.5 → krkn_lib-5.1.10}/src/krkn_lib/k8s/__init__.py +0 -0
- {krkn_lib-5.1.5 → krkn_lib-5.1.10}/src/krkn_lib/k8s/pod_monitor/__init__.py +0 -0
- {krkn_lib-5.1.5 → krkn_lib-5.1.10}/src/krkn_lib/k8s/templates/hog_pod.j2 +0 -0
- {krkn_lib-5.1.5 → krkn_lib-5.1.10}/src/krkn_lib/k8s/templates/node_exec_pod.j2 +0 -0
- {krkn_lib-5.1.5 → krkn_lib-5.1.10}/src/krkn_lib/k8s/templates/service_hijacking_config_map.j2 +0 -0
- {krkn_lib-5.1.5 → krkn_lib-5.1.10}/src/krkn_lib/k8s/templates/service_hijacking_pod.j2 +0 -0
- {krkn_lib-5.1.5 → krkn_lib-5.1.10}/src/krkn_lib/k8s/templates/syn_flood_pod.j2 +0 -0
- {krkn_lib-5.1.5 → krkn_lib-5.1.10}/src/krkn_lib/models/__init__.py +0 -0
- {krkn_lib-5.1.5 → krkn_lib-5.1.10}/src/krkn_lib/models/elastic/__init__.py +0 -0
- {krkn_lib-5.1.5 → krkn_lib-5.1.10}/src/krkn_lib/models/k8s/__init__.py +0 -0
- {krkn_lib-5.1.5 → krkn_lib-5.1.10}/src/krkn_lib/models/k8s/models.py +0 -0
- {krkn_lib-5.1.5 → krkn_lib-5.1.10}/src/krkn_lib/models/krkn/__init__.py +0 -0
- {krkn_lib-5.1.5 → krkn_lib-5.1.10}/src/krkn_lib/models/krkn/models.py +0 -0
- {krkn_lib-5.1.5 → krkn_lib-5.1.10}/src/krkn_lib/models/pod_monitor/__init__.py +0 -0
- {krkn_lib-5.1.5 → krkn_lib-5.1.10}/src/krkn_lib/models/telemetry/__init__.py +0 -0
- {krkn_lib-5.1.5 → krkn_lib-5.1.10}/src/krkn_lib/ocp/__init__.py +0 -0
- {krkn_lib-5.1.5 → krkn_lib-5.1.10}/src/krkn_lib/ocp/krkn_openshift.py +0 -0
- {krkn_lib-5.1.5 → krkn_lib-5.1.10}/src/krkn_lib/prometheus/__init__.py +0 -0
- {krkn_lib-5.1.5 → krkn_lib-5.1.10}/src/krkn_lib/prometheus/krkn_prometheus.py +0 -0
- {krkn_lib-5.1.5 → krkn_lib-5.1.10}/src/krkn_lib/telemetry/__init__.py +0 -0
- {krkn_lib-5.1.5 → krkn_lib-5.1.10}/src/krkn_lib/telemetry/k8s/__init__.py +0 -0
- {krkn_lib-5.1.5 → krkn_lib-5.1.10}/src/krkn_lib/telemetry/k8s/krkn_telemetry_kubernetes.py +0 -0
- {krkn_lib-5.1.5 → krkn_lib-5.1.10}/src/krkn_lib/telemetry/ocp/__init__.py +0 -0
- {krkn_lib-5.1.5 → krkn_lib-5.1.10}/src/krkn_lib/telemetry/ocp/krkn_telemetry_openshift.py +0 -0
- {krkn_lib-5.1.5 → krkn_lib-5.1.10}/src/krkn_lib/tests/__init__.py +0 -0
- {krkn_lib-5.1.5 → krkn_lib-5.1.10}/src/krkn_lib/tests/test_krkn_elastic.py +0 -0
- {krkn_lib-5.1.5 → krkn_lib-5.1.10}/src/krkn_lib/tests/test_krkn_kubernetes_create.py +0 -0
- {krkn_lib-5.1.5 → krkn_lib-5.1.10}/src/krkn_lib/tests/test_krkn_kubernetes_delete.py +0 -0
- {krkn_lib-5.1.5 → krkn_lib-5.1.10}/src/krkn_lib/tests/test_krkn_kubernetes_exec.py +0 -0
- {krkn_lib-5.1.5 → krkn_lib-5.1.10}/src/krkn_lib/tests/test_krkn_kubernetes_get.py +0 -0
- {krkn_lib-5.1.5 → krkn_lib-5.1.10}/src/krkn_lib/tests/test_krkn_kubernetes_misc.py +0 -0
- {krkn_lib-5.1.5 → krkn_lib-5.1.10}/src/krkn_lib/tests/test_krkn_kubernetes_models.py +0 -0
- {krkn_lib-5.1.5 → krkn_lib-5.1.10}/src/krkn_lib/tests/test_krkn_kubernetes_pods_monitor_models.py +0 -0
- {krkn_lib-5.1.5 → krkn_lib-5.1.10}/src/krkn_lib/tests/test_krkn_openshift.py +0 -0
- {krkn_lib-5.1.5 → krkn_lib-5.1.10}/src/krkn_lib/tests/test_krkn_prometheus.py +0 -0
- {krkn_lib-5.1.5 → krkn_lib-5.1.10}/src/krkn_lib/tests/test_krkn_telemetry_models.py +0 -0
- {krkn_lib-5.1.5 → krkn_lib-5.1.10}/src/krkn_lib/tests/test_version.py +0 -0
- {krkn_lib-5.1.5 → krkn_lib-5.1.10}/src/krkn_lib/utils/__init__.py +0 -0
- {krkn_lib-5.1.5 → krkn_lib-5.1.10}/src/krkn_lib/utils/safe_logger.py +0 -0
- {krkn_lib-5.1.5 → krkn_lib-5.1.10}/src/krkn_lib/version/__init__.py +0 -0
- {krkn_lib-5.1.5 → krkn_lib-5.1.10}/src/krkn_lib/version/version.py +0 -0
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: krkn-lib
|
|
3
|
-
Version: 5.1.
|
|
3
|
+
Version: 5.1.10
|
|
4
4
|
Summary: Foundation library for Kraken
|
|
5
5
|
License: Apache-2.0
|
|
6
|
+
License-File: LICENSE
|
|
6
7
|
Author: Red Hat Chaos Team
|
|
7
8
|
Requires-Python: >=3.9,<4.0
|
|
8
9
|
Classifier: License :: OSI Approved :: Apache Software License
|
|
@@ -12,15 +13,16 @@ Classifier: Programming Language :: Python :: 3.10
|
|
|
12
13
|
Classifier: Programming Language :: Python :: 3.11
|
|
13
14
|
Classifier: Programming Language :: Python :: 3.12
|
|
14
15
|
Classifier: Programming Language :: Python :: 3.13
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
15
17
|
Requires-Dist: PyYAML (==6.0.1)
|
|
16
18
|
Requires-Dist: base64io (>=1.0.3,<2.0.0)
|
|
17
19
|
Requires-Dist: coverage (>=7.6.12,<8.0.0)
|
|
18
20
|
Requires-Dist: cython (==3.0)
|
|
19
21
|
Requires-Dist: deprecation (==2.1.0)
|
|
20
|
-
Requires-Dist: elasticsearch (==
|
|
21
|
-
Requires-Dist: elasticsearch-dsl (==
|
|
22
|
+
Requires-Dist: elasticsearch (==8.19.1)
|
|
23
|
+
Requires-Dist: elasticsearch-dsl (==8.18.0)
|
|
22
24
|
Requires-Dist: kubeconfig (>=1.1.1,<2.0.0)
|
|
23
|
-
Requires-Dist: kubernetes (==
|
|
25
|
+
Requires-Dist: kubernetes (==34.1.0)
|
|
24
26
|
Requires-Dist: numpy (==1.26.4)
|
|
25
27
|
Requires-Dist: prometheus-api-client (>=0.5.4,<0.6.0)
|
|
26
28
|
Requires-Dist: pytz (>=2023.3,<2024.0)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[tool.poetry]
|
|
2
2
|
name = "krkn-lib"
|
|
3
|
-
version = "5.1.
|
|
3
|
+
version = "5.1.10"
|
|
4
4
|
description = "Foundation library for Kraken"
|
|
5
5
|
authors = ["Red Hat Chaos Team"]
|
|
6
6
|
license = "Apache-2.0"
|
|
@@ -10,7 +10,7 @@ homepage = "https://github.com/redhat-chaos/krkn"
|
|
|
10
10
|
|
|
11
11
|
[tool.poetry.dependencies]
|
|
12
12
|
python = "^3.9"
|
|
13
|
-
kubernetes ="
|
|
13
|
+
kubernetes ="34.1.0"
|
|
14
14
|
sphinxnotes-markdown-builder="^0.5.6"
|
|
15
15
|
requests="^2.29.0"
|
|
16
16
|
kubeconfig = "^1.1.1"
|
|
@@ -20,8 +20,8 @@ tzlocal = "5.1"
|
|
|
20
20
|
pytz = "^2023.3"
|
|
21
21
|
PyYAML = "6.0.1"
|
|
22
22
|
prometheus-api-client = "^0.5.4"
|
|
23
|
-
elasticsearch = "
|
|
24
|
-
elasticsearch-dsl = "
|
|
23
|
+
elasticsearch = "8.19.1"
|
|
24
|
+
elasticsearch-dsl = "8.18.0"
|
|
25
25
|
wheel = "^0.42.0"
|
|
26
26
|
cython = "3.0"
|
|
27
27
|
numpy= "1.26.4"
|
|
@@ -166,7 +166,13 @@ class KrknKubernetes:
|
|
|
166
166
|
|
|
167
167
|
client.Configuration.set_default(self.client_config)
|
|
168
168
|
self.watch_resource = watch.Watch()
|
|
169
|
+
# Get the logger for the kubernetes client
|
|
170
|
+
kubernetes_logger = logging.getLogger('kubernetes')
|
|
169
171
|
|
|
172
|
+
# Set the logging level to a higher level than DEBUG,
|
|
173
|
+
# such as INFO, WARNING, or ERROR
|
|
174
|
+
# This will effectively disable DEBUG level messages.
|
|
175
|
+
kubernetes_logger.setLevel(logging.INFO)
|
|
170
176
|
except OSError:
|
|
171
177
|
raise Exception(
|
|
172
178
|
"Invalid kube-config file: {0}. "
|
|
@@ -528,6 +534,7 @@ class KrknKubernetes:
|
|
|
528
534
|
namespace: str,
|
|
529
535
|
label_selector: str = None,
|
|
530
536
|
field_selector: str = None,
|
|
537
|
+
exclude_label: str = None,
|
|
531
538
|
) -> list[str]:
|
|
532
539
|
"""
|
|
533
540
|
List pods in the given namespace
|
|
@@ -537,6 +544,8 @@ class KrknKubernetes:
|
|
|
537
544
|
(optional default `None`)
|
|
538
545
|
:param field_selector: filter results by config details
|
|
539
546
|
select only running pods by setting "status.phase=Running"
|
|
547
|
+
:param exclude_label: exclude pods matching this label
|
|
548
|
+
in format "key=value" (optional default `None`)
|
|
540
549
|
:return: a list of pod names
|
|
541
550
|
"""
|
|
542
551
|
pods = []
|
|
@@ -552,6 +561,14 @@ class KrknKubernetes:
|
|
|
552
561
|
raise e
|
|
553
562
|
for ret_list in ret:
|
|
554
563
|
for pod in ret_list.items:
|
|
564
|
+
# Skip pods with the exclude label if specified
|
|
565
|
+
if exclude_label and pod.metadata.labels:
|
|
566
|
+
exclude_key, exclude_value = exclude_label.split("=", 1)
|
|
567
|
+
if (
|
|
568
|
+
exclude_key in pod.metadata.labels
|
|
569
|
+
and pod.metadata.labels[exclude_key] == exclude_value
|
|
570
|
+
):
|
|
571
|
+
continue
|
|
555
572
|
pods.append(pod.metadata.name)
|
|
556
573
|
return pods
|
|
557
574
|
|
|
@@ -3130,3 +3147,36 @@ class KrknKubernetes:
|
|
|
3130
3147
|
pids_list = list(filter(None, pids_list))
|
|
3131
3148
|
return pids_list
|
|
3132
3149
|
return None
|
|
3150
|
+
|
|
3151
|
+
def list_pod_network_interfaces(
|
|
3152
|
+
self, pod_name: str, namespace: str, container_name: str = None
|
|
3153
|
+
) -> list[str]:
|
|
3154
|
+
"""
|
|
3155
|
+
Lists the network interfaces of a pod (Linux only)
|
|
3156
|
+
:param pod_name: the name of the pod
|
|
3157
|
+
:param namespace: the namespaces of the pod
|
|
3158
|
+
:param container_name: the container of the pod where the interfaces
|
|
3159
|
+
will be listed, if None the first will be picked
|
|
3160
|
+
:return: the list of the interfaces
|
|
3161
|
+
"""
|
|
3162
|
+
|
|
3163
|
+
if not self.check_if_pod_exists(pod_name, namespace):
|
|
3164
|
+
raise Exception(
|
|
3165
|
+
f"target pod {pod_name} does not exist in "
|
|
3166
|
+
f"namespace {namespace}"
|
|
3167
|
+
)
|
|
3168
|
+
|
|
3169
|
+
cmd = "ls /sys/class/net"
|
|
3170
|
+
nics_str = self.exec_cmd_in_pod(
|
|
3171
|
+
[cmd],
|
|
3172
|
+
pod_name,
|
|
3173
|
+
namespace,
|
|
3174
|
+
container_name,
|
|
3175
|
+
)
|
|
3176
|
+
nics = nics_str.split("\n")
|
|
3177
|
+
try:
|
|
3178
|
+
nics.remove("lo")
|
|
3179
|
+
nics.remove("")
|
|
3180
|
+
except ValueError:
|
|
3181
|
+
pass
|
|
3182
|
+
return nics
|
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
import os
|
|
2
1
|
import re
|
|
3
2
|
from concurrent.futures import Future
|
|
4
3
|
from concurrent.futures.thread import ThreadPoolExecutor
|
|
5
4
|
from functools import partial
|
|
6
5
|
|
|
7
|
-
from kubernetes import
|
|
6
|
+
from kubernetes import watch
|
|
8
7
|
from kubernetes.client import V1Pod, CoreV1Api
|
|
9
8
|
|
|
10
9
|
from krkn_lib.models.pod_monitor.models import (
|
|
@@ -14,8 +13,6 @@ from krkn_lib.models.pod_monitor.models import (
|
|
|
14
13
|
PodStatus,
|
|
15
14
|
)
|
|
16
15
|
|
|
17
|
-
config.load_kube_config(os.path.join(os.environ["HOME"], ".kube/config"))
|
|
18
|
-
|
|
19
16
|
|
|
20
17
|
def _select_pods(
|
|
21
18
|
select_partial: partial,
|
|
@@ -118,6 +118,7 @@ class ElasticHealthChecks(InnerDoc):
|
|
|
118
118
|
class ElasticVirtChecks(InnerDoc):
|
|
119
119
|
vm_name = Text()
|
|
120
120
|
ip_address = Text()
|
|
121
|
+
new_ip_address = Text()
|
|
121
122
|
namespace = Text()
|
|
122
123
|
node_name = Text()
|
|
123
124
|
status = Boolean()
|
|
@@ -243,6 +244,7 @@ class ElasticChaosRunTelemetry(Document):
|
|
|
243
244
|
ElasticVirtChecks(
|
|
244
245
|
vm_name=info.vm_name,
|
|
245
246
|
ip_address=info.ip_address,
|
|
247
|
+
new_ip_address=info.new_ip_address,
|
|
246
248
|
namespace=info.namespace,
|
|
247
249
|
node_name=info.node_name,
|
|
248
250
|
status=info.status,
|
|
@@ -8,6 +8,7 @@ from krkn_lib.models.k8s import PodsStatus, AffectedPod
|
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
class PodStatus(Enum):
|
|
11
|
+
UNDEFINED = 0
|
|
11
12
|
READY = 1
|
|
12
13
|
NOT_READY = 2
|
|
13
14
|
DELETION_SCHEDULED = 3
|
|
@@ -20,6 +21,7 @@ class PodEvent:
|
|
|
20
21
|
status: PodStatus
|
|
21
22
|
|
|
22
23
|
def __init__(self, timestamp: float = None):
|
|
24
|
+
self.status = PodStatus.UNDEFINED
|
|
23
25
|
if not timestamp:
|
|
24
26
|
self._timestamp = time.time()
|
|
25
27
|
else:
|
|
@@ -142,12 +144,18 @@ class PodsSnapshot:
|
|
|
142
144
|
)
|
|
143
145
|
)
|
|
144
146
|
else:
|
|
147
|
+
|
|
148
|
+
# pod stayed ready but was restarted
|
|
149
|
+
# or has a failed container
|
|
145
150
|
pods_status.recovered.append(
|
|
146
151
|
AffectedPod(
|
|
147
152
|
pod_name=pod.name,
|
|
148
153
|
namespace=pod.namespace,
|
|
149
154
|
pod_readiness_time=ready_status.timestamp
|
|
150
155
|
- status_change.timestamp,
|
|
156
|
+
pod_rescheduling_time=0,
|
|
157
|
+
total_recovery_time=ready_status.timestamp
|
|
158
|
+
- status_change.timestamp,
|
|
151
159
|
)
|
|
152
160
|
)
|
|
153
161
|
break
|
|
@@ -436,6 +436,10 @@ class VirtCheck:
|
|
|
436
436
|
"""
|
|
437
437
|
Vm ip address
|
|
438
438
|
"""
|
|
439
|
+
new_ip_address: str
|
|
440
|
+
"""
|
|
441
|
+
New Ip address when vm restarts
|
|
442
|
+
"""
|
|
439
443
|
namespace: str
|
|
440
444
|
"""
|
|
441
445
|
Namespace
|
|
@@ -471,6 +475,7 @@ class VirtCheck:
|
|
|
471
475
|
self.start_timestamp = json_dict.get("start_timestamp", "")
|
|
472
476
|
self.end_timestamp = json_dict.get("end_timestamp", "")
|
|
473
477
|
self.duration = json_dict.get("duration", "")
|
|
478
|
+
self.new_ip_address = json_dict.get("new_ip_address", "")
|
|
474
479
|
|
|
475
480
|
|
|
476
481
|
@dataclass(order=False)
|
|
@@ -165,12 +165,13 @@ class BaseTest(unittest.TestCase):
|
|
|
165
165
|
|
|
166
166
|
def deploy_fake_kraken(
|
|
167
167
|
self,
|
|
168
|
+
name: str = "kraken-deployment",
|
|
168
169
|
namespace: str = "default",
|
|
169
170
|
random_label: str = None,
|
|
170
171
|
node_name: str = None,
|
|
171
172
|
):
|
|
172
173
|
template = self.template_to_pod(
|
|
173
|
-
|
|
174
|
+
name, namespace, random_label, node_name
|
|
174
175
|
)
|
|
175
176
|
self.apply_template(template)
|
|
176
177
|
|
|
@@ -582,6 +583,7 @@ class BaseTest(unittest.TestCase):
|
|
|
582
583
|
"start_timestamp": "2025-03-12T14:57:34.555878",
|
|
583
584
|
"end_timestamp": "2025-03-12T14:57:54.904352",
|
|
584
585
|
"duration": 20.348474,
|
|
586
|
+
"new_ip_address": ""
|
|
585
587
|
},
|
|
586
588
|
{
|
|
587
589
|
"node_name": "h27-r660",
|
|
@@ -592,6 +594,7 @@ class BaseTest(unittest.TestCase):
|
|
|
592
594
|
"start_timestamp": "2025-03-12T14:57:34.759105",
|
|
593
595
|
"end_timestamp": "2025-03-12T14:57:54.904352",
|
|
594
596
|
"duration": 20.145247,
|
|
597
|
+
"new_ip_address": ""
|
|
595
598
|
},
|
|
596
599
|
{
|
|
597
600
|
"node_name": "h10-r660",
|
|
@@ -602,6 +605,7 @@ class BaseTest(unittest.TestCase):
|
|
|
602
605
|
"start_timestamp": "2025-03-12T14:57:35.308957",
|
|
603
606
|
"end_timestamp": "2025-03-12T14:57:54.904352",
|
|
604
607
|
"duration": 19.595395,
|
|
608
|
+
"new_ip_address": "0.0.0.3"
|
|
605
609
|
},
|
|
606
610
|
],
|
|
607
611
|
"total_node_count": 3,
|
|
@@ -222,6 +222,12 @@ 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
|
+
)
|
|
228
|
+
self.assertEqual(
|
|
229
|
+
elastic_telemetry.virt_checks[2].new_ip_address, "0.0.0.3"
|
|
230
|
+
)
|
|
225
231
|
self.assertEqual(
|
|
226
232
|
elastic_telemetry.virt_checks[0].namespace, "benchmark-runner"
|
|
227
233
|
)
|
|
@@ -82,7 +82,9 @@ class KrknKubernetesTestsCheck(BaseTest):
|
|
|
82
82
|
bad_namespace = "test-ns-" + self.get_random_string(10)
|
|
83
83
|
self.deploy_namespace(bad_namespace, [])
|
|
84
84
|
self.deploy_fake_kraken(
|
|
85
|
-
bad_namespace,
|
|
85
|
+
namespace=bad_namespace,
|
|
86
|
+
random_label=None,
|
|
87
|
+
node_name="do_not_exist",
|
|
86
88
|
)
|
|
87
89
|
status = self.lib_k8s.monitor_namespace(namespace=bad_namespace)
|
|
88
90
|
# sleeping for a while just in case
|
|
@@ -108,7 +110,9 @@ class KrknKubernetesTestsCheck(BaseTest):
|
|
|
108
110
|
bad_namespace = "test-ns-" + self.get_random_string(10)
|
|
109
111
|
self.deploy_namespace(bad_namespace, [])
|
|
110
112
|
self.deploy_fake_kraken(
|
|
111
|
-
bad_namespace,
|
|
113
|
+
namespace=bad_namespace,
|
|
114
|
+
random_label=None,
|
|
115
|
+
node_name="do_not_exist",
|
|
112
116
|
)
|
|
113
117
|
status = self.lib_k8s.monitor_component(
|
|
114
118
|
iteration=1, component_namespace=bad_namespace
|
|
@@ -67,6 +67,8 @@ class KrknKubernetesTestsList(BaseTest):
|
|
|
67
67
|
namespace = "test-lp" + self.get_random_string(10)
|
|
68
68
|
self.deploy_namespace(namespace, [])
|
|
69
69
|
self.deploy_fake_kraken(namespace=namespace)
|
|
70
|
+
|
|
71
|
+
# Test basic pod listing
|
|
70
72
|
pods = self.lib_k8s.list_pods(namespace=namespace)
|
|
71
73
|
self.assertTrue(len(pods) == 1)
|
|
72
74
|
self.assertIn("kraken-deployment", pods)
|
|
@@ -83,7 +85,38 @@ class KrknKubernetesTestsList(BaseTest):
|
|
|
83
85
|
namespace=namespace, field_selector="status.phase=Terminating"
|
|
84
86
|
)
|
|
85
87
|
self.assertTrue(len(pods) == 0)
|
|
88
|
+
|
|
89
|
+
# Test with exclude_label - should not exclude
|
|
90
|
+
# any pods (no matching labels)
|
|
91
|
+
pods = self.lib_k8s.list_pods(
|
|
92
|
+
namespace=namespace, exclude_label="skip=true"
|
|
93
|
+
)
|
|
94
|
+
self.assertTrue(len(pods) == 1)
|
|
95
|
+
self.assertIn("kraken-deployment", pods)
|
|
96
|
+
|
|
97
|
+
# Add a pod with the exclude label leveraging random_label will set
|
|
98
|
+
# random=skip
|
|
99
|
+
self.deploy_fake_kraken(
|
|
100
|
+
namespace=namespace, name="kraken-exclude", random_label="skip"
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
# Test listing all pods without exclusion
|
|
104
|
+
pods = self.lib_k8s.list_pods(namespace=namespace)
|
|
105
|
+
self.assertTrue(len(pods) == 2)
|
|
106
|
+
self.assertIn("kraken-deployment", pods)
|
|
107
|
+
self.assertIn("kraken-exclude", pods)
|
|
108
|
+
|
|
109
|
+
# Test with exclude_label - should exclude the labeled pod
|
|
110
|
+
pods = self.lib_k8s.list_pods(
|
|
111
|
+
namespace=namespace, exclude_label="random=skip"
|
|
112
|
+
)
|
|
113
|
+
self.assertTrue(len(pods) == 1)
|
|
114
|
+
self.assertIn("kraken-deployment", pods)
|
|
115
|
+
self.assertNotIn("kraken-exclude", pods)
|
|
116
|
+
|
|
117
|
+
# Clean up
|
|
86
118
|
self.pod_delete_queue.put(["kraken-deployment", namespace])
|
|
119
|
+
self.pod_delete_queue.put(["kraken-exclude", namespace])
|
|
87
120
|
|
|
88
121
|
def test_list_ready_nodes(self):
|
|
89
122
|
try:
|
|
@@ -140,6 +173,19 @@ class KrknKubernetesTestsList(BaseTest):
|
|
|
140
173
|
len(schedulable_nodes), len(schedulable_nodes_empty_selector)
|
|
141
174
|
)
|
|
142
175
|
|
|
176
|
+
def test_list_pod_network_interfaces(self):
|
|
177
|
+
namespace = "test-cid-" + self.get_random_string(10)
|
|
178
|
+
base_pod_name = "test-name-" + self.get_random_string(10)
|
|
179
|
+
self.deploy_namespace(namespace, [])
|
|
180
|
+
self.deploy_fedtools(namespace=namespace, name=base_pod_name)
|
|
181
|
+
self.wait_pod(base_pod_name, namespace)
|
|
182
|
+
|
|
183
|
+
nics = self.lib_k8s.list_pod_network_interfaces(
|
|
184
|
+
base_pod_name, namespace
|
|
185
|
+
)
|
|
186
|
+
self.assertGreater(len(nics), 0)
|
|
187
|
+
self.assertTrue("eth0" in nics)
|
|
188
|
+
|
|
143
189
|
|
|
144
190
|
if __name__ == "__main__":
|
|
145
191
|
unittest.main()
|
|
@@ -441,8 +441,12 @@ class TestKrknKubernetesPodsMonitor(BaseTest):
|
|
|
441
441
|
pods_status = snapshot.get_pods_status()
|
|
442
442
|
self.background_delete_ns(namespace)
|
|
443
443
|
self.assertEqual(len(pods_status.recovered), 1)
|
|
444
|
-
self.assertEqual(pods_status.recovered[0].pod_rescheduling_time,
|
|
444
|
+
self.assertEqual(pods_status.recovered[0].pod_rescheduling_time, 0)
|
|
445
445
|
self.assertGreater(pods_status.recovered[0].pod_readiness_time, 0)
|
|
446
|
+
self.assertEqual(
|
|
447
|
+
pods_status.recovered[0].total_recovery_time,
|
|
448
|
+
pods_status.recovered[0].pod_readiness_time,
|
|
449
|
+
)
|
|
446
450
|
|
|
447
451
|
def test_monitor_stopping_earlier(self):
|
|
448
452
|
|
|
@@ -426,7 +426,25 @@ class UtilFunctionTests(BaseTest):
|
|
|
426
426
|
os.environ["JOB_NAME"] = "1953335493844275200"
|
|
427
427
|
ci_job_url = utils.get_ci_job_url()
|
|
428
428
|
print("ci job url" + str(ci_job_url))
|
|
429
|
-
self.assertIn(
|
|
429
|
+
self.assertIn(
|
|
430
|
+
"prow.ci.openshift.org/view/gs/origin-ci-test", ci_job_url
|
|
431
|
+
)
|
|
432
|
+
os.environ["PULL_NUMBER"] = "68493"
|
|
433
|
+
os.environ["PROW_JOB_ID"] = os.environ["JOB_NAME"] = (
|
|
434
|
+
"1965813126276321280"
|
|
435
|
+
)
|
|
436
|
+
os.environ["JOB_TYPE"] = "presubmit"
|
|
437
|
+
|
|
438
|
+
os.environ["BUILD_ID"] = (
|
|
439
|
+
"rehearse-68493-periodic-ci-redhat-chaos-prow-scripts-main-4.20-nightly-krkn-hub-node-tests-aws-ipsec" # NOQA
|
|
440
|
+
)
|
|
441
|
+
|
|
442
|
+
ci_job_url = utils.get_ci_job_url()
|
|
443
|
+
print("ci job url" + str(ci_job_url))
|
|
444
|
+
self.assertIn(
|
|
445
|
+
"prow.ci.openshift.org/view/gs/test-platform-results", ci_job_url
|
|
446
|
+
)
|
|
447
|
+
|
|
430
448
|
os.environ["PROW_JOB_ID"] = ""
|
|
431
449
|
os.environ["BUILD_URL"] = (
|
|
432
450
|
"https://jenkins-csb-openshift-qe-mastern.dno.corp.redhat.com/job/scale-ci/job/e2e-benchmarking-multibranch-pipeline/job/kraken/" # NOQA
|
|
@@ -472,10 +472,25 @@ def get_ci_job_url():
|
|
|
472
472
|
prow_base_url = (
|
|
473
473
|
"https://prow.ci.openshift.org/view/gs/origin-ci-test/logs"
|
|
474
474
|
)
|
|
475
|
+
|
|
476
|
+
prow_pr_base_url = "https://prow.ci.openshift.org/view/gs/test-platform-results/pr-logs/pull/openshift_release" # NOQA
|
|
475
477
|
task_id = os.getenv("BUILD_ID")
|
|
476
478
|
job_id = os.getenv("JOB_NAME")
|
|
477
|
-
|
|
478
|
-
|
|
479
|
+
pull_number = os.getenv("PULL_NUMBER")
|
|
480
|
+
job_type = os.getenv("JOB_TYPE")
|
|
481
|
+
if job_type == "presubmit" and "pull" in task_id:
|
|
482
|
+
# Indicates a ci test triggered in PR against source code
|
|
483
|
+
job_type = "pull"
|
|
484
|
+
if job_type == "presubmit" and "rehearse" in task_id:
|
|
485
|
+
# Indicates a rehearsel in PR against openshift/release repo
|
|
486
|
+
job_type = "pull"
|
|
487
|
+
# Handle cases where a periodic job iw triggered via pull request
|
|
488
|
+
if job_type == "periodic" and pull_number:
|
|
489
|
+
job_type = "pull"
|
|
490
|
+
if job_type == "pull":
|
|
491
|
+
build_url = f"{prow_pr_base_url}/{pull_number}/{task_id}/{job_id}"
|
|
492
|
+
else:
|
|
493
|
+
build_url = f"{prow_base_url}/{job_id}/{task_id}"
|
|
479
494
|
|
|
480
495
|
elif os.getenv("BUILD_URL", ""):
|
|
481
496
|
# Jenkins build url
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{krkn_lib-5.1.5 → krkn_lib-5.1.10}/src/krkn_lib/k8s/templates/service_hijacking_config_map.j2
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{krkn_lib-5.1.5 → krkn_lib-5.1.10}/src/krkn_lib/tests/test_krkn_kubernetes_pods_monitor_models.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|