queue status: show final experiment name

fix: #8059

1. showing final experiment name in `queue status` for successful tasks.
2. Add a unit test for `celery_queue.status`
This commit is contained in:
karajan1001
2022-08-08 15:49:51 +09:00
committed by Peter Rowlands (변기호)
parent 306456d453
commit 9180a718c1
2 changed files with 85 additions and 2 deletions
+5 -2
View File
@@ -184,9 +184,12 @@ class BaseStashQueue(ABC):
def _format_entry( def _format_entry(
entry: QueueEntry, entry: QueueEntry,
exp_result: Optional[ExecutorResult] = None,
status: str = "Unknown", status: str = "Unknown",
) -> Dict[str, Any]: ) -> Dict[str, Any]:
name = entry.name name = entry.name
if not name and exp_result and exp_result.ref_info:
name = exp_result.ref_info.name
# NOTE: We fallback to Unknown status for experiments # NOTE: We fallback to Unknown status for experiments
# generated in prior (incompatible) DVC versions # generated in prior (incompatible) DVC versions
return { return {
@@ -209,8 +212,8 @@ class BaseStashQueue(ABC):
for queue_entry, _ in self.iter_failed() for queue_entry, _ in self.iter_failed()
) )
result.extend( result.extend(
_format_entry(queue_entry, status="Success") _format_entry(queue_entry, exp_result=exp_result, status="Success")
for queue_entry, _ in self.iter_success() for queue_entry, exp_result in self.iter_success()
) )
return result return result
@@ -145,3 +145,83 @@ def test_queue_iter_done_task(test_queue, mocker, status):
elif status == "SUCCESS": elif status == "SUCCESS":
with pytest.raises(DvcException): with pytest.raises(DvcException):
assert list(test_queue.iter_success()) assert list(test_queue.iter_success())
def test_queue_status(test_queue, scm, mocker):
from datetime import datetime
active_entry = mocker.Mock(stash_rev="active")
active_entry.name = "foo"
queued_entry = mocker.Mock(stash_rev="queued")
queued_entry.name = None
failed_entry = mocker.Mock(stash_rev="failed")
failed_entry.name = "bar"
success_entry = mocker.Mock(stash_rev="success")
success_entry.name = None
success_result = mocker.Mock(ref_info=mocker.Mock())
success_result.ref_info.name = "foobar"
def resolve_commit(rev):
if rev == "active":
commit_time = datetime(2022, 8, 7).timestamp()
elif rev == "queued":
commit_time = datetime(2022, 8, 6).timestamp()
elif rev == "failed":
commit_time = datetime(2022, 8, 5).timestamp()
elif rev == "success":
commit_time = datetime(2022, 8, 4).timestamp()
return mocker.Mock(commit_time=commit_time)
mocker.patch.object(
scm,
"resolve_commit",
side_effect=mocker.MagicMock(side_effect=resolve_commit),
)
mocker.patch.object(
test_queue,
"iter_active",
return_value=[active_entry],
)
mocker.patch.object(
test_queue,
"iter_queued",
return_value=[queued_entry],
)
mocker.patch.object(
test_queue,
"iter_failed",
return_value=[(failed_entry, None)],
)
mocker.patch.object(
test_queue,
"iter_success",
return_value=[(success_entry, success_result)],
)
assert test_queue.status() == [
{
"name": "foo",
"rev": "active",
"status": "Running",
"timestamp": datetime(2022, 8, 7, 0, 0, 0),
},
{
"name": None,
"rev": "queued",
"status": "Queued",
"timestamp": datetime(2022, 8, 6, 0, 0, 0),
},
{
"name": "bar",
"rev": "failed",
"status": "Failed",
"timestamp": datetime(2022, 8, 5, 0, 0, 0),
},
{
"name": "foobar",
"rev": "success",
"status": "Success",
"timestamp": datetime(2022, 8, 4, 0, 0, 0),
},
]