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.
- {krkn_lib-5.1.7 → krkn_lib-5.1.9}/PKG-INFO +1 -1
- {krkn_lib-5.1.7 → krkn_lib-5.1.9}/pyproject.toml +1 -1
- {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/k8s/krkn_kubernetes.py +44 -0
- {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/k8s/pod_monitor/pod_monitor.py +1 -0
- {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/models/pod_monitor/models.py +4 -4
- {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/tests/base_test.py +2 -1
- {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/tests/test_krkn_kubernetes_check.py +6 -2
- {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/tests/test_krkn_kubernetes_list.py +46 -0
- {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/tests/test_krkn_kubernetes_pods_monitor.py +4 -1
- {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/utils/functions.py +7 -8
- {krkn_lib-5.1.7 → krkn_lib-5.1.9}/LICENSE +0 -0
- {krkn_lib-5.1.7 → krkn_lib-5.1.9}/README.md +0 -0
- {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/__init__.py +0 -0
- {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/aws_tests/__init__.py +0 -0
- {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/aws_tests/test_krkn_telemetry_kubernetes.py +0 -0
- {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/aws_tests/test_krkn_telemetry_openshift.py +0 -0
- {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/elastic/__init__.py +0 -0
- {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/elastic/krkn_elastic.py +0 -0
- {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/k8s/__init__.py +0 -0
- {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/k8s/pod_monitor/__init__.py +0 -0
- {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/k8s/templates/hog_pod.j2 +0 -0
- {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/k8s/templates/node_exec_pod.j2 +0 -0
- {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/k8s/templates/service_hijacking_config_map.j2 +0 -0
- {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/k8s/templates/service_hijacking_pod.j2 +0 -0
- {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/k8s/templates/syn_flood_pod.j2 +0 -0
- {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/models/__init__.py +0 -0
- {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/models/elastic/__init__.py +0 -0
- {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/models/elastic/models.py +0 -0
- {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/models/k8s/__init__.py +0 -0
- {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/models/k8s/models.py +0 -0
- {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/models/krkn/__init__.py +0 -0
- {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/models/krkn/models.py +0 -0
- {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/models/pod_monitor/__init__.py +0 -0
- {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/models/telemetry/__init__.py +0 -0
- {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/models/telemetry/models.py +0 -0
- {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/ocp/__init__.py +0 -0
- {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/ocp/krkn_openshift.py +0 -0
- {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/prometheus/__init__.py +0 -0
- {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/prometheus/krkn_prometheus.py +0 -0
- {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/telemetry/__init__.py +0 -0
- {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/telemetry/k8s/__init__.py +0 -0
- {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/telemetry/k8s/krkn_telemetry_kubernetes.py +0 -0
- {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/telemetry/ocp/__init__.py +0 -0
- {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/telemetry/ocp/krkn_telemetry_openshift.py +0 -0
- {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/tests/__init__.py +0 -0
- {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/tests/test_krkn_elastic.py +0 -0
- {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/tests/test_krkn_elastic_models.py +0 -0
- {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/tests/test_krkn_kubernetes_create.py +0 -0
- {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/tests/test_krkn_kubernetes_delete.py +0 -0
- {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/tests/test_krkn_kubernetes_exec.py +0 -0
- {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/tests/test_krkn_kubernetes_get.py +0 -0
- {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/tests/test_krkn_kubernetes_misc.py +0 -0
- {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/tests/test_krkn_kubernetes_models.py +0 -0
- {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/tests/test_krkn_kubernetes_pods_monitor_models.py +0 -0
- {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/tests/test_krkn_openshift.py +0 -0
- {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/tests/test_krkn_prometheus.py +0 -0
- {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/tests/test_krkn_telemetry_models.py +0 -0
- {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/tests/test_utils.py +0 -0
- {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/tests/test_version.py +0 -0
- {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/utils/__init__.py +0 -0
- {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/utils/safe_logger.py +0 -0
- {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/version/__init__.py +0 -0
- {krkn_lib-5.1.7 → krkn_lib-5.1.9}/src/krkn_lib/version/version.py +0 -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
|
|
@@ -144,7 +144,8 @@ class PodsSnapshot:
|
|
|
144
144
|
)
|
|
145
145
|
)
|
|
146
146
|
else:
|
|
147
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
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()
|
|
@@ -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(
|
|
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
|
-
|
|
476
|
-
|
|
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
|
-
|
|
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
|
|
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.7 → krkn_lib-5.1.9}/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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{krkn_lib-5.1.7 → krkn_lib-5.1.9}/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
|
|
File without changes
|