mirror of
https://github.com/clearml/clearml-server
synced 2025-06-26 23:15:47 +00:00
Support querying by children_type in projects.get_all_ex
This commit is contained in:
@@ -36,27 +36,56 @@ class TestSubProjects(TestService):
|
||||
def test_query_children(self):
|
||||
test_root_name = "TestQueryChildren"
|
||||
test_root = self._temp_project(name=test_root_name)
|
||||
child_with_tag = self._temp_project(
|
||||
name=f"{test_root_name}/Project1/WithTag", system_tags=["test"]
|
||||
dataset_project = self._temp_project(
|
||||
name=f"{test_root_name}/Project1/Dataset", system_tags=["dataset"]
|
||||
)
|
||||
child_without_tag = self._temp_project(name=f"{test_root_name}/Project2/WithoutTag")
|
||||
|
||||
projects = self.api.projects.get_all_ex(parent=[test_root], shallow_search=True).projects
|
||||
self.assertEqual({p.basename for p in projects}, {"Project1", "Project2"})
|
||||
self._temp_task(
|
||||
name="dataset task",
|
||||
type="data_processing",
|
||||
system_tags=["dataset"],
|
||||
project=dataset_project,
|
||||
)
|
||||
self._temp_task(name="regular task", project=dataset_project)
|
||||
pipeline_project = self._temp_project(
|
||||
name=f"{test_root_name}/Project2/Pipeline", system_tags=["pipeline"]
|
||||
)
|
||||
self._temp_task(
|
||||
name="pipeline task",
|
||||
type="controller",
|
||||
system_tags=["pipeline"],
|
||||
project=pipeline_project,
|
||||
)
|
||||
self._temp_task(name="regular task", project=pipeline_project)
|
||||
report_project = self._temp_project(name=f"{test_root_name}/Project3")
|
||||
self._temp_report(name="test report", project=report_project)
|
||||
self._temp_task(name="regular task", project=report_project)
|
||||
|
||||
projects = self.api.projects.get_all_ex(
|
||||
parent=[test_root], children_condition={"system_tags": ["test"]}, shallow_search=True
|
||||
parent=[test_root], shallow_search=True, include_stats=True
|
||||
).projects
|
||||
self.assertEqual({p.basename for p in projects}, {"Project1"})
|
||||
projects = self.api.projects.get_all_ex(
|
||||
parent=[projects[0].id], children_condition={"system_tags": ["test"]}, shallow_search=True
|
||||
).projects
|
||||
self.assertEqual(projects[0].id, child_with_tag)
|
||||
self.assertEqual(
|
||||
{p.basename for p in projects}, {f"Project{idx+1}" for idx in range(3)}
|
||||
)
|
||||
for p in projects:
|
||||
self.assertEqual(
|
||||
p.stats.active.total_tasks,
|
||||
2
|
||||
if p.basename in ("Project1", "Project2")
|
||||
else 1
|
||||
)
|
||||
|
||||
projects = self.api.projects.get_all_ex(
|
||||
parent=[test_root], children_condition={"system_tags": ["not existent"]}, shallow_search=True
|
||||
).projects
|
||||
self.assertEqual(len(projects), 0)
|
||||
for i, type_ in enumerate(("dataset", "pipeline", "report")):
|
||||
projects = self.api.projects.get_all_ex(
|
||||
parent=[test_root],
|
||||
children_type=type_,
|
||||
shallow_search=True,
|
||||
include_stats=True,
|
||||
).projects
|
||||
self.assertEqual({p.basename for p in projects}, {f"Project{i+1}"})
|
||||
p = projects[0]
|
||||
self.assertEqual(
|
||||
p.stats.active.total_tasks, 1
|
||||
)
|
||||
|
||||
def test_project_aggregations(self):
|
||||
"""This test requires user with user_auth_only... credentials in db"""
|
||||
@@ -323,12 +352,21 @@ class TestSubProjects(TestService):
|
||||
**kwargs,
|
||||
)
|
||||
|
||||
def _temp_task(self, client=None, **kwargs):
|
||||
def _temp_report(self, name, **kwargs):
|
||||
return self.create_temp(
|
||||
"reports",
|
||||
name=name,
|
||||
object_name="task",
|
||||
delete_params=self.delete_params,
|
||||
**kwargs,
|
||||
)
|
||||
|
||||
def _temp_task(self, client=None, name=None, type=None, **kwargs):
|
||||
return self.create_temp(
|
||||
"tasks",
|
||||
delete_params=self.delete_params,
|
||||
type="testing",
|
||||
name=db_id(),
|
||||
type=type or "testing",
|
||||
name=name or db_id(),
|
||||
input=dict(view=dict()),
|
||||
client=client,
|
||||
**kwargs,
|
||||
|
||||
@@ -50,7 +50,9 @@ class TestTasksResetDelete(TestService):
|
||||
self.assertEqual(res.urls.artifact_urls, [])
|
||||
|
||||
task = self.new_task()
|
||||
(_, published_model_urls), (model, draft_model_urls) = self.create_task_models(task)
|
||||
(_, published_model_urls), (model, draft_model_urls) = self.create_task_models(
|
||||
task
|
||||
)
|
||||
artifact_urls = self.send_artifacts(task)
|
||||
event_urls = self.send_debug_image_events(task)
|
||||
event_urls.update(self.send_plot_events(task))
|
||||
@@ -74,7 +76,12 @@ class TestTasksResetDelete(TestService):
|
||||
self.api.tasks.reset(task=task, force=True)
|
||||
|
||||
# test urls
|
||||
task, (published_model_urls, draft_model_urls), artifact_urls, event_urls = self.create_task_with_data()
|
||||
(
|
||||
task,
|
||||
(published_model_urls, draft_model_urls),
|
||||
artifact_urls,
|
||||
event_urls,
|
||||
) = self.create_task_with_data()
|
||||
res = self.api.tasks.reset(task=task, force=True, return_file_urls=True)
|
||||
self.assertEqual(set(res.urls.model_urls), draft_model_urls)
|
||||
self.assertEqual(set(res.urls.event_urls), event_urls)
|
||||
@@ -101,13 +108,18 @@ class TestTasksResetDelete(TestService):
|
||||
|
||||
# with delete_contents flag
|
||||
project = self.new_project()
|
||||
task, (published_model_urls, draft_model_urls), artifact_urls, event_urls = self.create_task_with_data(
|
||||
project=project
|
||||
)
|
||||
(
|
||||
task,
|
||||
(published_model_urls, draft_model_urls),
|
||||
artifact_urls,
|
||||
event_urls,
|
||||
) = self.create_task_with_data(project=project)
|
||||
res = self.api.projects.delete(
|
||||
project=project, force=True, delete_contents=True
|
||||
)
|
||||
self.assertEqual(set(res.urls.model_urls), published_model_urls | draft_model_urls)
|
||||
self.assertEqual(
|
||||
set(res.urls.model_urls), published_model_urls | draft_model_urls
|
||||
)
|
||||
self.assertEqual(res.deleted, 1)
|
||||
self.assertEqual(res.disassociated_tasks, 0)
|
||||
self.assertEqual(res.deleted_tasks, 1)
|
||||
@@ -121,7 +133,9 @@ class TestTasksResetDelete(TestService):
|
||||
self, **kwargs
|
||||
) -> Tuple[str, Tuple[Set[str], Set[str]], Set[str], Set[str]]:
|
||||
task = self.new_task(**kwargs)
|
||||
(_, published_model_urls), (model, draft_model_urls) = self.create_task_models(task, **kwargs)
|
||||
(_, published_model_urls), (model, draft_model_urls) = self.create_task_models(
|
||||
task, **kwargs
|
||||
)
|
||||
artifact_urls = self.send_artifacts(task)
|
||||
event_urls = self.send_debug_image_events(task)
|
||||
event_urls.update(self.send_plot_events(task))
|
||||
@@ -172,7 +186,7 @@ class TestTasksResetDelete(TestService):
|
||||
),
|
||||
self.create_event(
|
||||
model, "plot", 0, plot_str=f'{{"source": "{url2}"}}', model_event=True
|
||||
)
|
||||
),
|
||||
]
|
||||
self.send_batch(events)
|
||||
return {url1, url2}
|
||||
@@ -181,7 +195,10 @@ class TestTasksResetDelete(TestService):
|
||||
url_pattern = "url_{num}.txt"
|
||||
events = [
|
||||
self.create_event(
|
||||
task, "training_debug_image", iteration, url=url_pattern.format(num=iteration)
|
||||
task,
|
||||
"training_debug_image",
|
||||
iteration,
|
||||
url=url_pattern.format(num=iteration),
|
||||
)
|
||||
for iteration in range(5)
|
||||
]
|
||||
|
||||
Reference in New Issue
Block a user