|
43 | 43 | PY_FILE = 'gs://my-bucket/my-object.py'
|
44 | 44 | PY_INTERPRETER = 'python3'
|
45 | 45 | JAR_FILE = 'gs://my-bucket/example/test.jar'
|
| 46 | +LOCAL_JAR_FILE = '/mnt/dev/example/test.jar' |
46 | 47 | JOB_CLASS = 'com.test.NotMain'
|
47 | 48 | PY_OPTIONS = ['-m']
|
48 | 49 | DEFAULT_OPTIONS_PYTHON = DEFAULT_OPTIONS_JAVA = {
|
@@ -380,6 +381,68 @@ def set_is_job_dataflow_running_variables(*args, **kwargs):
|
380 | 381 | )
|
381 | 382 |
|
382 | 383 |
|
| 384 | +class TestDataflowJavaOperatorWithLocal(unittest.TestCase): |
| 385 | + def setUp(self): |
| 386 | + self.dataflow = DataflowCreateJavaJobOperator( |
| 387 | + task_id=TASK_ID, |
| 388 | + jar=LOCAL_JAR_FILE, |
| 389 | + job_name=JOB_NAME, |
| 390 | + job_class=JOB_CLASS, |
| 391 | + dataflow_default_options=DEFAULT_OPTIONS_JAVA, |
| 392 | + options=ADDITIONAL_OPTIONS, |
| 393 | + poll_sleep=POLL_SLEEP, |
| 394 | + location=TEST_LOCATION, |
| 395 | + ) |
| 396 | + self.expected_airflow_version = 'v' + airflow.version.version.replace(".", "-").replace("+", "-") |
| 397 | + |
| 398 | + def test_init(self): |
| 399 | + """Test DataflowTemplateOperator instance is properly initialized.""" |
| 400 | + assert self.dataflow.jar == LOCAL_JAR_FILE |
| 401 | + |
| 402 | + @mock.patch('airflow.providers.google.cloud.operators.dataflow.BeamHook') |
| 403 | + @mock.patch('airflow.providers.google.cloud.operators.dataflow.DataflowHook') |
| 404 | + def test_check_job_not_running_exec(self, dataflow_hook_mock, beam_hook_mock): |
| 405 | + """Test DataflowHook is created and the right args are passed to |
| 406 | + start_java_workflow with option to check if job is running |
| 407 | + """ |
| 408 | + is_job_dataflow_running_variables = None |
| 409 | + |
| 410 | + def set_is_job_dataflow_running_variables(*args, **kwargs): |
| 411 | + nonlocal is_job_dataflow_running_variables |
| 412 | + is_job_dataflow_running_variables = copy.deepcopy(kwargs.get("variables")) |
| 413 | + |
| 414 | + dataflow_running = dataflow_hook_mock.return_value.is_job_dataflow_running |
| 415 | + dataflow_running.side_effect = set_is_job_dataflow_running_variables |
| 416 | + dataflow_running.return_value = False |
| 417 | + start_java_mock = beam_hook_mock.return_value.start_java_pipeline |
| 418 | + self.dataflow.check_if_running = True |
| 419 | + |
| 420 | + self.dataflow.execute(None) |
| 421 | + expected_variables = { |
| 422 | + 'project': dataflow_hook_mock.return_value.project_id, |
| 423 | + 'stagingLocation': 'gs://test/staging', |
| 424 | + 'jobName': JOB_NAME, |
| 425 | + 'region': TEST_LOCATION, |
| 426 | + 'output': 'gs://test/output', |
| 427 | + 'labels': {'foo': 'bar', 'airflow-version': self.expected_airflow_version}, |
| 428 | + } |
| 429 | + self.assertEqual(expected_variables, is_job_dataflow_running_variables) |
| 430 | + job_name = dataflow_hook_mock.return_value.build_dataflow_job_name.return_value |
| 431 | + expected_variables["jobName"] = job_name |
| 432 | + start_java_mock.assert_called_once_with( |
| 433 | + variables=expected_variables, |
| 434 | + jar=LOCAL_JAR_FILE, |
| 435 | + job_class=JOB_CLASS, |
| 436 | + process_line_callback=mock.ANY, |
| 437 | + ) |
| 438 | + dataflow_hook_mock.return_value.wait_for_done.assert_called_once_with( |
| 439 | + job_id=mock.ANY, |
| 440 | + job_name=job_name, |
| 441 | + location=TEST_LOCATION, |
| 442 | + multiple_jobs=False, |
| 443 | + ) |
| 444 | + |
| 445 | + |
383 | 446 | class TestDataflowTemplateOperator(unittest.TestCase):
|
384 | 447 | def setUp(self):
|
385 | 448 | self.dataflow = DataflowTemplatedJobStartOperator(
|
|
0 commit comments