From d2c13f36b7129e52dbad245ccde07fe0459e0a4a Mon Sep 17 00:00:00 2001 From: Tom Stellard Date: Sep 11 2021 16:28:30 +0000 Subject: Add API entrypoint for regenerating repos --- diff --git a/frontend/coprs_frontend/coprs/views/apiv3_ns/apiv3_projects.py b/frontend/coprs_frontend/coprs/views/apiv3_ns/apiv3_projects.py index c5a657a..c3565ea 100644 --- a/frontend/coprs_frontend/coprs/views/apiv3_ns/apiv3_projects.py +++ b/frontend/coprs_frontend/coprs/views/apiv3_ns/apiv3_projects.py @@ -2,15 +2,17 @@ import flask from coprs.views.apiv3_ns import (query_params, get_copr, pagination, Paginator, GET, POST, PUT, DELETE, set_defaults) from coprs.views.apiv3_ns.json2form import get_form_compatible_data, get_input_dict -from coprs import db, models, forms +from coprs import db, models, forms, db_session_scope from coprs.views.misc import api_login_required from coprs.views.apiv3_ns import apiv3_ns +from coprs.logic.actions_logic import ActionsLogic from coprs.logic.coprs_logic import CoprsLogic, CoprChrootsLogic, MockChrootsLogic from coprs.logic.complex_logic import ComplexLogic from coprs.logic.users_logic import UsersLogic from coprs.exceptions import (DuplicateException, NonAdminCannotCreatePersistentProject, NonAdminCannotDisableAutoPrunning, ActionInProgressException, InsufficientRightsException, BadRequest, ObjectNotFound) +from . import editable_copr def to_dict(copr): @@ -265,3 +267,15 @@ def delete_project(ownername, projectname): else: raise BadRequest(form.errors) return flask.jsonify(copr_dict) + +@apiv3_ns.route("/project/regenerate-repos//", methods=PUT) +@api_login_required +@editable_copr +def regenerate_repos(copr): + """ + This function will regenerate all repository metadata for a project. + """ + with db_session_scope(): + ActionsLogic.send_createrepo(copr) + + return flask.jsonify(to_dict(copr)) diff --git a/frontend/coprs_frontend/tests/test_apiv3/test_projects.py b/frontend/coprs_frontend/tests/test_apiv3/test_projects.py index 970f230..d9debaa 100644 --- a/frontend/coprs_frontend/tests/test_apiv3/test_projects.py +++ b/frontend/coprs_frontend/tests/test_apiv3/test_projects.py @@ -188,6 +188,17 @@ class TestApiv3Projects(CoprsTestCase): assert copr.fedora_review assert copr.delete_after_days == 5 + @TransactionDecorator("u1") + @pytest.mark.usefixtures("f_users", "f_coprs", "f_users_api", "f_mock_chroots", "f_db") + def test_regenerate_repos(self): + """ + Make sure that the regenerate-repos api works. + """ + self.db.session.add(self.c1) + route = "/api_3/project/regenerate-repos/{}".format(self.c1.full_name) + r = self.api3.post(route, {}) + assert r.status_code == 200 + class TestApiV3Permissions(CoprsTestCase): diff --git a/python/copr/v3/proxies/project.py b/python/copr/v3/proxies/project.py index a27719b..7bec23d 100644 --- a/python/copr/v3/proxies/project.py +++ b/python/copr/v3/proxies/project.py @@ -350,3 +350,26 @@ class ProjectProxy(BaseProxy): data=permissions) request.send() + + def regenerate_repos(self, ownername, projectname): + """ + Regenerate repositories for a project + + :param str ownername: owner of the project to regenerate + :param str projectname: name of the project to regenerate + """ + endpoint = "/projects/regenerate-repo/{ownername}/{projectname}" + params = { + "ownername": ownername, + "projectname": projectname + } + request = Request( + endpoint, + api_base_url=self.api_base_url, + auth=self.auth, + method=PUT, + params=params) + + request.send() + response = request.send() + return munchify(response)