Skip to content

Commit ad6e3ae

Browse files
committed
refactor: service details refactor to use endpoint iso service
1 parent c56587f commit ad6e3ae

File tree

8 files changed

+63
-26
lines changed

8 files changed

+63
-26
lines changed
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
"""processing_jobs: rename of service_record field
2+
3+
Revision ID: 6105be2a2b21
4+
Revises: a0ca6614c7c1
5+
Create Date: 2025-08-20 16:55:05.666856
6+
7+
"""
8+
from typing import Sequence, Union
9+
10+
from alembic import op
11+
import sqlalchemy as sa
12+
13+
14+
# revision identifiers, used by Alembic.
15+
revision: str = '6105be2a2b21'
16+
down_revision: Union[str, Sequence[str], None] = 'a0ca6614c7c1'
17+
branch_labels: Union[str, Sequence[str], None] = None
18+
depends_on: Union[str, Sequence[str], None] = None
19+
20+
21+
def upgrade() -> None:
22+
"""Upgrade schema."""
23+
# ### commands auto generated by Alembic - please adjust! ###
24+
op.add_column('processing_jobs', sa.Column('service', sa.String(), nullable=False))
25+
op.drop_index(op.f('ix_processing_jobs_service_record'), table_name='processing_jobs')
26+
op.create_index(op.f('ix_processing_jobs_service'), 'processing_jobs', ['service'], unique=False)
27+
op.drop_column('processing_jobs', 'service_record')
28+
# ### end Alembic commands ###
29+
30+
31+
def downgrade() -> None:
32+
"""Downgrade schema."""
33+
# ### commands auto generated by Alembic - please adjust! ###
34+
op.add_column('processing_jobs', sa.Column('service_record', sa.VARCHAR(), autoincrement=False, nullable=False))
35+
op.drop_index(op.f('ix_processing_jobs_service'), table_name='processing_jobs')
36+
op.create_index(op.f('ix_processing_jobs_service_record'), 'processing_jobs', ['service_record'], unique=False)
37+
op.drop_column('processing_jobs', 'service')
38+
# ### end Alembic commands ###

app/database/models/processing_job.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ class ProcessingJobRecord(Base):
2626
platform_job_id: Mapped[str] = mapped_column(String, index=True)
2727
parameters: Mapped[str] = mapped_column(String, index=False)
2828
result_link: Mapped[Optional[str]] = mapped_column(String, index=False)
29-
service_record: Mapped[str] = mapped_column(String, index=True)
29+
service: Mapped[str] = mapped_column(String, index=True)
3030
created: Mapped[datetime.datetime] = mapped_column(
3131
DateTime, default=datetime.datetime.utcnow, index=True
3232
)

app/platforms/implementations/openeo.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ def execute_job(self, title: str, details: ServiceDetails, parameters: dict) ->
111111
f"process_id={process_id}, parameters={parameters}"
112112
)
113113

