Selaa lähdekoodia

SONAR-20853 Set visibility from GitHub when creating a project via scanner.

tags/10.3.0.82913
Wojtek Wajerowicz 7 kuukautta sitten
vanhempi
commit
81f41930fc

+ 7
- 0
server/sonar-server-common/src/main/java/org/sonar/server/management/DelegatingManagedServices.java Näytä tiedosto

@@ -130,6 +130,13 @@ public class DelegatingManagedServices implements ManagedInstanceService, Manage
.ifPresent(managedProjectService -> managedProjectService.queuePermissionSyncTask(submitterUuid, componentUuid, projectUuid));
}

@Override
public boolean isProjectVisibilitySynchronizationActivated() {
return findManagedProjectService()
.map(ManagedProjectService::isProjectVisibilitySynchronizationActivated)
.orElse(false);
}

private Optional<ManagedProjectService> findManagedProjectService() {
return findManagedInstanceService()
.filter(ManagedProjectService.class::isInstance)

+ 2
- 0
server/sonar-server-common/src/main/java/org/sonar/server/management/ManagedProjectService.java Näytä tiedosto

@@ -30,4 +30,6 @@ public interface ManagedProjectService {
boolean isProjectManaged(DbSession dbSession, String projectUuid);

void queuePermissionSyncTask(String submitterUuid, String componentUuid, String projectUuid);

boolean isProjectVisibilitySynchronizationActivated();
}

+ 22
- 0
server/sonar-server-common/src/test/java/org/sonar/server/management/DelegatingManagedServicesTest.java Näytä tiedosto

@@ -278,6 +278,18 @@ public class DelegatingManagedServicesTest {
verify(alwaysManagedInstanceService).queuePermissionSyncTask("userUuid", "componentUuid", "projectUuid");
}

@Test
public void isProjectVisibilitySynchronizationActivated_whenManagedInstanceServices_shouldDelegatesToRightService() {
DelegatingManagedServices managedInstanceService = new DelegatingManagedServices(Set.of(new NeverManagedInstanceService(), new AlwaysManagedInstanceService()));

assertThat(managedInstanceService.isProjectVisibilitySynchronizationActivated()).isTrue();
}

@Test
public void isProjectVisibilitySynchronizationActivated_whenManagedNoInstanceServices_returnsFalse() {
assertThat(NO_MANAGED_SERVICES.isProjectVisibilitySynchronizationActivated()).isFalse();
}

private static class NeverManagedInstanceService implements ManagedInstanceService, ManagedProjectService {

@Override
@@ -334,6 +346,11 @@ public class DelegatingManagedServicesTest {
public void queuePermissionSyncTask(String submitterUuid, String componentUuid, String projectUuid) {

}

@Override
public boolean isProjectVisibilitySynchronizationActivated() {
return false;
}
}

private static class AlwaysManagedInstanceService implements ManagedInstanceService, ManagedProjectService {
@@ -392,6 +409,11 @@ public class DelegatingManagedServicesTest {
public void queuePermissionSyncTask(String submitterUuid, String componentUuid, String projectUuid) {

}

@Override
public boolean isProjectVisibilitySynchronizationActivated() {
return true;
}
}

}

+ 9
- 1
server/sonar-webserver-webapi/src/main/java/org/sonar/server/almsettings/ws/GithubProjectCreator.java Näytä tiedosto

@@ -164,7 +164,15 @@ public class GithubProjectCreator implements DevOpsProjectCreator {
private ComponentCreationData createProjectAndBindToDevOpsPlatform(DbSession dbSession, @Nullable String projectKey, AlmSettingDto almSettingDto,
GithubApplicationClient.Repository repository, CreationMethod creationMethod) {
String key = Optional.ofNullable(projectKey).orElse(getUniqueProjectKey(repository));
ComponentCreationData componentCreationData = projectCreator.createProject(dbSession, key, repository.getName(), repository.getDefaultBranch(), creationMethod);

boolean isPrivate;
if (managedProjectService.isProjectVisibilitySynchronizationActivated()) {
isPrivate = repository.isPrivate();
} else {
isPrivate = true;
}

ComponentCreationData componentCreationData = projectCreator.createProject(dbSession, key, repository.getName(), repository.getDefaultBranch(), creationMethod, isPrivate);
ProjectDto projectDto = Optional.ofNullable(componentCreationData.projectDto()).orElseThrow();
createProjectAlmSettingDto(dbSession, repository, projectDto, almSettingDto);
addScanPermissionToCurrentUser(dbSession, projectDto);

+ 8
- 2
server/sonar-webserver-webapi/src/main/java/org/sonar/server/project/ws/ProjectCreator.java Näytä tiedosto

@@ -50,11 +50,13 @@ public class ProjectCreator {
this.componentUpdater = componentUpdater;
}

public ComponentCreationData createProject(DbSession dbSession, String projectKey, String projectName, @Nullable String mainBranchName, CreationMethod creationMethod) {
public ComponentCreationData createProject(DbSession dbSession, String projectKey, String projectName, @Nullable String mainBranchName, CreationMethod creationMethod,
@Nullable Boolean isPrivate) {
boolean visibility = isPrivate != null ? isPrivate : projectDefaultVisibility.get(dbSession).isPrivate();
NewComponent projectComponent = newComponentBuilder()
.setKey(projectKey)
.setName(projectName)
.setPrivate(projectDefaultVisibility.get(dbSession).isPrivate())
.setPrivate(visibility)
.setQualifier(PROJECT)
.build();
ComponentCreationParameters componentCreationParameters = ComponentCreationParameters.builder()
@@ -67,4 +69,8 @@ public class ProjectCreator {
.build();
return componentUpdater.createWithoutCommit(dbSession, componentCreationParameters);
}

public ComponentCreationData createProject(DbSession dbSession, String projectKey, String projectName, @Nullable String mainBranchName, CreationMethod creationMethod) {
return createProject(dbSession, projectKey, projectName, mainBranchName, creationMethod, projectDefaultVisibility.get(dbSession).isPrivate());
}
}

+ 54
- 3
server/sonar-webserver-webapi/src/test/java/org/sonar/server/almsettings/ws/GithubProjectCreatorTest.java Näytä tiedosto

@@ -290,13 +290,55 @@ public class GithubProjectCreatorTest {
ComponentCreationParameters componentCreationParameters = componentCreationParametersCaptor.getValue();
assertComponentCreationParametersContainsCorrectInformation(componentCreationParameters, "generated_orga2/repo1", SCANNER_API_DEVOPS_AUTO_CONFIG);
assertThat(componentCreationParameters.isManaged()).isFalse();
assertThat(componentCreationParameters.newComponent().isPrivate()).isFalse();
assertThat(componentCreationParameters.newComponent().isPrivate()).isTrue();

verify(projectAlmSettingDao).insertOrUpdate(any(), projectAlmSettingDtoCaptor.capture(), eq(ALM_SETTING_KEY), eq(REPOSITORY_NAME), eq("generated_orga2/repo1"));
ProjectAlmSettingDto projectAlmSettingDto = projectAlmSettingDtoCaptor.getValue();
assertAlmSettingsDtoContainsCorrectInformation(almSettingDto, requireNonNull(componentCreationData.projectDto()), projectAlmSettingDto);
}

@Test
public void createProjectAndBindToDevOpsPlatformFromScanner_whenRepoFoundOnGitHubAndVisibilitySynchronizationEnabled_successfullyCreatesProjectAndSetsVisibility() {
// given
mockPublicGithubRepository();

ComponentCreationData componentCreationData = mockProjectCreation("generated_orga2/repo1");
ProjectAlmSettingDao projectAlmSettingDao = mock();
when(dbClient.projectAlmSettingDao()).thenReturn(projectAlmSettingDao);
when(managedProjectService.isProjectVisibilitySynchronizationActivated()).thenReturn(true);

// when
ComponentCreationData actualComponentCreationData = githubProjectCreator.createProjectAndBindToDevOpsPlatform(dbClient.openSession(true),
SCANNER_API_DEVOPS_AUTO_CONFIG, null);

// then
assertThat(actualComponentCreationData).isEqualTo(componentCreationData);

ComponentCreationParameters componentCreationParameters = componentCreationParametersCaptor.getValue();
assertThat(componentCreationParameters.newComponent().isPrivate()).isFalse();
}

@Test
public void createProjectAndBindToDevOpsPlatformFromScanner_whenRepoFoundOnGitHubAndVisibilitySynchronizationDisabled_successfullyCreatesProjectAndMakesProjectPrivate() {
// given
mockGitHubRepository();

ComponentCreationData componentCreationData = mockProjectCreation("generated_orga2/repo1");
ProjectAlmSettingDao projectAlmSettingDao = mock();
when(dbClient.projectAlmSettingDao()).thenReturn(projectAlmSettingDao);
when(managedProjectService.isProjectVisibilitySynchronizationActivated()).thenReturn(false);

// when
ComponentCreationData actualComponentCreationData = githubProjectCreator.createProjectAndBindToDevOpsPlatform(dbClient.openSession(true),
SCANNER_API_DEVOPS_AUTO_CONFIG, null);

// then
assertThat(actualComponentCreationData).isEqualTo(componentCreationData);

ComponentCreationParameters componentCreationParameters = componentCreationParametersCaptor.getValue();
assertThat(componentCreationParameters.newComponent().isPrivate()).isTrue();
}

@Test
public void createProjectAndBindToDevOpsPlatformFromApi_whenRepoFoundOnGitHub_successfullyCreatesProject() {
// given
@@ -316,7 +358,7 @@ public class GithubProjectCreatorTest {
ComponentCreationParameters componentCreationParameters = componentCreationParametersCaptor.getValue();
assertComponentCreationParametersContainsCorrectInformation(componentCreationParameters, projectKey, ALM_IMPORT_API);
assertThat(componentCreationParameters.isManaged()).isFalse();
assertThat(componentCreationParameters.newComponent().isPrivate()).isFalse();
assertThat(componentCreationParameters.newComponent().isPrivate()).isTrue();

verify(projectAlmSettingDao).insertOrUpdate(any(), projectAlmSettingDtoCaptor.capture(), eq(ALM_SETTING_KEY), eq(REPOSITORY_NAME), eq(projectKey));
ProjectAlmSettingDto projectAlmSettingDto = projectAlmSettingDtoCaptor.getValue();
@@ -373,16 +415,25 @@ public class GithubProjectCreatorTest {
assertThat(permissionChange.getProjectUuid()).isEqualTo(actualComponentCreationData.projectDto().getUuid());
}

private void mockGitHubRepository() {
private void mockPublicGithubRepository() {
GithubApplicationClient.Repository repository =mockGitHubRepository();
when(repository.isPrivate()).thenReturn(false);
}

private GithubApplicationClient.Repository mockGitHubRepository() {
GithubApplicationClient.Repository repository = mock();
when(repository.getDefaultBranch()).thenReturn(MAIN_BRANCH_NAME);
when(repository.getName()).thenReturn(REPOSITORY_NAME);
when(repository.getFullName()).thenReturn(DEVOPS_PROJECT_DESCRIPTOR.projectIdentifier());
when(repository.isPrivate()).thenReturn(true);
when(githubApplicationClient.getRepository(DEVOPS_PROJECT_DESCRIPTOR.url(), devOpsAppInstallationToken, DEVOPS_PROJECT_DESCRIPTOR.projectIdentifier())).thenReturn(
Optional.of(repository));
when(projectKeyGenerator.generateUniqueProjectKey(repository.getFullName())).thenReturn("generated_" + DEVOPS_PROJECT_DESCRIPTOR.projectIdentifier());
return repository;
}



private ComponentCreationData mockProjectCreation(String projectKey) {
ComponentCreationData componentCreationData = mock();
ProjectDto projectDto = mockProjectDto(projectKey);

Loading…
Peruuta
Tallenna