krkn-lib 5.1.6__py3-none-any.whl → 5.1.8__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.
@@ -528,6 +528,7 @@ class KrknKubernetes:
528
528
  namespace: str,
529
529
  label_selector: str = None,
530
530
  field_selector: str = None,
531
+ exclude_label: str = None,
531
532
  ) -> list[str]:
532
533
  """
533
534
  List pods in the given namespace
@@ -537,6 +538,8 @@ class KrknKubernetes:
537
538
  (optional default `None`)
538
539
  :param field_selector: filter results by config details
539
540
  select only running pods by setting "status.phase=Running"
541
+ :param exclude_label: exclude pods matching this label
542
+ in format "key=value" (optional default `None`)
540
543
  :return: a list of pod names
541
544
  """
542
545
  pods = []
@@ -552,6 +555,14 @@ class KrknKubernetes:
552
555
  raise e
553
556
  for ret_list in ret:
554
557
  for pod in ret_list.items:
558
+ # Skip pods with the exclude label if specified
559
+ if exclude_label and pod.metadata.labels:
560
+ exclude_key, exclude_value = exclude_label.split("=", 1)
561
+ if (
562
+ exclude_key in pod.metadata.labels
563
+ and pod.metadata.labels[exclude_key] == exclude_value
564
+ ):
565
+ continue
555
566
  pods.append(pod.metadata.name)
556
567
  return pods
557
568
 
@@ -13,6 +13,7 @@ from krkn_lib.models.pod_monitor.models import (
13
13
  PodStatus,
14
14
  )
15
15
 
16
+
16
17
  def _select_pods(
17
18
  select_partial: partial,
18
19
  namespace_pattern: str = None,
@@ -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
@@ -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
- "kraken-deployment", namespace, random_label, node_name
174
+ name, namespace, random_label, node_name
174
175
  )
175
176
  self.apply_template(template)
176
177
 
@@ -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, random_label=None, node_name="do_not_exist"
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, random_label=None, node_name="do_not_exist"
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:
@@ -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, None)
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("prow.ci.openshift.org", ci_job_url)
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
- build_url = f"{prow_base_url}/{job_id}/{task_id}"
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
@@ -1,8 +1,9 @@
1
- Metadata-Version: 2.3
1
+ Metadata-Version: 2.4
2
2
  Name: krkn-lib
3
- Version: 5.1.6
3
+ Version: 5.1.8
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,6 +13,7 @@ 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)
@@ -5,9 +5,9 @@ krkn_lib/aws_tests/test_krkn_telemetry_openshift.py,sha256=AE6nwWi2c2WqjU4mQ2Kr1
5
5
  krkn_lib/elastic/__init__.py,sha256=ApLS0O18jzfu1Oe6Ym7XYlC1bFl9JTYO6VjFQflDlA0,36
6
6
  krkn_lib/elastic/krkn_elastic.py,sha256=YeZqEV61-icQTVrgA_0hDgD5L0zFmM3vmX_m7hXYOJU,8954
7
7
  krkn_lib/k8s/__init__.py,sha256=umPTRrPgLUdtHf9epWNcQaA7p9d3gZFtFiXQw36Pqug,39
8
- krkn_lib/k8s/krkn_kubernetes.py,sha256=ImFQzayZ5hGgYi13WO2lf4YCr96HaHsvaDyd1HSd73k,111590
8
+ krkn_lib/k8s/krkn_kubernetes.py,sha256=ISrJa7PLQ9c-F93UI7W6TvQKMU98gbD_H79QqgZ3QxQ,112165
9
9
  krkn_lib/k8s/pod_monitor/__init__.py,sha256=QTdgv_mOqlB8ViVMRYWCPN0FxG5abxZoCeFUNqGfM3A,351
10
- krkn_lib/k8s/pod_monitor/pod_monitor.py,sha256=qO3XsuD26mTO_tx99_ASFWb_B5YSD3mfoxZL3b2KDxo,10692
10
+ krkn_lib/k8s/pod_monitor/pod_monitor.py,sha256=ICWsbLtgBfqjJy-oUGDdEJKp66rq6DjOv1xUPcaay3A,10693
11
11
  krkn_lib/k8s/templates/hog_pod.j2,sha256=PloumCIFkLpZCJPwNRf5kwcAfLH12AXNepQjdn942Wc,1650
12
12
  krkn_lib/k8s/templates/node_exec_pod.j2,sha256=hj0yryqooF8eZPdoC7-_4kF5OCvPagfItuRO4PhevaI,558
