Skip to content

Commit 56ff5a5

Browse files
authored
[CVAT] Oracle updates (#3219)
* Rename job_creation_failed to escrow_failed * Update migration template * Update cvat_sdk dependency * Update cvat task creation status checks * Improve matching for local manifests in debug mode * Update annotation downloading code
1 parent 143d5d9 commit 56ff5a5

File tree

21 files changed

+250
-218
lines changed

21 files changed

+250
-218
lines changed

packages/examples/cvat/exchange-oracle/alembic/script.py.mako

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
"""${message}
1+
"""
2+
${message}
23

34
Revision ID: ${up_revision}
45
Revises: ${down_revision | comma,n}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
"""
2+
Rename "job_creation_failed" to "escrow_failed"
3+
4+
Revision ID: c32b36a87539
5+
Revises: 0a91b6a5f7b6
6+
Create Date: 2025-03-21 16:54:04.057456
7+
8+
"""
9+
10+
from sqlalchemy import Column, String, update
11+
from sqlalchemy.orm import declarative_base
12+
13+
from alembic import op
14+
15+
# revision identifiers, used by Alembic.
16+
revision = "c32b36a87539"
17+
down_revision = "0a91b6a5f7b6"
18+
branch_labels = None
19+
depends_on = None
20+
21+
22+
Base = declarative_base()
23+
24+
old_name = "job_creation_failed"
25+
new_name = "escrow_failed"
26+
27+
28+
class Webhook(Base):
29+
# Represents the model before the transaction is applied
30+
31+
__tablename__ = "webhooks"
32+
id = Column(String, primary_key=True, index=True)
33+
event_type = Column(String, nullable=False)
34+
35+
36+
def update_webhook_types():
37+
op.execute(update(Webhook).where(Webhook.event_type == old_name).values(event_type=new_name))
38+
39+
40+
def revert_webhook_types():
41+
op.execute(update(Webhook).where(Webhook.event_type == new_name).values(event_type=old_name))
42+
43+
44+
def upgrade() -> None:
45+
update_webhook_types()
46+
47+
48+
def downgrade() -> None:
49+
revert_webhook_types()

packages/examples/cvat/exchange-oracle/debug.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from collections.abc import Generator
44
from contextlib import ExitStack, contextmanager
55
from logging import Logger
6-
from pathlib import Path
6+
from pathlib import Path, PurePosixPath
77
from typing import Any
88
from unittest import mock
99

@@ -62,7 +62,9 @@ def patched_get_escrow(chain_id: int, escrow_address: str) -> EscrowData:
6262
minio_manifests = minio_client.list_files(bucket="manifests")
6363
logger.debug(f"DEV: Local manifests: {format_sequence(minio_manifests)}")
6464

65-
candidate_files = [fn for fn in minio_manifests if f"{escrow_address}.json" in fn]
65+
candidate_files = [
66+
fn for fn in minio_manifests if PurePosixPath(fn).name == f"{escrow_address}.json"
67+
]
6668
if not candidate_files:
6769
return original_get_escrow(ChainId(chain_id), escrow_address)
6870
elif len(candidate_files) != 1:

packages/examples/cvat/exchange-oracle/poetry.lock

Lines changed: 5 additions & 28 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/examples/cvat/exchange-oracle/pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ sqlalchemy-utils = "^0.41.1"
1616
alembic = "^1.11.1"
1717
httpx = "^0.24.1"
1818
pytest = "^7.2.2"
19-
cvat-sdk = "2.25.0"
19+
cvat-sdk = "2.31.0"
2020
sqlalchemy = "^2.0.16"
2121
apscheduler = "^3.10.1"
2222
xmltodict = "^0.13.0"

packages/examples/cvat/exchange-oracle/src/core/oracle_events.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ class RejectedAssignmentInfo(BaseModel):
3838
assignments: list[RejectedAssignmentInfo]
3939

4040

41-
class ExchangeOracleEvent_JobCreationFailed(OracleEvent):
41+
class ExchangeOracleEvent_EscrowFailed(OracleEvent):
4242
# no task_id, escrow is enough for now
4343
reason: str
4444

@@ -60,7 +60,7 @@ class ReputationOracleEvent_EscrowCompleted(OracleEvent):
6060
JobLauncherEventTypes.escrow_canceled: JobLauncherEvent_EscrowCanceled,
6161
RecordingOracleEventTypes.job_completed: RecordingOracleEvent_JobCompleted,
6262
RecordingOracleEventTypes.submission_rejected: RecordingOracleEvent_SubmissionRejected,
63-
ExchangeOracleEventTypes.job_creation_failed: ExchangeOracleEvent_JobCreationFailed,
63+
ExchangeOracleEventTypes.escrow_failed: ExchangeOracleEvent_EscrowFailed,
6464
ExchangeOracleEventTypes.job_finished: ExchangeOracleEvent_JobFinished,
6565
ExchangeOracleEventTypes.escrow_cleaned: ExchangeOracleEvent_EscrowCleaned,
6666
ReputationOracleEventTypes.escrow_completed: ReputationOracleEvent_EscrowCompleted,

packages/examples/cvat/exchange-oracle/src/core/types.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ class OracleWebhookTypes(str, Enum, metaclass=BetterEnumMeta):
6262

6363

6464
class ExchangeOracleEventTypes(str, Enum, metaclass=BetterEnumMeta):
65-
job_creation_failed = "job_creation_failed"
65+
escrow_failed = "escrow_failed"
6666
job_finished = "job_finished"
6767
escrow_cleaned = "escrow_cleaned"
6868

packages/examples/cvat/exchange-oracle/src/crons/cvat/state_trackers.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import src.services.webhook as oracle_db_service
99
from src import db
1010
from src.core.config import CronConfig
11-
from src.core.oracle_events import ExchangeOracleEvent_JobCreationFailed
11+
from src.core.oracle_events import ExchangeOracleEvent_EscrowFailed
1212
from src.core.types import JobStatuses, OracleWebhookTypes, ProjectStatuses
1313
from src.crons._cron_job import cron_job
1414
from src.db import SessionLocal
@@ -159,7 +159,7 @@ def track_task_creation(logger: logging.Logger, session: Session) -> None:
159159
for upload in uploads:
160160
status, reason = cvat_api.get_task_upload_status(upload.task_id)
161161
project = upload.task.project
162-
if not status or status == cvat_api.UploadStatus.FAILED:
162+
if not status or status == cvat_api.RequestStatus.FAILED:
163163
# TODO: add retries if 5xx
164164
failed.append(upload)
165165

@@ -168,9 +168,9 @@ def track_task_creation(logger: logging.Logger, session: Session) -> None:
168168
escrow_address=project.escrow_address,
169169
chain_id=project.chain_id,
170170
type=OracleWebhookTypes.job_launcher,
171-
event=ExchangeOracleEvent_JobCreationFailed(reason=reason),
171+
event=ExchangeOracleEvent_EscrowFailed(reason=reason),
172172
)
173-
elif status == cvat_api.UploadStatus.FINISHED:
173+
elif status == cvat_api.RequestStatus.FINISHED:
174174
try:
175175
cvat_jobs = cvat_api.fetch_task_jobs(upload.task_id)
176176

