|
15 | 15 | # specific language governing permissions and limitations
|
16 | 16 | # under the License.
|
17 | 17 | #
|
| 18 | +import multiprocessing |
18 | 19 | import random
|
19 | 20 | import re
|
20 | 21 | import string
|
|
30 | 31 | try:
|
31 | 32 | from kubernetes.client.rest import ApiException
|
32 | 33 |
|
33 |
| - from airflow.executors.kubernetes_executor import AirflowKubernetesScheduler, KubernetesExecutor |
| 34 | + from airflow.executors.kubernetes_executor import ( |
| 35 | + AirflowKubernetesScheduler, KubernetesExecutor, KubernetesJobWatcher, |
| 36 | + ) |
34 | 37 | from airflow.kubernetes import pod_generator
|
35 | 38 | from airflow.kubernetes.pod_generator import PodGenerator
|
36 | 39 | from airflow.utils.state import State
|
37 | 40 | except ImportError:
|
38 | 41 | AirflowKubernetesScheduler = None # type: ignore
|
39 | 42 |
|
40 | 43 |
|
| 44 | +class TestKubernetesJobWatcher(unittest.TestCase): |
| 45 | + def setUp(self) -> None: |
| 46 | + self.watcher_queue = multiprocessing.Manager().Queue() |
| 47 | + self.watcher = KubernetesJobWatcher( |
| 48 | + namespace="namespace", |
| 49 | + multi_namespace_mode=False, |
| 50 | + watcher_queue=self.watcher_queue, |
| 51 | + resource_version="0", |
| 52 | + worker_uuid="0", |
| 53 | + kube_config=None, |
| 54 | + ) |
| 55 | + |
| 56 | + def test_running_task(self): |
| 57 | + self.watcher.process_status( |
| 58 | + pod_id="pod_id", |
| 59 | + namespace="namespace", |
| 60 | + status="Running", |
| 61 | + annotations={"foo": "bar"}, |
| 62 | + resource_version="5", |
| 63 | + event={"type": "ADDED"} |
| 64 | + ) |
| 65 | + self.assertTrue(self.watcher_queue.empty()) |
| 66 | + |
| 67 | + def test_succeeded_task(self): |
| 68 | + self.watcher.process_status( |
| 69 | + pod_id="pod_id", |
| 70 | + namespace="namespace", |
| 71 | + status="Succeeded", |
| 72 | + annotations={"foo": "bar"}, |
| 73 | + resource_version="5", |
| 74 | + event={"type": "ADDED"} |
| 75 | + ) |
| 76 | + result = self.watcher_queue.get_nowait() |
| 77 | + self.assertEqual(('pod_id', 'namespace', None, {'foo': 'bar'}, '5'), result) |
| 78 | + self.assertTrue(self.watcher_queue.empty()) |
| 79 | + |
| 80 | + def test_failed_task(self): |
| 81 | + self.watcher.process_status( |
| 82 | + pod_id="pod_id", |
| 83 | + namespace="namespace", |
| 84 | + status="Failed", |
| 85 | + annotations={"foo": "bar"}, |
| 86 | + resource_version="5", |
| 87 | + event={"type": "ADDED"} |
| 88 | + ) |
| 89 | + result = self.watcher_queue.get_nowait() |
| 90 | + self.assertEqual(('pod_id', 'namespace', "failed", {'foo': 'bar'}, '5'), result) |
| 91 | + self.assertTrue(self.watcher_queue.empty()) |
| 92 | + |
| 93 | + |
41 | 94 | # pylint: disable=unused-argument
|
42 | 95 | class TestAirflowKubernetesScheduler(unittest.TestCase):
|
43 | 96 | @staticmethod
|
|
0 commit comments