13
13
  krkn_lib/k8s/templates/service_hijacking_config_map.j2,sha256=Ma9W640yR-sRf9VgC5ha_enRjc-I1NAeAtNg4fglJAg,146
@@ -21,7 +21,7 @@ krkn_lib/models/k8s/models.py,sha256=NOscNnO9MumRS69gAUos8hXxB34aFv0YXNb9TPsgrPw
21
21
  krkn_lib/models/krkn/__init__.py,sha256=B5B2XDHj9grxPBwcGm2SCXAyqtJHkywwDUFPvmrh_H4,30
22
22
  krkn_lib/models/krkn/models.py,sha256=npVBsyog_cPrGVHyDzdkAXhkmGlpsusSM_q9nCyN5rE,6762
23
23
  krkn_lib/models/pod_monitor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
24
- krkn_lib/models/pod_monitor/models.py,sha256=DBHdzX9bEjwuiccqx7nz2P0Hyxq7nCimaxBXvh1jDOs,8398
24
+ krkn_lib/models/pod_monitor/models.py,sha256=MbBKwXV-dZxtM9wYp0ELLX_WIV3oysoMpZCuMKqONBo,8763
25
25
  krkn_lib/models/telemetry/__init__.py,sha256=B5B2XDHj9grxPBwcGm2SCXAyqtJHkywwDUFPvmrh_H4,30
26
26
  krkn_lib/models/telemetry/models.py,sha256=UmO2lqQ2Ya0Xdw5jkdqlZWtiKQKEs0RPrD4S_QKhPYw,18538
27
27
  krkn_lib/ocp/__init__.py,sha256=CmweI-5lweWd8wG3q0y9m2ENAr9xvC7aldoJkjC3PQQ,38
@@ -34,30 +34,30 @@ krkn_lib/telemetry/k8s/krkn_telemetry_kubernetes.py,sha256=dglDCGwbYc1HjiMCV01qH
34
34
  krkn_lib/telemetry/ocp/__init__.py,sha256=DgRL7JxW766o2L8m-E94ftgCdWhsgjURz6gAb9J9Rio,48
35
35
  krkn_lib/telemetry/ocp/krkn_telemetry_openshift.py,sha256=rpK-TJfpeJWUEQQgzpeUMhMvv3s1J9FrJtIOTUUPndY,9475
36
36
  krkn_lib/tests/__init__.py,sha256=_-mAJNNBGEod6A8tfckMP9loSOi_Bj4YHvpo93aqHME,33
37
- krkn_lib/tests/base_test.py,sha256=2xeG0njyIkNTswEpFIzcwkDQx28R53f4DLEq38P3LHo,22238
37
+ krkn_lib/tests/base_test.py,sha256=K0cOpFvVKwT4E_4RVFEadmY0neqEs3tiJry1JuvzjDA,22264
38
38
  krkn_lib/tests/test_krkn_elastic.py,sha256=VFNu_NQLXEaq2rFR7BLwtynigVLuw8vhBNEUm53vpII,5612
39
39
  krkn_lib/tests/test_krkn_elastic_models.py,sha256=q-ivGcvd72aS-Sam4-Jm1tNxLnigyugdSV-QOqtIE8M,9096
40
- krkn_lib/tests/test_krkn_kubernetes_check.py,sha256=7ElT--pJd52ql_WBAfWIa_p27bpWOH6gk_EEcCw_tXc,9333
40
+ krkn_lib/tests/test_krkn_kubernetes_check.py,sha256=z2TJlqMcs208jx6VbF9jTB0DXmTytXIFkZ88nAU8aTU,9403
41
41
  krkn_lib/tests/test_krkn_kubernetes_create.py,sha256=QGnO9bwrk_eRyH-4LaEZY6cxu9Qdlcc8CQDxwsnkr5A,2597
42
42
  krkn_lib/tests/test_krkn_kubernetes_delete.py,sha256=VXl-NhWrJejwxRhpeyjPVngggQsHeuJ17UfgdXxSF3k,5021
43
43
  krkn_lib/tests/test_krkn_kubernetes_exec.py,sha256=BX3x-kSE-HGOZYNEosTDFbeHFBLDhnvyBC9Arai_Bf4,6927
44
44
  krkn_lib/tests/test_krkn_kubernetes_get.py,sha256=psTuDuvTTINPNK6Mnn69g9ZKNHKcWJ2fFvw8Kx4g0wI,13064
