From c9aa3855823e472fa10dca28425c6eecc51afd3d Mon Sep 17 00:00:00 2001 From: Jakub Kadlcik Date: Thu, 5 Sep 2024 11:10:15 +0200 Subject: [PATCH] frontend, python, cli: allow admins to set storage for new projects See #2533 This will be useful for beaker tests where we can now add basic tests for every supported storage. --- cli/copr_cli/main.py | 8 ++++++++ frontend/coprs_frontend/coprs/forms.py | 6 ++++++ frontend/coprs_frontend/coprs/logic/coprs_logic.py | 8 ++++++-- .../coprs_frontend/coprs/views/apiv3_ns/apiv3_projects.py | 1 + python/copr/v3/proxies/project.py | 4 +++- 5 files changed, 24 insertions(+), 3 deletions(-) diff --git a/cli/copr_cli/main.py b/cli/copr_cli/main.py index 605cf5cc8..6c80997ac 100644 --- a/cli/copr_cli/main.py +++ b/cli/copr_cli/main.py @@ -485,6 +485,7 @@ def action_create(self, args): runtime_dependencies=args.runtime_dependencies, packit_forge_projects_allowed=args.packit_forge_projects_allowed, repo_priority=args.repo_priority, + storage=args.storage, ) owner_part = username.replace('@', "g/") @@ -1192,6 +1193,13 @@ def setup_parser(): help=("Use the priority= config option for repositories in this " "project, see man dnf.conf(5) for more info.")) + parser_create.add_argument( + "--storage", + choices=["backend", "pulp"], + help=("What storage should be set for new projects. " + "This option can only be specified by a COPR admin.") + ) + create_and_modify_common_opts(parser_create) parser_create.set_defaults(func="action_create") diff --git a/frontend/coprs_frontend/coprs/forms.py b/frontend/coprs_frontend/coprs/forms.py index cb5b457a3..61a44a3d5 100644 --- a/frontend/coprs_frontend/coprs/forms.py +++ b/frontend/coprs_frontend/coprs/forms.py @@ -676,6 +676,12 @@ class CoprForm(BaseForm): default=None, ) + storage = wtforms.SelectField( + "Admin only - what storage should be set for new projects", + choices=[(x, x) for x in ["backend", "pulp"]], + validators=[wtforms.validators.Optional()], + ) + @property def errors(self): """ diff --git a/frontend/coprs_frontend/coprs/logic/coprs_logic.py b/frontend/coprs_frontend/coprs/logic/coprs_logic.py index 2922297ea..ed804f92b 100644 --- a/frontend/coprs_frontend/coprs/logic/coprs_logic.py +++ b/frontend/coprs_frontend/coprs/logic/coprs_logic.py @@ -287,7 +287,7 @@ def get_multiple_fulltext(cls, fulltext=None, projectname=None, def add(cls, user, name, selected_chroots, repos=None, description=None, instructions=None, check_for_duplicates=False, group=None, persistent=False, auto_prune=True, bootstrap=None, follow_fedora_branching=False, isolation=None, - appstream=False, **kwargs): + appstream=False, storage=None, **kwargs): if not flask.g.user.admin and flask.g.user != user: msg = ("You were authorized as '{0}' user without permissions to access " @@ -300,6 +300,10 @@ def add(cls, user, name, selected_chroots, repos=None, description=None, if not flask.g.user.admin and not auto_prune: raise exceptions.NonAdminCannotDisableAutoPrunning() + if not flask.g.user.admin and storage: + raise exceptions.AccessRestricted("Non-admin cannot set storage") + storage = StorageEnum(storage or app.config["DEFAULT_STORAGE"]) + # form validation checks for duplicates cls.new(user, name, group, check_for_duplicates=check_for_duplicates) @@ -315,7 +319,7 @@ def add(cls, user, name, selected_chroots, repos=None, description=None, isolation=isolation, follow_fedora_branching=follow_fedora_branching, appstream=appstream, - storage=StorageEnum(app.config["DEFAULT_STORAGE"]), + storage=storage, **kwargs) 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 681016197..2084d0b1c 100644 --- a/frontend/coprs_frontend/coprs/views/apiv3_ns/apiv3_projects.py +++ b/frontend/coprs_frontend/coprs/views/apiv3_ns/apiv3_projects.py @@ -262,6 +262,7 @@ def _form_field_repos(form_field): form.packit_forge_projects_allowed ), repo_priority=form.repo_priority.data, + storage=form.storage.data, ) db.session.commit() except ( diff --git a/python/copr/v3/proxies/project.py b/python/copr/v3/proxies/project.py index ece6d13cc..8b08b1dad 100644 --- a/python/copr/v3/proxies/project.py +++ b/python/copr/v3/proxies/project.py @@ -72,7 +72,7 @@ def add(self, ownername, projectname, chroots, description=None, instructions=No delete_after_days=None, multilib=False, module_hotfixes=False, bootstrap=None, bootstrap_image=None, isolation=None, follow_fedora_branching=True, fedora_review=None, appstream=False, runtime_dependencies=None, packit_forge_projects_allowed=None, - repo_priority=None, exist_ok=False): + repo_priority=None, exist_ok=False, storage=None): """ Create a project @@ -110,6 +110,7 @@ def add(self, ownername, projectname, chroots, description=None, instructions=No enabled together with this project repository. :param list packit_forge_projects_allowed: List of forge projects that will be allowed to build in the project via Packit + :param str storage: What storage should be set for new projects :return: Munch """ endpoint = "/project/add/{ownername}" @@ -142,6 +143,7 @@ def add(self, ownername, projectname, chroots, description=None, instructions=No "runtime_dependencies": runtime_dependencies, "packit_forge_projects_allowed": packit_forge_projects_allowed, "repo_priority": repo_priority, + "storage": storage, } _compat_use_bootstrap_container(data, use_bootstrap_container)