krkn-lib 5.1.7__tar.gz → 5.1.9__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.
Files changed (63) hide show
  1. {krkn_lib-5.1.7 → krkn_lib-5.1.9}/PKG-INFO +1 -1
  2. {krkn_lib-5.1.7 → krkn_lib-5.1.9}/pyproject.toml +1 -1
  3. {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/k8s/krkn_kubernetes.py +44 -0
  4. {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/k8s/pod_monitor/pod_monitor.py +1 -0
  5. {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/models/pod_monitor/models.py +4 -4
  6. {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/tests/base_test.py +2 -1
  7. {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/tests/test_krkn_kubernetes_check.py +6 -2
  8. {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/tests/test_krkn_kubernetes_list.py +46 -0
  9. {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/tests/test_krkn_kubernetes_pods_monitor.py +4 -1
  10. {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/utils/functions.py +7 -8
  11. {krkn_lib-5.1.7 → krkn_lib-5.1.9}/LICENSE +0 -0
  12. {krkn_lib-5.1.7 → krkn_lib-5.1.9}/README.md +0 -0
  13. {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/__init__.py +0 -0
  14. {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/aws_tests/__init__.py +0 -0
  15. {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/aws_tests/test_krkn_telemetry_kubernetes.py +0 -0
  16. {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/aws_tests/test_krkn_telemetry_openshift.py +0 -0
  17. {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/elastic/__init__.py +0 -0
  18. {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/elastic/krkn_elastic.py +0 -0
  19. {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/k8s/__init__.py +0 -0
  20. {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/k8s/pod_monitor/__init__.py +0 -0
  21. {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/k8s/templates/hog_pod.j2 +0 -0
  22. {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/k8s/templates/node_exec_pod.j2 +0 -0
  23. {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/k8s/templates/service_hijacking_config_map.j2 +0 -0
  24. {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/k8s/templates/service_hijacking_pod.j2 +0 -0
  25. {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/k8s/templates/syn_flood_pod.j2 +0 -0
  26. {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/models/__init__.py +0 -0
  27. {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/models/elastic/__init__.py +0 -0
  28. {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/models/elastic/models.py +0 -0
  29. {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/models/k8s/__init__.py +0 -0
  30. {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/models/k8s/models.py +0 -0
  31. {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/models/krkn/__init__.py +0 -0
  32. {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/models/krkn/models.py +0 -0
  33. {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/models/pod_monitor/__init__.py +0 -0
  34. {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/models/telemetry/__init__.py +0 -0
  35. {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/models/telemetry/models.py +0 -0
  36. {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/ocp/__init__.py +0 -0
  37. {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/ocp/krkn_openshift.py +0 -0
  38. {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/prometheus/__init__.py +0 -0
  39. {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/prometheus/krkn_prometheus.py +0 -0
  40. {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/telemetry/__init__.py +0 -0
  41. {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/telemetry/k8s/__init__.py +0 -0
  42. {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/telemetry/k8s/krkn_telemetry_kubernetes.py +0 -0
  43. {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/telemetry/ocp/__init__.py +0 -0
  44. {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/telemetry/ocp/krkn_telemetry_openshift.py +0 -0
  45. {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/tests/__init__.py +0 -0
  46. {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/tests/test_krkn_elastic.py +0 -0
  47. {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/tests/test_krkn_elastic_models.py +0 -0
  48. {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/tests/test_krkn_kubernetes_create.py +0 -0
  49. {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/tests/test_krkn_kubernetes_delete.py +0 -0
  50. {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/tests/test_krkn_kubernetes_exec.py +0 -0
  51. {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/tests/test_krkn_kubernetes_get.py +0 -0
  52. {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/tests/test_krkn_kubernetes_misc.py +0 -0
  53. {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/tests/test_krkn_kubernetes_models.py +0 -0
  54. {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/tests/test_krkn_kubernetes_pods_monitor_models.py +0 -0
  55. {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/tests/test_krkn_openshift.py +0 -0
  56. {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/tests/test_krkn_prometheus.py +0 -0
  57. {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/tests/test_krkn_telemetry_models.py +0 -0
  58. {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/tests/test_utils.py +0 -0
  59. {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/tests/test_version.py +0 -0
  60. {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/utils/__init__.py +0 -0
  61. {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/utils/safe_logger.py +0 -0
  62. {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/version/__init__.py +0 -0
  63. {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/version/version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: krkn-lib
3
- Version: 5.1.7
3
+ Version: 5.1.9
4
4
  Summary: Foundation library for Kraken
5
5
  License: Apache-2.0
6
6
  License-File: LICENSE
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "krkn-lib"
3
- version = "5.1.7"
3
+ version = "5.1.9"
4
4
  description = "Foundation library for Kraken"
5
5
  authors = ["Red Hat Chaos Team"]
6
6
  license = "Apache-2.0"
@@ -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
 
@@ -3130,3 +3141,36 @@ class KrknKubernetes:
3130
3141
  pids_list = list(filter(None, pids_list))
3131
3142
  return pids_list
3132
3143
  return None
3144
+
3145
+ def list_pod_network_interfaces(
3146
+ self, pod_name: str, namespace: str, container_name: str = None
3147
+ ) -> list[str]:
3148
+ """
3149
+ Lists the network interfaces of a pod (Linux only)
3150
+ :param pod_name: the name of the pod
3151
+ :param namespace: the namespaces of the pod
3152
+ :param container_name: the container of the pod where the interfaces
3153
+ will be listed, if None the first will be picked
3154
+ :return: the list of the interfaces
3155
+ """
3156
+
3157
+ if not self.check_if_pod_exists(pod_name, namespace):
3158
+ raise Exception(
3159
+ f"target pod {pod_name} does not exist in "
3160
+ f"namespace {namespace}"
3161
+ )
3162
+
3163
+ cmd = "ls /sys/class/net"
3164
+ nics_str = self.exec_cmd_in_pod(
3165
+ [cmd],
3166
+ pod_name,
3167
+ namespace,
3168
+ container_name,
3169
+ )
3170
+ nics = nics_str.split("\n")
3171
+ try:
3172
+ nics.remove("lo")
3173
+ nics.remove("")
3174
+ except ValueError:
3175
+ pass
3176
+ return nics
@@ -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,
@@ -144,7 +144,8 @@ class PodsSnapshot:
144
144
  )
145
145
  )
146
146
  else:
147
- # pod stayed ready but was restarted
147
+
148
+ # pod stayed ready but was restarted
148
149
  # or has a failed container
149
150
  pods_status.recovered.append(
150
151
  AffectedPod(
@@ -153,9 +154,8 @@ class PodsSnapshot:
153
154
  pod_readiness_time=ready_status.timestamp
154
155
  - status_change.timestamp,
155
156
  pod_rescheduling_time=0,
156
- total_recovery_time=
157
- ready_status.timestamp
158
- - status_change.timestamp
157
+ total_recovery_time=ready_status.timestamp
158
+ - status_change.timestamp,
159
159
  )
160
160
  )
161
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:
@@ -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()
@@ -443,7 +443,10 @@ class TestKrknKubernetesPodsMonitor(BaseTest):
443
443
  self.assertEqual(len(pods_status.recovered), 1)
444
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(pods_status.recovered[0].total_recovery_time, pods_status.recovered[0].pod_readiness_time)
446
+ self.assertEqual(
447
+ pods_status.recovered[0].total_recovery_time,
448
+ pods_status.recovered[0].pod_readiness_time,
449
+ )
447
450
 
448
451
  def test_monitor_stopping_earlier(self):
449
452
 
@@ -472,13 +472,12 @@ 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
- prow_pr_base_url=(
476
- "https://prow.ci.openshift.org/view/gs/test-platform-results/pr-logs/pull/openshift_release" # NOQA
477
- )
475
+
476
+ prow_pr_base_url = "https://prow.ci.openshift.org/view/gs/test-platform-results/pr-logs/pull/openshift_release" # NOQA
478
477
  task_id = os.getenv("BUILD_ID")
479
478
  job_id = os.getenv("JOB_NAME")
480
479
  pull_number = os.getenv("PULL_NUMBER")
481
- job_type=os.getenv("JOB_TYPE")
480
+ job_type = os.getenv("JOB_TYPE")
482
481
  if job_type == "presubmit" and "pull" in task_id:
483
482
  # Indicates a ci test triggered in PR against source code
484
483
  job_type = "pull"
@@ -487,11 +486,11 @@ def get_ci_job_url():
487
486
  job_type = "pull"
488
487
  # Handle cases where a periodic job iw triggered via pull request
489
488
  if job_type == "periodic" and pull_number:
490
- job_type = "pull"
491
- if job_type == "pull" :
492
- build_url=f"{prow_pr_base_url}/{pull_number}/{task_id}/{job_id}"
489
+ job_type = "pull"
490
+ if job_type == "pull":
491
+ build_url = f"{prow_pr_base_url}/{pull_number}/{task_id}/{job_id}"
493
492
  else:
494
- build_url=f"{prow_base_url}/{job_id}/{task_id}"
493
+ build_url = f"{prow_base_url}/{job_id}/{task_id}"
495
494
 
496
495
  elif os.getenv("BUILD_URL", ""):
497
496
  # Jenkins build url
File without changes
File without changes