Browse Source

SONAR-9551 Use view templates for applications

tags/6.6-RC1
Julien Lancelot 7 years ago
parent
commit
3aa22c853b

+ 9
- 0
server/sonar-db-dao/src/test/java/org/sonar/db/component/ComponentDbTester.java View File

@@ -29,6 +29,7 @@ import org.sonar.db.organization.OrganizationDto;

import static com.google.common.base.Preconditions.checkState;
import static java.util.Arrays.asList;
import static org.sonar.db.component.ComponentTesting.newApplication;
import static org.sonar.db.component.ComponentTesting.newPrivateProjectDto;
import static org.sonar.db.component.ComponentTesting.newPublicProjectDto;
import static org.sonar.db.component.ComponentTesting.newView;
@@ -133,6 +134,14 @@ public class ComponentDbTester {
return insertComponentImpl(newView(organizationDto, uuid), false, noExtraConfiguration());
}

public ComponentDto insertApplication(OrganizationDto organizationDto) {
return insertComponentImpl(newApplication(organizationDto), false, noExtraConfiguration());
}

public ComponentDto insertApplication(OrganizationDto organizationDto, Consumer<ComponentDto> dtoPopulator) {
return insertComponentImpl(newApplication(organizationDto), false, dtoPopulator);
}

private static <T> Consumer<T> noExtraConfiguration() {
return (t) -> {
};

+ 5
- 0
server/sonar-db-dao/src/test/java/org/sonar/db/component/ComponentTesting.java View File

@@ -153,6 +153,11 @@ public class ComponentTesting {
.setQualifier(Qualifiers.VIEW);
}

public static ComponentDto newApplication(OrganizationDto organizationDto) {
return newView(organizationDto.getUuid(), Uuids.createFast())
.setQualifier(Qualifiers.APP);
}

public static ComponentDto newProjectCopy(String uuid, ComponentDto project, ComponentDto view) {
checkNotNull(project.getId(), "The project need to be persisted before creating this technical project.");
return newChildComponent(uuid, view, view)

+ 10
- 8
server/sonar-server/src/main/java/org/sonar/server/permission/PermissionTemplateService.java View File

@@ -205,14 +205,16 @@ public class PermissionTemplateService {

String qualifier = component.qualifier();
DefaultTemplatesResolverImpl.ResolvedDefaultTemplates resolvedDefaultTemplates = defaultTemplatesResolver.resolve(defaultTemplates);
if (Qualifiers.PROJECT.equals(qualifier)) {
return dbClient.permissionTemplateDao().selectByUuid(dbSession, resolvedDefaultTemplates.getProject());
} else if (Qualifiers.VIEW.equals(qualifier)) {
String viewDefaultTemplateUuid = resolvedDefaultTemplates.getView().orElseThrow(
() -> new IllegalStateException("Attempt to create a view when Governance plugin is not installed"));
return dbClient.permissionTemplateDao().selectByUuid(dbSession, viewDefaultTemplateUuid);
} else {
throw new IllegalArgumentException(format("Qualifier '%s' is not supported", qualifier));
switch (qualifier) {
case Qualifiers.PROJECT:
return dbClient.permissionTemplateDao().selectByUuid(dbSession, resolvedDefaultTemplates.getProject());
case Qualifiers.VIEW:
case Qualifiers.APP:
String viewDefaultTemplateUuid = resolvedDefaultTemplates.getView().orElseThrow(
() -> new IllegalStateException("Attempt to create a view when Governance plugin is not installed"));
return dbClient.permissionTemplateDao().selectByUuid(dbSession, viewDefaultTemplateUuid);
default:
throw new IllegalArgumentException(format("Qualifier '%s' is not supported", qualifier));
}
}


+ 42
- 24
server/sonar-server/src/test/java/org/sonar/server/component/ComponentUpdaterTest.java View File

@@ -42,6 +42,7 @@ import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.sonar.api.resources.Qualifiers.APP;
import static org.sonar.api.resources.Qualifiers.VIEW;

public class ComponentUpdaterTest {
@@ -67,7 +68,7 @@ public class ComponentUpdaterTest {
projectIndexers);

@Test
public void should_persist_and_index_when_creating_project() throws Exception {
public void persist_and_index_when_creating_project() throws Exception {
NewComponent project = NewComponent.newComponentBuilder()
.setKey(DEFAULT_PROJECT_KEY)
.setName(DEFAULT_PROJECT_NAME)
@@ -96,7 +97,7 @@ public class ComponentUpdaterTest {
}

@Test
public void should_persist_private_flag_true_when_creating_project() throws Exception {
public void persist_private_flag_true_when_creating_project() throws Exception {
OrganizationDto organization = db.organizations().insert();
NewComponent project = NewComponent.newComponentBuilder()
.setKey(DEFAULT_PROJECT_KEY)
@@ -110,7 +111,7 @@ public class ComponentUpdaterTest {
}

@Test
public void should_persist_private_flag_false_when_creating_project() throws Exception {
public void persist_private_flag_false_when_creating_project() throws Exception {
OrganizationDto organization = db.organizations().insert();
NewComponent project = NewComponent.newComponentBuilder()
.setKey(DEFAULT_PROJECT_KEY)
@@ -138,7 +139,43 @@ public class ComponentUpdaterTest {
}

@Test
public void should_apply_default_permission_template() throws Exception {
public void persist_and_index_when_creating_view() {
NewComponent view = NewComponent.newComponentBuilder()
.setKey("view-key")
.setName("view-name")
.setQualifier(VIEW)
.setOrganizationUuid(db.getDefaultOrganization().getUuid())
.build();

ComponentDto returned = underTest.create(db.getSession(), view, null);

ComponentDto loaded = db.getDbClient().componentDao().selectOrFailByUuid(db.getSession(), returned.uuid());
assertThat(loaded.getKey()).isEqualTo("view-key");
assertThat(loaded.name()).isEqualTo("view-name");
assertThat(loaded.qualifier()).isEqualTo("VW");
verify(projectIndexers).hasBeenCalled(loaded.uuid(), ProjectIndexer.Cause.PROJECT_CREATION);
}

@Test
public void create_application() {
NewComponent view = NewComponent.newComponentBuilder()
.setKey("app-key")
.setName("app-name")
.setQualifier(APP)
.setOrganizationUuid(db.getDefaultOrganization().getUuid())
.build();

ComponentDto returned = underTest.create(db.getSession(), view, null);

ComponentDto loaded = db.getDbClient().componentDao().selectByKey(db.getSession(), returned.key()).get();
assertThat(loaded.getKey()).isEqualTo("app-key");
assertThat(loaded.name()).isEqualTo("app-name");
assertThat(loaded.qualifier()).isEqualTo("APP");
verify(projectIndexers).hasBeenCalled(loaded.uuid(), ProjectIndexer.Cause.PROJECT_CREATION);
}

@Test
public void apply_default_permission_template() throws Exception {
int userId = 42;
NewComponent project = NewComponent.newComponentBuilder()
.setKey(DEFAULT_PROJECT_KEY)
@@ -151,7 +188,7 @@ public class ComponentUpdaterTest {
}

@Test
public void should_add_project_to_user_favorites_if_project_creator_is_defined_in_permission_template() throws Exception {
public void add_project_to_user_favorites_if_project_creator_is_defined_in_permission_template() throws Exception {
UserDto userDto = db.users().insertUser();
NewComponent project = NewComponent.newComponentBuilder()
.setKey(DEFAULT_PROJECT_KEY)
@@ -268,23 +305,4 @@ public class ComponentUpdaterTest {
.build(),
null);
}

@Test
public void persist_and_index_when_creating_view() {
NewComponent view = NewComponent.newComponentBuilder()
.setKey("view-key")
.setName("view-name")
.setQualifier(VIEW)
.setOrganizationUuid(db.getDefaultOrganization().getUuid())
.build();

ComponentDto returned = underTest.create(db.getSession(), view, null);

ComponentDto loaded = db.getDbClient().componentDao().selectOrFailByUuid(db.getSession(), returned.uuid());
assertThat(loaded.getKey()).isEqualTo("view-key");
assertThat(loaded.name()).isEqualTo("view-name");
assertThat(loaded.qualifier()).isEqualTo("VW");
assertThat(projectIndexers.hasBeenCalled(loaded.uuid(), ProjectIndexer.Cause.PROJECT_CREATION)).isTrue();
}

}

+ 98
- 2
server/sonar-server/src/test/java/org/sonar/server/permission/PermissionTemplateServiceTest.java View File

@@ -45,6 +45,8 @@ import org.sonar.server.tester.UserSessionRule;
import static java.util.Collections.singletonList;
import static org.assertj.core.api.Assertions.assertThat;
import static org.sonar.core.permission.GlobalPermissions.SCAN_EXECUTION;
import static org.sonar.db.permission.OrganizationPermission.ADMINISTER;
import static org.sonar.db.permission.OrganizationPermission.PROVISION_PROJECTS;

public class PermissionTemplateServiceTest {

@@ -258,14 +260,14 @@ public class PermissionTemplateServiceTest {
ComponentDto publicProject = dbTester.components().insertPublicProject(organization);
UserDto user = dbTester.users().insertUser();
ProjectPermissions.ALL
.forEach(perm -> dbTester.permissionTemplates().addProjectCreatorToTemplate(permissionTemplate, perm));
.forEach(perm -> dbTester.permissionTemplates().addProjectCreatorToTemplate(permissionTemplate, perm));
dbTester.permissionTemplates().addProjectCreatorToTemplate(permissionTemplate, "p1");
dbTester.organizations().setDefaultTemplates(organization, permissionTemplate.getUuid(), null);

underTest.applyDefault(session, organization.getUuid(), publicProject, user.getId());

assertThat(selectProjectPermissionsOfUser(user, publicProject))
.containsOnly("p1", UserRole.ADMIN, UserRole.ISSUE_ADMIN, GlobalPermissions.SCAN_EXECUTION);
.containsOnly("p1", UserRole.ADMIN, UserRole.ISSUE_ADMIN, GlobalPermissions.SCAN_EXECUTION);
}

@Test
@@ -285,6 +287,100 @@ public class PermissionTemplateServiceTest {
.containsOnly("p1", UserRole.USER, UserRole.CODEVIEWER, UserRole.ADMIN, UserRole.ISSUE_ADMIN, GlobalPermissions.SCAN_EXECUTION);
}

@Test
public void apply_template_on_view() {
OrganizationDto organization = dbTester.organizations().insert();
ComponentDto view = dbTester.components().insertView(organization);
PermissionTemplateDto permissionTemplate = dbTester.permissionTemplates().insertTemplate(organization);
GroupDto group = dbTester.users().insertGroup(organization);
dbTester.permissionTemplates().addGroupToTemplate(permissionTemplate, group, ADMINISTER.getKey());
dbTester.permissionTemplates().addGroupToTemplate(permissionTemplate, group, PROVISION_PROJECTS.getKey());
dbTester.organizations().setDefaultTemplates(organization, permissionTemplate.getUuid(), null);

underTest.applyDefault(session, organization.getUuid(), view, null);

assertThat(selectProjectPermissionsOfGroup(organization, group, view))
.containsOnly(ADMINISTER.getKey(), PROVISION_PROJECTS.getKey());
}

@Test
public void apply_default_template_on_view() {
OrganizationDto organization = dbTester.organizations().insert();
ComponentDto view = dbTester.components().insertView(organization);
PermissionTemplateDto projectPermissionTemplate = dbTester.permissionTemplates().insertTemplate(organization);
PermissionTemplateDto viewPermissionTemplate = dbTester.permissionTemplates().insertTemplate(organization);
GroupDto group = dbTester.users().insertGroup(organization);
dbTester.permissionTemplates().addGroupToTemplate(viewPermissionTemplate, group, ADMINISTER.getKey());
dbTester.permissionTemplates().addGroupToTemplate(viewPermissionTemplate, group, PROVISION_PROJECTS.getKey());
dbTester.organizations().setDefaultTemplates(organization, projectPermissionTemplate.getUuid(), viewPermissionTemplate.getUuid());

underTest.applyDefault(session, organization.getUuid(), view, null);

assertThat(selectProjectPermissionsOfGroup(organization, group, view))
.containsOnly(ADMINISTER.getKey(), PROVISION_PROJECTS.getKey());
}

@Test
public void apply_project_default_template_on_view_when_no_view_default_template() {
OrganizationDto organization = dbTester.organizations().insert();
ComponentDto view = dbTester.components().insertView(organization);
PermissionTemplateDto projectPermissionTemplate = dbTester.permissionTemplates().insertTemplate(organization);
GroupDto group = dbTester.users().insertGroup(organization);
dbTester.permissionTemplates().addGroupToTemplate(projectPermissionTemplate, group, PROVISION_PROJECTS.getKey());
dbTester.organizations().setDefaultTemplates(organization, projectPermissionTemplate.getUuid(), null);

underTest.applyDefault(session, organization.getUuid(), view, null);

assertThat(selectProjectPermissionsOfGroup(organization, group, view)).containsOnly(PROVISION_PROJECTS.getKey());
}

@Test
public void apply_template_on_applications() {
OrganizationDto organization = dbTester.organizations().insert();
ComponentDto application = dbTester.components().insertApplication(organization);
PermissionTemplateDto permissionTemplate = dbTester.permissionTemplates().insertTemplate(organization);
GroupDto group = dbTester.users().insertGroup(organization);
dbTester.permissionTemplates().addGroupToTemplate(permissionTemplate, group, ADMINISTER.getKey());
dbTester.permissionTemplates().addGroupToTemplate(permissionTemplate, group, PROVISION_PROJECTS.getKey());
dbTester.organizations().setDefaultTemplates(organization, permissionTemplate.getUuid(), null);

underTest.applyDefault(session, organization.getUuid(), application, null);

assertThat(selectProjectPermissionsOfGroup(organization, group, application))
.containsOnly(ADMINISTER.getKey(), PROVISION_PROJECTS.getKey());
}

@Test
public void apply_default_view_template_on_application() {
OrganizationDto organization = dbTester.organizations().insert();
ComponentDto application = dbTester.components().insertApplication(organization);
PermissionTemplateDto projectPermissionTemplate = dbTester.permissionTemplates().insertTemplate(organization);
PermissionTemplateDto viewPermissionTemplate = dbTester.permissionTemplates().insertTemplate(organization);
GroupDto group = dbTester.users().insertGroup(organization);
dbTester.permissionTemplates().addGroupToTemplate(viewPermissionTemplate, group, ADMINISTER.getKey());
dbTester.permissionTemplates().addGroupToTemplate(viewPermissionTemplate, group, PROVISION_PROJECTS.getKey());
dbTester.organizations().setDefaultTemplates(organization, projectPermissionTemplate.getUuid(), viewPermissionTemplate.getUuid());

underTest.applyDefault(session, organization.getUuid(), application, null);

assertThat(selectProjectPermissionsOfGroup(organization, group, application))
.containsOnly(ADMINISTER.getKey(), PROVISION_PROJECTS.getKey());
}

@Test
public void apply_project_default_template_on_application_when_no_application_default_template() {
OrganizationDto organization = dbTester.organizations().insert();
ComponentDto application = dbTester.components().insertApplication(organization);
PermissionTemplateDto projectPermissionTemplate = dbTester.permissionTemplates().insertTemplate(organization);
GroupDto group = dbTester.users().insertGroup(organization);
dbTester.permissionTemplates().addGroupToTemplate(projectPermissionTemplate, group, PROVISION_PROJECTS.getKey());
dbTester.organizations().setDefaultTemplates(organization, projectPermissionTemplate.getUuid(), null);

underTest.applyDefault(session, organization.getUuid(), application, null);

assertThat(selectProjectPermissionsOfGroup(organization, group, application)).containsOnly(PROVISION_PROJECTS.getKey());
}

@Test
public void apply_permission_template() {
OrganizationDto organization = dbTester.organizations().insert();

+ 16
- 9
server/sonar-server/src/test/java/org/sonar/server/permission/ws/template/DefaultTemplatesResolverRule.java View File

@@ -20,24 +20,31 @@
package org.sonar.server.permission.ws.template;

import org.junit.rules.ExternalResource;
import org.sonar.api.resources.Qualifiers;
import org.sonar.api.resources.ResourceType;
import org.sonar.api.resources.ResourceTypeTree;
import org.sonar.api.resources.ResourceTypes;
import org.sonar.db.organization.DefaultTemplates;

import static org.sonar.api.resources.Qualifiers.APP;
import static org.sonar.api.resources.Qualifiers.PROJECT;
import static org.sonar.api.resources.Qualifiers.VIEW;

public class DefaultTemplatesResolverRule extends ExternalResource implements DefaultTemplatesResolver {
private static final DefaultTemplatesResolver WITH_VIEWS = new DefaultTemplatesResolverImpl(
private static final DefaultTemplatesResolver WITH_GOV = new DefaultTemplatesResolverImpl(
new ResourceTypes(new ResourceTypeTree[] {
ResourceTypeTree.builder()
.addType(ResourceType.builder(Qualifiers.PROJECT).build())
.addType(ResourceType.builder(PROJECT).build())
.build(),
ResourceTypeTree.builder()
.addType(ResourceType.builder(VIEW).build())
.build(),
ResourceTypeTree.builder()
.addType(ResourceType.builder(Qualifiers.VIEW).build())
.build()}));
private static final DefaultTemplatesResolver WITHOUT_VIEWS = new DefaultTemplatesResolverImpl(
.addType(ResourceType.builder(APP).build())
.build()
}));
private static final DefaultTemplatesResolver WITHOUT_GOV = new DefaultTemplatesResolverImpl(
new ResourceTypes(new ResourceTypeTree[] {ResourceTypeTree.builder()
.addType(ResourceType.builder(Qualifiers.PROJECT).build())
.addType(ResourceType.builder(PROJECT).build())
.build()}));

private final boolean governanceInitiallyInstalled;
@@ -72,8 +79,8 @@ public class DefaultTemplatesResolverRule extends ExternalResource implements De
@Override
public DefaultTemplatesResolverImpl.ResolvedDefaultTemplates resolve(DefaultTemplates defaultTemplates) {
if (governanceInstalled) {
return WITH_VIEWS.resolve(defaultTemplates);
return WITH_GOV.resolve(defaultTemplates);
}
return WITHOUT_VIEWS.resolve(defaultTemplates);
return WITHOUT_GOV.resolve(defaultTemplates);
}
}

Loading…
Cancel
Save