45
- krkn_lib/tests/test_krkn_kubernetes_list.py,sha256=_qZJux76O_kDehFRcNDqjWX5edTrKY0_BSa-iky4NWA,5065
45
+ krkn_lib/tests/test_krkn_kubernetes_list.py,sha256=ofOK_x_CewHZHU15OGj1-CUQM3-WqM3jkdpDC6NzB-0,6256
46
46
  krkn_lib/tests/test_krkn_kubernetes_misc.py,sha256=W-0I5BPIMVO7E3HMh5WsB1hVjq37uNb2YsX2EcN75AQ,13557
47
47
  krkn_lib/tests/test_krkn_kubernetes_models.py,sha256=4iUoLz-m2EHFwFOgGx2HBJ-dwRDhv_8wXSZ5TQd72-U,6291
48
- krkn_lib/tests/test_krkn_kubernetes_pods_monitor.py,sha256=-zgKVqIU2yL5iXHbJe9VXIQMTDvgImnGEVGzONsEBLk,21001
48
+ krkn_lib/tests/test_krkn_kubernetes_pods_monitor.py,sha256=x4sfBxMWucNTxVJHR89q2ypVIMxt46iR5Mm6t8O7VMg,21149
49
49
  krkn_lib/tests/test_krkn_kubernetes_pods_monitor_models.py,sha256=R3Bn-R6C192xDpIJAZU5NKfn9UN2NCiQEDAbkyu9oBA,12794
50
50
  krkn_lib/tests/test_krkn_openshift.py,sha256=ZXHQ8VutqWsjfTdjdvfGGXqNnPL9ByfHKYjkQLkwl1w,4108
51
51
  krkn_lib/tests/test_krkn_prometheus.py,sha256=Yh3rHjomZGke6tgfebGyPt_L6di8a7QplPneTVmd70w,9308
52
52
  krkn_lib/tests/test_krkn_telemetry_models.py,sha256=J2PI4KAfZ7gSKhPC9DTJtlBKtObf69Kh_WbHcKbK8_Q,16219
53
- krkn_lib/tests/test_utils.py,sha256=ndGh4wlLDDVP8oJ_4iCThVQkU-IMqrWibqDuVDcK1-U,14346
53
+ krkn_lib/tests/test_utils.py,sha256=wdOO2blrbGk0r0szQNfgsYWc3UHdyRzD8fwNxyKK4VI,14959
54
54
  krkn_lib/tests/test_version.py,sha256=UepvN_1NixumE1mQssrv0G_Fp2bWibtvbDjEgmWoqe0,209
55
55
  krkn_lib/utils/__init__.py,sha256=1U4hxrKaKha2eWTrxyrvjNO3bZNoybQAy8Ne_Oglbxc,68
56
- krkn_lib/utils/functions.py,sha256=idKZNCFllAuHjZDGpT5LJESWeTU580NhLkp5KQL9PZo,16724
56
+ krkn_lib/utils/functions.py,sha256=H4xA321fp-MzmKV97_n1FYsmqsm3dUw_hex0qHlKjYU,17546
57
57
  krkn_lib/utils/safe_logger.py,sha256=NLVy7589hZqrxc-YhkEOhg8GBJ7jxKofAQotiyvyo-4,3687
58
58
  krkn_lib/version/__init__.py,sha256=0MLmj0ik-h9IVeq7zw8Xi5ux99DHfxJQ83Iv9Aqiubc,41
59
59
  krkn_lib/version/version.py,sha256=pdrCTedp-HDIYnG6e-AwN2nMK8vdbNTioqXxJpIZ6b8,80
60
- krkn_lib-5.1.6.dist-info/LICENSE,sha256=DOwG4OVfvD3FzuT8qbYH9my49OTbzzs8ATWU3RVnMuk,10173
61
- krkn_lib-5.1.6.dist-info/METADATA,sha256=-HHt5A3BgWFLkKu5bwAy_61-oJeP7MkifN6rrQNrX0k,2709
62
- krkn_lib-5.1.6.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
63
- krkn_lib-5.1.6.dist-info/RECORD,,
60
+ krkn_lib-5.1.8.dist-info/METADATA,sha256=X29DEeeEYwrMjQRDSCAfcDkCBReIjw1VtWRESDhbrpg,2782
61
+ krkn_lib-5.1.8.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
62
+ krkn_lib-5.1.8.dist-info/licenses/LICENSE,sha256=DOwG4OVfvD3FzuT8qbYH9my49OTbzzs8ATWU3RVnMuk,10173
63
+ krkn_lib-5.1.8.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: poetry-core 2.1.3
2
+ Generator: poetry-core 2.2.1
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any