3
3
4
4
import pytest
5
5
from airflow .exceptions import TaskDeferred
6
- from airflow .providers .cncf .kubernetes .triggers .kubernetes_pod import ContainerState
7
- from airflow .providers .cncf .kubernetes .utils .pod_manager import PodLoggingStatus
6
+ from airflow .providers .cncf .kubernetes .utils .pod_manager import (
7
+ PodLoggingStatus ,
8
+ PodPhase ,
9
+ )
8
10
from kubernetes .client import models as k8s
9
11
10
12
from astronomer .providers .cncf .kubernetes .operators .kubernetes_pod import (
@@ -172,63 +174,22 @@ def test_defer_with_kwargs(self):
172
174
with pytest .raises (ValueError ):
173
175
op .defer (kwargs = {"timeout" : 10 })
174
176
177
+ @pytest .mark .parametrize ("pod_phase" , PodPhase .terminal_states )
175
178
@mock .patch (f"{ KUBE_POD_MOD } .KubernetesPodOperatorAsync.trigger_reentry" )
176
- @mock .patch (
177
- f"{ KUBE_POD_MOD } .KubernetesPodOperatorAsync.define_container_state" ,
178
- return_value = ContainerState .FAILED ,
179
- )
180
179
@mock .patch (f"{ KUBE_POD_MOD } .KubernetesPodOperatorAsync.build_pod_request_obj" )
181
180
@mock .patch (f"{ KUBE_POD_MOD } .KubernetesPodOperatorAsync.get_or_create_pod" )
182
181
@mock .patch (f"{ KUBE_POD_MOD } .KubernetesPodOperatorAsync.defer" )
183
- def test_execute_failed_before_defer (
184
- self ,
185
- mock_defer ,
186
- mock_get_or_create_pod ,
187
- mock_build_pod_request_obj ,
188
- mock_define_container_state ,
189
- mock_trigger_reentry ,
182
+ def test_execute_done_before_defer (
183
+ self , mock_defer , mock_get_or_create_pod , mock_build_pod_request_obj , mock_trigger_reentry , pod_phase
190
184
):
191
- mock_get_or_create_pod .return_value = _build_mock_pod (
192
- k8s .V1ContainerState ({"running" : k8s .V1ContainerStateTerminated (exit_code = 1 ), "waiting" : None })
193
- )
194
- mock_build_pod_request_obj .return_value = {}
195
- mock_defer .return_value = {}
196
- op = KubernetesPodOperatorAsync (task_id = "test_task" , name = "test-pod" , get_logs = True )
197
-
198
- op .execute (context = create_context (op ))
199
- assert mock_trigger_reentry .called
200
- assert not mock_defer .called
201
-
202
- @mock .patch (f"{ KUBE_POD_MOD } .KubernetesPodOperatorAsync.trigger_reentry" )
203
- @mock .patch (
204
- f"{ KUBE_POD_MOD } .KubernetesPodOperatorAsync.define_container_state" ,
205
- return_value = ContainerState .TERMINATED ,
206
- )
207
- @mock .patch (f"{ KUBE_POD_MOD } .KubernetesPodOperatorAsync.build_pod_request_obj" )
208
- @mock .patch (f"{ KUBE_POD_MOD } .KubernetesPodOperatorAsync.get_or_create_pod" )
209
- @mock .patch (f"{ KUBE_POD_MOD } .KubernetesPodOperatorAsync.defer" )
210
- def test_execute_succeeded_before_defer (
211
- self ,
212
- mock_defer ,
213
- mock_get_or_create_pod ,
214
- mock_build_pod_request_obj ,
215
- mock_define_container_state ,
216
- mock_trigger_reentry ,
217
- ):
218
- mock_get_or_create_pod .return_value = _build_mock_pod (
219
- k8s .V1ContainerState ({"running" : k8s .V1ContainerStateTerminated (exit_code = 0 ), "waiting" : None })
220
- )
185
+ mock_get_or_create_pod .return_value .status .phase = pod_phase
221
186
mock_build_pod_request_obj .return_value = {}
222
187
mock_defer .return_value = {}
223
188
op = KubernetesPodOperatorAsync (task_id = "test_task" , name = "test-pod" , get_logs = True )
224
189
assert op .execute (context = create_context (op ))
225
190
assert mock_trigger_reentry .called
226
191
assert not mock_defer .called
227
192
228
- @mock .patch (
229
- "astronomer.providers.cncf.kubernetes.operators.kubernetes_pod.KubernetesPodOperatorAsync.define_container_state" ,
230
- return_value = ContainerState .RUNNING ,
231
- )
232
193
@mock .patch (f"{ KUBE_POD_MOD } .KubernetesPodOperatorAsync.build_pod_request_obj" )
233
194
@mock .patch (f"{ KUBE_POD_MOD } .KubernetesPodOperatorAsync.get_or_create_pod" )
234
195
@mock .patch (f"{ KUBE_POD_MOD } .KubernetesPodOperatorAsync.defer" )
@@ -237,7 +198,6 @@ def test_execute(
237
198
mock_defer ,
238
199
mock_get_or_create_pod ,
239
200
mock_build_pod_request_obj ,
240
- mock_define_container_state ,
241
201
):
242
202
"""Assert that execute succeeded"""
243
203
mock_get_or_create_pod .return_value = _build_mock_pod (
@@ -256,40 +216,3 @@ def test_execute_complete(self, mock_trigger_reentry):
256
216
mock_trigger_reentry .return_value = {}
257
217
op = KubernetesPodOperatorAsync (task_id = "test_task" , name = "test-pod" , get_logs = True )
258
218
assert op .execute_complete (context = create_context (op ), event = {}) is None
259
-
260
- @pytest .mark .parametrize (
261
- "container_state, expected_state" ,
262
- [
263
- (
264
- {"running" : k8s .V1ContainerStateRunning (), "terminated" : None , "waiting" : None },
265
- ContainerState .RUNNING ,
266
- ),
267
- (
268
- {"running" : None , "terminated" : k8s .V1ContainerStateTerminated (exit_code = 0 ), "waiting" : None },
269
- ContainerState .TERMINATED ,
270
- ),
271
- (
272
- {"running" : None , "terminated" : None , "waiting" : k8s .V1ContainerStateWaiting ()},
273
- ContainerState .WAITING ,
274
- ),
275
- ],
276
- )
277
- def test_define_container_state_should_execute_successfully (self , container_state , expected_state ):
278
- op = KubernetesPodOperatorAsync (task_id = "test_task" , name = "test-pod" , get_logs = True )
279
- op .pod = _build_mock_pod (k8s .V1ContainerState (** container_state ))
280
- assert expected_state == op .define_container_state ()
281
-
282
- @pytest .mark .parametrize (
283
- "pod" ,
284
- (
285
- _build_mock_pod (k8s .V1ContainerState (running = None , terminated = None , waiting = None )),
286
- k8s .V1Pod (
287
- metadata = k8s .V1ObjectMeta (name = "base" , namespace = "default" ),
288
- status = k8s .V1PodStatus (container_statuses = []),
289
- ),
290
- ),
291
- )
292
- def test_define_container_state_with_undefined_state (self , pod ):
293
- op = KubernetesPodOperatorAsync (task_id = "test_task" , name = "test-pod" , get_logs = True )
294
- op .pod = pod
295
- assert op .define_container_state () == ContainerState .UNDEFINED
0 commit comments