Skip to content

Commit f82dabc

Browse files
feat: [AAP-46254] trigger project resync after project update (#1323)
This commit causes auto sync/import of a project when one of its url, scm_branch, or scm_refspec is updated, without the user having to manually trigger the sync via the UI/API. https://issues.redhat.com/browse/AAP-46254 Co-authored-by: Alex <[email protected]>
1 parent 72db4ce commit f82dabc

File tree

2 files changed

+75
-1
lines changed

2 files changed

+75
-1
lines changed

src/aap_eda/api/views/project.py

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,8 @@ def retrieve(self, request, pk):
199199
None,
200200
description="Update failed with integrity checking.",
201201
),
202-
},
202+
}
203+
| RedisDependencyMixin.redis_unavailable_response(),
203204
)
204205
def partial_update(self, request, pk):
205206
project = self.get_object()
@@ -234,6 +235,34 @@ def partial_update(self, request, pk):
234235
)
235236
)
236237

238+
if {"scm_branch", "scm_refspec", "url"}.intersection(
239+
update_fields
240+
) and (
241+
project.import_state
242+
not in [
243+
models.Project.ImportState.PENDING,
244+
models.Project.ImportState.RUNNING,
245+
]
246+
):
247+
# check if redis is available
248+
self.redis_is_available()
249+
250+
try:
251+
job_id = tasks.sync_project(project.id)
252+
except redis.ConnectionError:
253+
return RedisDependencyMixin.redis_unavailable_response()
254+
255+
project.import_state = models.Project.ImportState.PENDING
256+
if job_id:
257+
project.import_task_id = job_id
258+
259+
logger.info(
260+
f"Triggered import/sync task {job_id}"
261+
f" for project {project.id}"
262+
)
263+
264+
project.save()
265+
237266
return Response(serializers.ProjectSerializer(project).data)
238267

239268
@extend_schema(

tests/integration/api/test_project.py

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -839,12 +839,57 @@ def test_partial_update_project_url(
839839

840840
assert response.status_code == status.HTTP_200_OK
841841
assert response.json()["url"] == new_url
842+
assert response.json()["import_state"] == "pending"
842843

843844
new_project.refresh_from_db()
844845
assert new_project.url == new_url
845846
assert new_project.url != original_url
846847

847848

849+
@pytest.mark.django_db
850+
def test_partial_update_project_scm_branch(
851+
new_project: models.Project,
852+
admin_client: APIClient,
853+
):
854+
original_scm_branch = new_project.scm_branch
855+
new_scm_branch = "dev"
856+
857+
response = admin_client.patch(
858+
f"{api_url_v1}/projects/{new_project.id}/",
859+
data={"scm_branch": new_scm_branch},
860+
)
861+
862+
assert response.status_code == status.HTTP_200_OK
863+
assert response.json()["scm_branch"] == new_scm_branch
864+
assert response.json()["import_state"] == "pending"
865+
866+
new_project.refresh_from_db()
867+
assert new_project.scm_branch == new_scm_branch
868+
assert new_project.scm_branch != original_scm_branch
869+
870+
871+
@pytest.mark.django_db
872+
def test_partial_update_project_scm_refspec(
873+
new_project: models.Project,
874+
admin_client: APIClient,
875+
):
876+
original_scm_refspec = new_project.scm_refspec
877+
new_scm_refspec = "path/to/testref"
878+
879+
response = admin_client.patch(
880+
f"{api_url_v1}/projects/{new_project.id}/",
881+
data={"scm_refspec": new_scm_refspec},
882+
)
883+
884+
assert response.status_code == status.HTTP_200_OK
885+
assert response.json()["scm_refspec"] == new_scm_refspec
886+
assert response.json()["import_state"] == "pending"
887+
888+
new_project.refresh_from_db()
889+
assert new_project.scm_refspec == new_scm_refspec
890+
assert new_project.scm_refspec != original_scm_refspec
891+
892+
848893
@pytest.mark.django_db
849894
def test_delete_project(
850895
new_project: models.Project,

0 commit comments

Comments
 (0)