Add configuration to disable granting project ownership
Change-Id: I658c752a6786c08103195da3cadbbbeb186d6fa8
diff --git a/src/main/java/com/ericsson/gerrit/plugins/projectgroupstructure/ProjectCreationValidator.java b/src/main/java/com/ericsson/gerrit/plugins/projectgroupstructure/ProjectCreationValidator.java
index 1b38573..3a8f982 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/projectgroupstructure/ProjectCreationValidator.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/projectgroupstructure/ProjectCreationValidator.java
@@ -77,9 +77,12 @@
"Project name must start with parent project name, e.g. %s."
+ SEE_DOCUMENTATION_MSG;
- /* package */ static final String DELEGATE_PROJECT_CREATION_TO =
+ static final String DELEGATE_PROJECT_CREATION_TO =
"delegateProjectCreationTo";
+ static final String DISABLE_GRANTING_PROJECT_OWNERSHIP =
+ "disableGrantingProjectOwnership";
+
private final CreateGroup.Factory createGroupFactory;
private final String documentationUrl;
private final AllProjectsNameProvider allProjectsName;
@@ -122,11 +125,25 @@
// If we reached that point, it means we allow project creation. Make the
// user an owner if not already by inheritance.
- if (!parentCtrl.isOwner()) {
+ if (!parentCtrl.isOwner() && !configDisableGrantingOwnership(parentCtrl)) {
args.ownerIds.add(createGroup(name + "-admins"));
}
}
+ private boolean configDisableGrantingOwnership(ProjectControl parentCtrl)
+ throws ValidationException {
+ try {
+ return cfg
+ .getFromProjectConfigWithInheritance(
+ parentCtrl.getProject().getNameKey(), pluginName)
+ .getBoolean(DISABLE_GRANTING_PROJECT_OWNERSHIP, false);
+ } catch (NoSuchProjectException e) {
+ log.error("Failed to check project config for "
+ + parentCtrl.getProject().getName() + ": " + e.getMessage(), e);
+ throw new ValidationException(AN_ERROR_OCCURRED_MSG);
+ }
+ }
+
private AccountGroup.UUID createGroup(String name)
throws ValidationException {
try {
diff --git a/src/main/resources/Documentation/about.md b/src/main/resources/Documentation/about.md
index ee094c5..a967a52 100644
--- a/src/main/resources/Documentation/about.md
+++ b/src/main/resources/Documentation/about.md
@@ -80,3 +80,14 @@
```
- Click `Publish` button, review, vote and submit the change to apply new
configuration
+
+Ownership of a project created by delegated user is given automatically to that
+user by adding him to a group named `<root-project-name>-admins`. It is
+possible to disable granting the ownership by configuring
+`disableGrantingProjectOwnership` in the `project.config` of
+`refs/meta/config` branch of the parent project:
+
+```
+[plugin "@PLUGIN@"]
+disableGrantingProjectOwnership = true
+```
diff --git a/src/test/java/com/ericsson/gerrit/plugins/projectgroupstructure/ProjectCreationValidatorIT.java b/src/test/java/com/ericsson/gerrit/plugins/projectgroupstructure/ProjectCreationValidatorIT.java
index e76f94b..23f0bea 100644
--- a/src/test/java/com/ericsson/gerrit/plugins/projectgroupstructure/ProjectCreationValidatorIT.java
+++ b/src/test/java/com/ericsson/gerrit/plugins/projectgroupstructure/ProjectCreationValidatorIT.java
@@ -275,6 +275,37 @@
}
@Test
+ public void shouldNotMakeUserOwnerIfNotAlreadyOwnerByInheritanceAndGrantingIsDisabled()
+ throws Exception {
+ String parent = name("parentProject");
+ ProjectInput in = new ProjectInput();
+ in.permissionsOnly = true;
+ adminRestSession.put("/projects/" + parent, in).assertCreated();
+
+ String delegatingGroup = name("someGroup");
+ GroupApi dGroup = gApi.groups().create(delegatingGroup);
+ dGroup.addMembers(user.username);
+ Project.NameKey parentNameKey = new Project.NameKey(parent);
+ ProjectConfig cfg = projectCache.checkedGet(parentNameKey).getConfig();
+ String gId = gApi.groups().id(delegatingGroup).get().id;
+ cfg.getPluginConfig(PLUGIN_NAME).setGroupReference(
+ ProjectCreationValidator.DELEGATE_PROJECT_CREATION_TO,
+ new GroupReference(AccountGroup.UUID.parse(gId), delegatingGroup));
+ cfg.getPluginConfig(PLUGIN_NAME).setBoolean(
+ ProjectCreationValidator.DISABLE_GRANTING_PROJECT_OWNERSHIP, true);
+ saveProjectConfig(parentNameKey, cfg);
+
+ in = new ProjectInput();
+ in.parent = parent;
+ String childProject = parent + "/childProject";
+ userRestSession.put("/projects/" + Url.encode(childProject), in)
+ .assertCreated();
+ ProjectState projectState =
+ projectCache.get(new Project.NameKey(childProject));
+ assertThat(projectState.getOwners().size()).isEqualTo(0);
+ }
+
+ @Test
public void shouldBlockCreationIfGroupRefIsNotUsed() throws Exception {
String ownerGroup = name("groupA");
gApi.groups().create(ownerGroup);