114-
connection = self._setup_connection(details.service)
114+
connection = self._setup_connection(details.endpoint)
115115
service = connection.datacube_from_process(
116116
process_id=process_id, namespace=details.application, **parameters
117117
)
@@ -153,7 +153,7 @@ def get_job_status(
153153
) -> ProcessingStatusEnum:
154154
try:
155155
logger.debug(f"Fetching job status for openEO job with ID {job_id}")
156-
connection = self._setup_connection(details.service)
156+
connection = self._setup_connection(details.endpoint)
157157
job = connection.job(job_id)
158158
return self._map_openeo_status(job.status())
159159
except Exception as e:
@@ -165,9 +165,9 @@ def get_job_status(
165165
def get_job_result_url(self, job_id: str, details: ServiceDetails) -> str:
166166
try:
167167
logger.debug(f"Fetching job result for openEO job with ID {job_id}")
168-
connection = self._setup_connection(details.service)
168+
connection = self._setup_connection(details.endpoint)
169169
job = connection.job(job_id)
170-
return f"{details.service}{job.get_results_metadata_url()}"
170+
return f"{details.endpoint}{job.get_results_metadata_url()}"
171171
except Exception as e:
172172
logger.exception(
173173
f"Failed to fetch result url for for openEO job with ID {job_id}"

app/schemas/unit_job.py

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

88

99
class ServiceDetails(BaseModel):
10-
service: str
10+
endpoint: str
1111
application: str
1212

1313

app/services/processing.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ def create_processing_job(
4343
platform_job_id=job_id,
4444
parameters=json.dumps(summary.parameters),
4545
result_link=None,
46-
service_record=summary.service.model_dump_json(),
46+
service=summary.service.model_dump_json(),
4747
)
4848
record = save_job_to_db(database, record)
4949
return ProcessingJobSummary(
@@ -54,14 +54,14 @@ def create_processing_job(
5454
def get_job_status(job: ProcessingJobRecord) -> ProcessingStatusEnum:
5555
logger.info(f"Retrieving job status for job: {job.platform_job_id}")
5656
platform = get_processing_platform(job.label)
57-
details = ServiceDetails.model_validate_json(job.service_record)
57+
details = ServiceDetails.model_validate_json(job.service)
5858
return platform.get_job_status(job.platform_job_id, details)
5959

6060

6161
def get_job_result_url(job: ProcessingJobRecord) -> str:
6262
logger.info(f"Retrieving job result for job: {job.platform_job_id}")
6363
platform = get_processing_platform(job.label)
64-
details = ServiceDetails.model_validate_json(job.service_record)
64+
details = ServiceDetails.model_validate_json(job.service)
6565
return platform.get_job_result_url(job.platform_job_id, details)
6666

6767

@@ -115,7 +115,7 @@ def get_processing_job_by_user_id(
115115
title=record.title,
116116
label=record.label,
117117
status=record.status,
118-
service=ServiceDetails.model_validate_json(record.service_record or "{}"),
118+
service=ServiceDetails.model_validate_json(record.service or "{}"),
119119
parameters=json.loads(record.parameters or "{}"),
120120
result_link=record.result_link,
121121
created=record.created,

tests/conftest.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ def fake_processing_job_request():
3232
return BaseJobRequest(
3333
title="Test Job",
3434
label=ProcessTypeEnum.OPENEO,
35-
service=ServiceDetails(service="foo", application="bar"),
35+
service=ServiceDetails(endpoint="foo", application="bar"),
3636
parameters={},
3737
)
3838

@@ -66,7 +66,7 @@ def fake_processing_job_record(
6666
record = ProcessingJobRecord(
6767
**(fake_processing_job_summary.model_dump()),
6868
platform_job_id="platform-job-1",
69-
service_record='{"service":"foo","application":"bar"}',
69+
service='{"endpoint":"foo","application":"bar"}',
7070
parameters="{}",
7171
result_link="https://foo.bar",
7272
created=datetime.now(),

tests/platforms/test_openeo_platform.py

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,7 @@ def mock_env(monkeypatch):
3333
@pytest.fixture
3434
def service_details():
3535
return ServiceDetails(
36-
service="https://openeo.dataspace.copernicus.eu",
37-
service_id="service-1",
36+
endpoint="https://openeo.dataspace.copernicus.eu",
3837
application="https://example.com/process.json",
3938
)
4039

@@ -107,7 +106,7 @@ def test_execute_job_success(mock_pid, mock_connect, platform, service_details):
107106
)
108107

109108
assert job_id == "job123"
110-
mock_connect.assert_called_once_with(service_details.service)
109+
mock_connect.assert_called_once_with(service_details.endpoint)
111110

112111

113112
@patch("app.platforms.implementations.openeo.openeo.connect")
@@ -145,7 +144,7 @@ def test_map_openeo_status(openeo_status, expected_enum):
145144
def test_get_job_status_success(mock_connection, platform):
146145
mock_connection.return_value = DummyOpenEOClient()
147146

148-
details = ServiceDetails(service="foo", application="bar")
147+
details = ServiceDetails(endpoint="foo", application="bar")
149148
result = platform.get_job_status("job123", details)
150149

151150
assert result == ProcessingStatusEnum.RUNNING
@@ -155,7 +154,7 @@ def test_get_job_status_success(mock_connection, platform):
155154
def test_get_job_status_error(mock_connection, platform):
156155
mock_connection.side_effect = RuntimeError("Connection error")
157156

158-
details = ServiceDetails(service="foo", application="bar")
157+
details = ServiceDetails(endpoint="foo", application="bar")
159158
with pytest.raises(SystemError) as exc_info:
160159
platform.get_job_status("job123", details)
161160

@@ -166,7 +165,7 @@ def test_get_job_status_error(mock_connection, platform):
166165
def test_get_job_result_success(mock_connection, platform):
167166
mock_connection.return_value = DummyOpenEOClient()
168167

169-
details = ServiceDetails(service="foo", application="bar")
168+
details = ServiceDetails(endpoint="foo", application="bar")
170169
result = platform.get_job_result_url("job123", details)
171170

172171
assert result == "foo/job/results"
@@ -176,7 +175,7 @@ def test_get_job_result_success(mock_connection, platform):
176175
def test_get_job_url_error(mock_connection, platform):
177176
mock_connection.side_effect = RuntimeError("Connection error")
178177

179-
details = ServiceDetails(service="foo", application="bar")
178+
details = ServiceDetails(endpoint="foo", application="bar")
180179
with pytest.raises(SystemError) as exc_info:
181180
platform.get_job_result_url("job123", details)
182181

tests/services/test_processing.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ def make_job_request():
2626
label=ProcessTypeEnum.OPENEO,
2727
title="Test Job",
2828
service=ServiceDetails(
29-
service="dummy-service-id", application="dummy-application"
29+
endpoint="dummy-service-id", application="dummy-application"
3030
),
3131
parameters={"param": 1},
3232
)
@@ -95,7 +95,7 @@ def test_get_processing_jobs_with_active_and_inactive_statuses(
9595
label=ProcessTypeEnum.OGC_API_PROCESS,
9696
title="Finished Job",
9797
status=ProcessingStatusEnum.FAILED,
98-
service_record=json.dumps({"foo": "bar"}),
98+
service=json.dumps({"foo": "bar"}),
9999
)
100100
mock_get_jobs.return_value = [fake_processing_job_record, inactive_job]
101101
mock_get_job_status.return_value = ProcessingStatusEnum.RUNNING
@@ -149,15 +149,15 @@ def test_get_processing_jobs_with_finished_statuses(
149149
label=ProcessTypeEnum.OGC_API_PROCESS,
150150
title="Finished Job",
151151
status=ProcessingStatusEnum.FINISHED,
152-
service_record=json.dumps({"foo": "bar"}),
152+
service=json.dumps({"foo": "bar"}),
153153
)
154154
finished_job_result = ProcessingJobRecord(
155155
id=3,
156156
platform_job_id="platform456",
157157
label=ProcessTypeEnum.OGC_API_PROCESS,
158158
title="Finished Job",
159159
status=ProcessingStatusEnum.FINISHED,
160-
service_record=json.dumps({"foo": "bar"}),
160+
service=json.dumps({"foo": "bar"}),
161161
result_link="https://foo.bar",
162162
)
163163
mock_get_jobs.return_value = [finished_job_no_result, finished_job_result]
@@ -203,7 +203,7 @@ def test_get_job_result_from_platform(mock_get_platform, fake_processing_job_rec
203203
def test_get_processing_job_by_user_id(mock_get_job, fake_db_session):
204204

205205
fake_service_details = {
206-
"service": "https://openeofed.dataspace.copernicus.eu",
206+
"endpoint": "https://openeofed.dataspace.copernicus.eu",
207207
"application": "https://raw.githubusercontent.com/ESA-APEx/apex_algorithms/"
208208
"32ea3c9a6fa24fe063cb59164cd318cceb7209b0/openeo_udp/variabilitymap/"
209209
"variabilitymap.json",
@@ -219,7 +219,7 @@ def test_get_processing_job_by_user_id(mock_get_job, fake_db_session):
219219
result_link=None,
220220
created="2025-08-11T10:00:00",
221221
updated="2025-08-11T10:00:00",
222-
service_record=json.dumps(fake_service_details),
222+
service=json.dumps(fake_service_details),
223223
)
224224
mock_get_job.return_value = fake_result
225225

@@ -231,7 +231,7 @@ def test_get_processing_job_by_user_id(mock_get_job, fake_db_session):
231231
assert result.title == "Test Job"
232232
assert result.status == ProcessingStatusEnum.CREATED
233233
assert isinstance(result.service, ServiceDetails)
234-
assert result.service.service == fake_service_details["service"]
234+
assert result.service.endpoint == fake_service_details["endpoint"]
235235
assert result.service.application == fake_service_details["application"]
236236
assert result.parameters == {"param1": "value1"}
237237

0 commit comments

Comments
 (0)