|
69 | 69 | _TEST_PIPELINE_JOB_SCHEDULE_MAX_CONCURRENT_RUN_COUNT = 1
|
70 | 70 | _TEST_PIPELINE_JOB_SCHEDULE_MAX_RUN_COUNT = 2
|
71 | 71 |
|
| 72 | +_TEST_UPDATED_PIPELINE_JOB_SCHEDULE_CRON_EXPRESSION = "1 1 1 1 1" |
| 73 | +_TEST_UPDATED_PIPELINE_JOB_SCHEDULE_MAX_RUN_COUNT = 5 |
| 74 | + |
72 | 75 | _TEST_TEMPLATE_PATH = f"gs://{_TEST_GCS_BUCKET_NAME}/job_spec.json"
|
73 | 76 | _TEST_AR_TEMPLATE_PATH = "https://us-central1-kfp.pkg.dev/proj/repo/pack/latest"
|
74 | 77 | _TEST_HTTPS_TEMPLATE_PATH = "https://raw.githubusercontent.com/repo/pipeline.json"
|
@@ -371,6 +374,23 @@ def mock_pipeline_service_list():
|
371 | 374 | yield mock_list_pipeline_jobs
|
372 | 375 |
|
373 | 376 |
|
| 377 | +@pytest.fixture |
| 378 | +def mock_schedule_service_update(): |
| 379 | + with mock.patch.object( |
| 380 | + schedule_service_client.ScheduleServiceClient, "update_schedule" |
| 381 | + ) as mock_update_schedule: |
| 382 | + mock_update_schedule.return_value = gca_schedule.Schedule( |
| 383 | + name=_TEST_PIPELINE_JOB_SCHEDULE_DISPLAY_NAME, |
| 384 | + state=gca_schedule.Schedule.State.COMPLETED, |
| 385 | + create_time=_TEST_PIPELINE_CREATE_TIME, |
| 386 | + cron=_TEST_UPDATED_PIPELINE_JOB_SCHEDULE_CRON_EXPRESSION, |
| 387 | + max_concurrent_run_count=_TEST_PIPELINE_JOB_SCHEDULE_MAX_CONCURRENT_RUN_COUNT, |
| 388 | + max_run_count=_TEST_UPDATED_PIPELINE_JOB_SCHEDULE_MAX_RUN_COUNT, |
| 389 | + create_pipeline_job_request=_TEST_CREATE_PIPELINE_JOB_REQUEST, |
| 390 | + ) |
| 391 | + yield mock_update_schedule |
| 392 | + |
| 393 | + |
374 | 394 | @pytest.fixture
|
375 | 395 | def mock_load_yaml_and_json(job_spec):
|
376 | 396 | with patch.object(storage.Blob, "download_as_bytes") as mock_load_yaml_and_json:
|
@@ -1304,3 +1324,114 @@ def test_resume_pipeline_job_schedule_without_created(
|
1304 | 1324 | pipeline_job_schedule.resume()
|
1305 | 1325 |
|
1306 | 1326 | assert e.match(regexp=r"Schedule resource has not been created")
|
| 1327 | + |
| 1328 | + @pytest.mark.parametrize( |
| 1329 | + "job_spec", |
| 1330 | + [_TEST_PIPELINE_SPEC_JSON, _TEST_PIPELINE_SPEC_YAML, _TEST_PIPELINE_JOB], |
| 1331 | + ) |
| 1332 | + def test_call_schedule_service_update( |
| 1333 | + self, |
| 1334 | + mock_schedule_service_create, |
| 1335 | + mock_schedule_service_update, |
| 1336 | + mock_schedule_service_get, |
| 1337 | + mock_schedule_bucket_exists, |
| 1338 | + job_spec, |
| 1339 | + mock_load_yaml_and_json, |
| 1340 | + ): |
| 1341 | + """Updates a PipelineJobSchedule. |
| 1342 | +
|
| 1343 | + Updates cron_expression and max_run_count. |
| 1344 | + """ |
| 1345 | + aiplatform.init( |
| 1346 | + project=_TEST_PROJECT, |
| 1347 | + staging_bucket=_TEST_GCS_BUCKET_NAME, |
| 1348 | + location=_TEST_LOCATION, |
| 1349 | + credentials=_TEST_CREDENTIALS, |
| 1350 | + ) |
| 1351 | + |
| 1352 | + job = pipeline_jobs.PipelineJob( |
| 1353 | + display_name=_TEST_PIPELINE_JOB_DISPLAY_NAME, |
| 1354 | + template_path=_TEST_TEMPLATE_PATH, |
| 1355 | + parameter_values=_TEST_PIPELINE_PARAMETER_VALUES, |
| 1356 | + input_artifacts=_TEST_PIPELINE_INPUT_ARTIFACTS, |
| 1357 | + enable_caching=True, |
| 1358 | + ) |
| 1359 | + |
| 1360 | + pipeline_job_schedule = pipeline_job_schedules.PipelineJobSchedule( |
| 1361 | + pipeline_job=job, |
| 1362 | + display_name=_TEST_PIPELINE_JOB_SCHEDULE_DISPLAY_NAME, |
| 1363 | + ) |
| 1364 | + |
| 1365 | + pipeline_job_schedule.create( |
| 1366 | + cron_expression=_TEST_PIPELINE_JOB_SCHEDULE_CRON_EXPRESSION, |
| 1367 | + max_concurrent_run_count=_TEST_PIPELINE_JOB_SCHEDULE_MAX_CONCURRENT_RUN_COUNT, |
| 1368 | + max_run_count=_TEST_PIPELINE_JOB_SCHEDULE_MAX_RUN_COUNT, |
| 1369 | + service_account=_TEST_SERVICE_ACCOUNT, |
| 1370 | + network=_TEST_NETWORK, |
| 1371 | + create_request_timeout=None, |
| 1372 | + ) |
| 1373 | + |
| 1374 | + pipeline_job_schedule.update( |
| 1375 | + cron_expression=_TEST_UPDATED_PIPELINE_JOB_SCHEDULE_CRON_EXPRESSION, |
| 1376 | + max_run_count=_TEST_UPDATED_PIPELINE_JOB_SCHEDULE_MAX_RUN_COUNT, |
| 1377 | + ) |
| 1378 | + |
| 1379 | + expected_gapic_pipeline_job_schedule = gca_schedule.Schedule( |
| 1380 | + name=_TEST_PIPELINE_JOB_SCHEDULE_NAME, |
| 1381 | + state=gca_schedule.Schedule.State.COMPLETED, |
| 1382 | + create_time=_TEST_PIPELINE_CREATE_TIME, |
| 1383 | + cron=_TEST_UPDATED_PIPELINE_JOB_SCHEDULE_CRON_EXPRESSION, |
| 1384 | + max_concurrent_run_count=_TEST_PIPELINE_JOB_SCHEDULE_MAX_CONCURRENT_RUN_COUNT, |
| 1385 | + max_run_count=_TEST_UPDATED_PIPELINE_JOB_SCHEDULE_MAX_RUN_COUNT, |
| 1386 | + create_pipeline_job_request=_TEST_CREATE_PIPELINE_JOB_REQUEST, |
| 1387 | + ) |
| 1388 | + assert ( |
| 1389 | + pipeline_job_schedule._gca_resource == expected_gapic_pipeline_job_schedule |
| 1390 | + ) |
| 1391 | + |
| 1392 | + @pytest.mark.parametrize( |
| 1393 | + "job_spec", |
| 1394 | + [_TEST_PIPELINE_SPEC_JSON, _TEST_PIPELINE_SPEC_YAML, _TEST_PIPELINE_JOB], |
| 1395 | + ) |
| 1396 | + def test_call_schedule_service_update_before_create( |
| 1397 | + self, |
| 1398 | + mock_schedule_service_create, |
| 1399 | + mock_schedule_service_update, |
| 1400 | + mock_schedule_service_get, |
| 1401 | + mock_schedule_bucket_exists, |
| 1402 | + job_spec, |
| 1403 | + mock_load_yaml_and_json, |
| 1404 | + ): |
| 1405 | + """Updates a PipelineJobSchedule. |
| 1406 | +
|
| 1407 | + Raises error because PipelineJobSchedule should be created before update. |
| 1408 | + """ |
| 1409 | + aiplatform.init( |
| 1410 | + project=_TEST_PROJECT, |
| 1411 | + staging_bucket=_TEST_GCS_BUCKET_NAME, |
| 1412 | + location=_TEST_LOCATION, |
| 1413 | + credentials=_TEST_CREDENTIALS, |
| 1414 | + ) |
| 1415 | + |
| 1416 | + job = pipeline_jobs.PipelineJob( |
| 1417 | + display_name=_TEST_PIPELINE_JOB_DISPLAY_NAME, |
| 1418 | + template_path=_TEST_TEMPLATE_PATH, |
| 1419 | + parameter_values=_TEST_PIPELINE_PARAMETER_VALUES, |
| 1420 | + input_artifacts=_TEST_PIPELINE_INPUT_ARTIFACTS, |
| 1421 | + enable_caching=True, |
| 1422 | + ) |
| 1423 | + |
| 1424 | + pipeline_job_schedule = pipeline_job_schedules.PipelineJobSchedule( |
| 1425 | + pipeline_job=job, |
| 1426 | + display_name=_TEST_PIPELINE_JOB_SCHEDULE_DISPLAY_NAME, |
| 1427 | + ) |
| 1428 | + |
| 1429 | + with pytest.raises(RuntimeError) as e: |
| 1430 | + pipeline_job_schedule.update( |
| 1431 | + cron_expression=_TEST_UPDATED_PIPELINE_JOB_SCHEDULE_CRON_EXPRESSION, |
| 1432 | + max_run_count=_TEST_UPDATED_PIPELINE_JOB_SCHEDULE_MAX_RUN_COUNT, |
| 1433 | + ) |
| 1434 | + |
| 1435 | + assert e.match( |
| 1436 | + regexp=r"Not updating PipelineJobSchedule: PipelineJobSchedule must be active or completed." |
| 1437 | + ) |
0 commit comments