krkn-lib 5.1.7__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.
Files changed (63) hide show
  1. {krkn_lib-5.1.7 → krkn_lib-5.1.10}/PKG-INFO +4 -4
  2. {krkn_lib-5.1.7 → krkn_lib-5.1.10}/pyproject.toml +4 -4
  3. {krkn_lib-5.1.7 → krkn_lib-5.1.10}/src/krkn_lib/k8s/krkn_kubernetes.py +50 -0
  4. {krkn_lib-5.1.7 → krkn_lib-5.1.10}/src/krkn_lib/k8s/pod_monitor/pod_monitor.py +1 -0
  5. {krkn_lib-5.1.7 → krkn_lib-5.1.10}/src/krkn_lib/models/elastic/models.py +2 -0
  6. {krkn_lib-5.1.7 → krkn_lib-5.1.10}/src/krkn_lib/models/pod_monitor/models.py +4 -4
  7. {krkn_lib-5.1.7 → krkn_lib-5.1.10}/src/krkn_lib/models/telemetry/models.py +5 -0
  8. {krkn_lib-5.1.7 → krkn_lib-5.1.10}/src/krkn_lib/tests/base_test.py +5 -1
  9. {krkn_lib-5.1.7 → krkn_lib-5.1.10}/src/krkn_lib/tests/test_krkn_elastic_models.py +6 -0
  10. {krkn_lib-5.1.7 → krkn_lib-5.1.10}/src/krkn_lib/tests/test_krkn_kubernetes_check.py +6 -2
  11. {krkn_lib-5.1.7 → krkn_lib-5.1.10}/src/krkn_lib/tests/test_krkn_kubernetes_list.py +46 -0
  12. {krkn_lib-5.1.7 → krkn_lib-5.1.10}/src/krkn_lib/tests/test_krkn_kubernetes_pods_monitor.py +4 -1
  13. {krkn_lib-5.1.7 → krkn_lib-5.1.10}/src/krkn_lib/utils/functions.py +7 -8
  14. {krkn_lib-5.1.7 → krkn_lib-5.1.10}/LICENSE +0 -0
  15. {krkn_lib-5.1.7 → krkn_lib-5.1.10}/README.md +0 -0
  16. {krkn_lib-5.1.7 → krkn_lib-5.1.10}/src/krkn_lib/__init__.py +0 -0
  17. {krkn_lib-5.1.7 → krkn_lib-5.1.10}/src/krkn_lib/aws_tests/__init__.py +0 -0
  18. {krkn_lib-5.1.7 → krkn_lib-5.1.10}/src/krkn_lib/aws_tests/test_krkn_telemetry_kubernetes.py +0 -0
  19. {krkn_lib-5.1.7 → krkn_lib-5.1.10}/src/krkn_lib/aws_tests/test_krkn_telemetry_openshift.py +0 -0
  20. {krkn_lib-5.1.7 → krkn_lib-5.1.10}/src/krkn_lib/elastic/__init__.py +0 -0
  21. {krkn_lib-5.1.7 → krkn_lib-5.1.10}/src/krkn_lib/elastic/krkn_elastic.py +0 -0
  22. {krkn_lib-5.1.7 → krkn_lib-5.1.10}/src/krkn_lib/k8s/__init__.py +0 -0
  23. {krkn_lib-5.1.7 → krkn_lib-5.1.10}/src/krkn_lib/k8s/pod_monitor/__init__.py +0 -0
  24. {krkn_lib-5.1.7 → krkn_lib-5.1.10}/src/krkn_lib/k8s/templates/hog_pod.j2 +0 -0
  25. {krkn_lib-5.1.7 → krkn_lib-5.1.10}/src/krkn_lib/k8s/templates/node_exec_pod.j2 +0 -0
  26. {krkn_lib-5.1.7 → krkn_lib-5.1.10}/src/krkn_lib/k8s/templates/service_hijacking_config_map.j2 +0 -0
  27. {krkn_lib-5.1.7 → krkn_lib-5.1.10}/src/krkn_lib/k8s/templates/service_hijacking_pod.j2 +0 -0
  28. {krkn_lib-5.1.7 → krkn_lib-5.1.10}/src/krkn_lib/k8s/templates/syn_flood_pod.j2 +0 -0
  29. {krkn_lib-5.1.7 → krkn_lib-5.1.10}/src/krkn_lib/models/__init__.py +0 -0
  30. {krkn_lib-5.1.7 → krkn_lib-5.1.10}/src/krkn_lib/models/elastic/__init__.py +0 -0
  31. {krkn_lib-5.1.7 → krkn_lib-5.1.10}/src/krkn_lib/models/k8s/__init__.py +0 -0
  32. {krkn_lib-5.1.7 → krkn_lib-5.1.10}/src/krkn_lib/models/k8s/models.py +0 -0
  33. {krkn_lib-5.1.7 → krkn_lib-5.1.10}/src/krkn_lib/models/krkn/__init__.py +0 -0
  34. {krkn_lib-5.1.7 → krkn_lib-5.1.10}/src/krkn_lib/models/krkn/models.py +0 -0
  35. {krkn_lib-5.1.7 → krkn_lib-5.1.10}/src/krkn_lib/models/pod_monitor/__init__.py +0 -0
  36. {krkn_lib-5.1.7 → krkn_lib-5.1.10}/src/krkn_lib/models/telemetry/__init__.py +0 -0
  37. {krkn_lib-5.1.7 → krkn_lib-5.1.10}/src/krkn_lib/ocp/__init__.py +0 -0
  38. {krkn_lib-5.1.7 → krkn_lib-5.1.10}/src/krkn_lib/ocp/krkn_openshift.py +0 -0
  39. {krkn_lib-5.1.7 → krkn_lib-5.1.10}/src/krkn_lib/prometheus/__init__.py +0 -0
  40. {krkn_lib-5.1.7 → krkn_lib-5.1.10}/src/krkn_lib/prometheus/krkn_prometheus.py +0 -0
  41. {krkn_lib-5.1.7 → krkn_lib-5.1.10}/src/krkn_lib/telemetry/__init__.py +0 -0
  42. {krkn_lib-5.1.7 → krkn_lib-5.1.10}/src/krkn_lib/telemetry/k8s/__init__.py +0 -0
  43. {krkn_lib-5.1.7 → krkn_lib-5.1.10}/src/krkn_lib/telemetry/k8s/krkn_telemetry_kubernetes.py +0 -0
  44. {krkn_lib-5.1.7 → krkn_lib-5.1.10}/src/krkn_lib/telemetry/ocp/__init__.py +0 -0
  45. {krkn_lib-5.1.7 → krkn_lib-5.1.10}/src/krkn_lib/telemetry/ocp/krkn_telemetry_openshift.py +0 -0
  46. {krkn_lib-5.1.7 → krkn_lib-5.1.10}/src/krkn_lib/tests/__init__.py +0 -0
  47. {krkn_lib-5.1.7 → krkn_lib-5.1.10}/src/krkn_lib/tests/test_krkn_elastic.py +0 -0
  48. {krkn_lib-5.1.7 → krkn_lib-5.1.10}/src/krkn_lib/tests/test_krkn_kubernetes_create.py +0 -0
  49. {krkn_lib-5.1.7 → krkn_lib-5.1.10}/src/krkn_lib/tests/test_krkn_kubernetes_delete.py +0 -0
  50. {krkn_lib-5.1.7 → krkn_lib-5.1.10}/src/krkn_lib/tests/test_krkn_kubernetes_exec.py +0 -0
  51. {krkn_lib-5.1.7 → krkn_lib-5.1.10}/src/krkn_lib/tests/test_krkn_kubernetes_get.py +0 -0
  52. {krkn_lib-5.1.7 → krkn_lib-5.1.10}/src/krkn_lib/tests/test_krkn_kubernetes_misc.py +0 -0
  53. {krkn_lib-5.1.7 → krkn_lib-5.1.10}/src/krkn_lib/tests/test_krkn_kubernetes_models.py +0 -0
  54. {krkn_lib-5.1.7 → krkn_lib-5.1.10}/src/krkn_lib/tests/test_krkn_kubernetes_pods_monitor_models.py +0 -0
  55. {krkn_lib-5.1.7 → krkn_lib-5.1.10}/src/krkn_lib/tests/test_krkn_openshift.py +0 -0
  56. {krkn_lib-5.1.7 → krkn_lib-5.1.10}/src/krkn_lib/tests/test_krkn_prometheus.py +0 -0
  57. {krkn_lib-5.1.7 → krkn_lib-5.1.10}/src/krkn_lib/tests/test_krkn_telemetry_models.py +0 -0
  58. {krkn_lib-5.1.7 → krkn_lib-5.1.10}/src/krkn_lib/tests/test_utils.py +0 -0
  59. {krkn_lib-5.1.7 → krkn_lib-5.1.10}/src/krkn_lib/tests/test_version.py +0 -0
  60. {krkn_lib-5.1.7 → krkn_lib-5.1.10}/src/krkn_lib/utils/__init__.py +0 -0
  61. {krkn_lib-5.1.7 → krkn_lib-5.1.10}/src/krkn_lib/utils/safe_logger.py +0 -0
  62. {krkn_lib-5.1.7 → krkn_lib-5.1.10}/src/krkn_lib/version/__init__.py +0 -0
  63. {krkn_lib-5.1.7 → krkn_lib-5.1.10}/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.10
