Skip to content
This repository was archived by the owner on Mar 10, 2025. It is now read-only.

Commit 14b353f

Browse files
author
Dennis Li
committed
Use the configured repository when running exporting AWS Batch jobs with --skip-docker.
1 parent b0ea667 commit 14b353f

File tree

6 files changed

+79
-9
lines changed

6 files changed

+79
-9
lines changed

CHANGELOG.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ CHANGELOG
44
0.9.4dev
55
--------
66

7+
* Feature - `--skip-docker` uses the configured repository in soopervisor.yaml when exporting to AWS Batch. (by @DennisJLi)
8+
79
0.9.3 (2024-09-18)
810
------------------
911

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ def read(*names, **kwargs):
2929
"tqdm",
3030
"pydantic",
3131
"Jinja2",
32-
"pyyaml",
32+
"pyyaml>=6.0.2",
3333
"ploomber>=0.14.6",
3434
"ploomber-core>=0.0.11",
3535
# sdist is generated using python -m build, so adding this here.

src/soopervisor/assets/airflow/kubernetes.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
from airflow import DAG
55
from airflow.utils.dates import days_ago
6-
from airflow.providers.cncf.kubernetes.operators.kubernetes_pod import (
6+
from airflow.providers.cncf.kubernetes.operators.pod import (
77
KubernetesPodOperator,
88
)
99

src/soopervisor/aws/batch.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -280,13 +280,11 @@ def _export(
280280
"submit all tasks regardless of status"
281281
)
282282
if skip_docker:
283-
pkg_name, version = source.find_package_name_and_version()
283+
pkg_name, _ = source.find_package_name_and_version()
284+
image = f"{cfg.repository}:latest"
284285
default_image_key = get_default_image_key()
285-
if default_image_key:
286-
image_local = f"{pkg_name}:{version}-"
287-
f"{docker.modify_wildcard(default_image_key)}"
288286
image_map = {}
289-
image_map[default_image_key] = image_local
287+
image_map[default_image_key] = image
290288
else:
291289
pkg_name, image_map = docker.build(
292290
cmdr,

tests/airflow/test_airflow_export.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import json
77

88
from airflow import DAG
9-
from airflow.providers.cncf.kubernetes.operators.kubernetes_pod import (
9+
from airflow.providers.cncf.kubernetes.operators.pod import (
1010
KubernetesPodOperator,
1111
)
1212
from airflow.operators.bash import BashOperator

tests/aws_batch/test_export.py

Lines changed: 71 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ def test_export(
169169

170170

171171
# TODO: check error if wrong task name
172-
# TODO: check errro when task is up to date
172+
# TODO: check error when task is up to date
173173
# TODO: check error if dependencies from submitted task are outdated
174174
@pytest.mark.parametrize(
175175
"mode, args",
@@ -662,3 +662,73 @@ def test_lazy_load(mock_aws_batch_lazy_load, monkeypatch):
662662
path_to_config="soopervisor.yaml", env_name="train", lazy_import=True
663663
)
664664
exporter.export(mode="incremental", lazy_import=True)
665+
666+
667+
def test_export_with_skip_docker_uses_configured_repository(
668+
mock_batch,
669+
monkeypatch,
670+
tmp_sample_project_multiple_requirement,
671+
monkeypatch_docker_client,
672+
skip_repo_validation,
673+
boto3_mock,
674+
monkeypatch_docker_commons,
675+
load_tasks_mock,
676+
):
677+
monkeypatch.setattr(batch, "uuid4", lambda: "uuid4")
678+
monkeypatch.setattr(batch.boto3, "client", lambda name, region_name: boto3_mock)
679+
monkeypatch.setattr(commons, "load_tasks", load_tasks_mock)
680+
681+
repository = "123456789012.dkr.ecr.us-east-1.amazonaws.com/my-repository/model"
682+
683+
exporter = batch.AWSBatchExporter.new("soopervisor.yaml", "some-env")
684+
exporter._cfg.repository = repository
685+
exporter.add()
686+
687+
# mock commander
688+
commander_mock = MagicMock()
689+
monkeypatch.setattr(
690+
batch, "Commander", lambda workspace, templates_path: commander_mock
691+
)
692+
693+
exporter.export(mode="incremental", skip_docker=True)
694+
695+
jobs = mock_batch.list_jobs(jobQueue="your-job-queue")["jobSummaryList"]
696+
697+
# get jobs information
698+
jobs_info = mock_batch.describe_jobs(jobs=[job["jobId"] for job in jobs])["jobs"]
699+
700+
job_defs = mock_batch.describe_job_definitions(
701+
jobDefinitions=[job["jobDefinition"] for job in jobs_info]
702+
)["jobDefinitions"]
703+
704+
# check all tasks submitted
705+
assert {j["jobName"] for j in jobs_info} == {"raw", "clean-1", "plot", "clean-2"}
706+
707+
# check submitted to the right queue
708+
assert all(["your-job-queue" in j["jobQueue"] for j in jobs_info])
709+
710+
# check created a job definition with the right name
711+
job_definitions = {j["jobName"]: j["jobDefinition"] for j in jobs_info}
712+
assert job_definitions == {
713+
"raw": "arn:aws:batch:us-east-1:123456789012:job-definition/"
714+
"multiple_requirements_project-uuid4:1",
715+
"clean-1": "arn:aws:batch:us-east-1:123456789012:job-definition/"
716+
"multiple_requirements_project-uuid4:1",
717+
"clean-2": "arn:aws:batch:us-east-1:123456789012:job-definition/"
718+
"multiple_requirements_project-uuid4:1",
719+
"plot": "arn:aws:batch:us-east-1:123456789012:job-definition/"
720+
"multiple_requirements_project-uuid4:1",
721+
}
722+
723+
job_images = {
724+
j["jobDefinitionArn"]: j["containerProperties"]["image"] for j in job_defs
725+
}
726+
727+
expected_image = f"{repository}:latest"
728+
729+
expected = {
730+
"arn:aws:batch:us-east-1:123456789012:job-definition/"
731+
"multiple_requirements_project-uuid4:1": expected_image,
732+
}
733+
734+
assert job_images == expected

0 commit comments

Comments
 (0)