@@ -200,7 +200,7 @@ def track_task_creation(logger: logging.Logger, session: Session) -> None:
200200
escrow_address=project.escrow_address,
201201
chain_id=project.chain_id,
202202
type=OracleWebhookTypes.job_launcher,
203-
event=ExchangeOracleEvent_JobCreationFailed(reason=str(e)),
203+
event=ExchangeOracleEvent_EscrowFailed(reason=str(e)),
204204
)
205205

206206
if completed:

packages/examples/cvat/exchange-oracle/src/crons/webhooks/job_launcher.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
from src.core.config import Config, CronConfig
1212
from src.core.oracle_events import (
1313
ExchangeOracleEvent_EscrowCleaned,
14-
ExchangeOracleEvent_JobCreationFailed,
14+
ExchangeOracleEvent_EscrowFailed,
1515
)
1616
from src.core.types import JobLauncherEventTypes, Networks, OracleWebhookTypes, ProjectStatuses
1717
from src.crons._cron_job import cron_job
@@ -36,7 +36,7 @@ def handle_failure(session: Session, webhook: Webhook, exc: Exception) -> None:
3636
escrow_address=webhook.escrow_address,
3737
chain_id=webhook.chain_id,
3838
type=OracleWebhookTypes.job_launcher,
39-
event=ExchangeOracleEvent_JobCreationFailed(reason=str(exc)),
39+
event=ExchangeOracleEvent_EscrowFailed(reason=str(exc)),
4040
)
4141

4242

0 commit comments

Comments
 (0)