4
4
  Summary: Foundation library for Kraken
5
5
  License: Apache-2.0
6
6
  License-File: LICENSE
@@ -19,10 +19,10 @@ Requires-Dist: base64io (>=1.0.3,<2.0.0)
19
19
  Requires-Dist: coverage (>=7.6.12,<8.0.0)
20
20
  Requires-Dist: cython (==3.0)
21
21
  Requires-Dist: deprecation (==2.1.0)
22
- Requires-Dist: elasticsearch (==7.13.4)
23
- Requires-Dist: elasticsearch-dsl (==7.4.1)
22
+ Requires-Dist: elasticsearch (==8.19.1)
23
+ Requires-Dist: elasticsearch-dsl (==8.18.0)
24
24
  Requires-Dist: kubeconfig (>=1.1.1,<2.0.0)
25
- Requires-Dist: kubernetes (==28.1.0)
25
+ Requires-Dist: kubernetes (==34.1.0)
26
26
  Requires-Dist: numpy (==1.26.4)
27
27
  Requires-Dist: prometheus-api-client (>=0.5.4,<0.6.0)
28
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.7"
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 ="28.1.0"
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 = "7.13.4"
24
- elasticsearch-dsl = "7.4.1"
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
@@ -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,
@@ -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,
@@ -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
@@ -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
- "kraken-deployment", namespace, random_label, node_name
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, 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