]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-21504 Correctly set project visibility and permissions on projects created...
authorWojtek Wajerowicz <115081248+wojciech-wajerowicz-sonarsource@users.noreply.github.com>
Tue, 23 Jan 2024 15:12:30 +0000 (16:12 +0100)
committersonartech <sonartech@sonarsource.com>
Mon, 29 Jan 2024 20:03:16 +0000 (20:03 +0000)
server/sonar-webserver-webapi/src/it/java/org/sonar/server/almintegration/ws/github/ImportGithubProjectActionIT.java
server/sonar-webserver-webapi/src/it/java/org/sonar/server/ce/queue/BranchReportSubmitterIT.java
server/sonar-webserver-webapi/src/it/java/org/sonar/server/ce/queue/ReportSubmitterIT.java
server/sonar-webserver-webapi/src/main/java/org/sonar/server/almsettings/ws/GithubProjectCreator.java
server/sonar-webserver-webapi/src/main/java/org/sonar/server/almsettings/ws/GithubProjectCreatorFactory.java
server/sonar-webserver-webapi/src/main/java/org/sonar/server/project/ws/ProjectCreator.java
server/sonar-webserver-webapi/src/test/java/org/sonar/server/almsettings/ws/GithubProjectCreatorFactoryTest.java
server/sonar-webserver-webapi/src/test/java/org/sonar/server/almsettings/ws/GithubProjectCreatorTest.java

index e47174d823f509fd26e44b6ae75f8668ad5385b0..fed6d8d4f8072ff84a104646142eef3c000566a1 100644 (file)
@@ -61,7 +61,6 @@ import org.sonar.server.exceptions.BadConfigurationException;
 import org.sonar.server.exceptions.NotFoundException;
 import org.sonar.server.exceptions.UnauthorizedException;
 import org.sonar.server.favorite.FavoriteUpdater;
-import org.sonar.server.management.ManagedInstanceService;
 import org.sonar.server.management.ManagedProjectService;
 import org.sonar.server.newcodeperiod.NewCodeDefinitionResolver;
 import org.sonar.server.permission.GroupPermissionChanger;
@@ -137,11 +136,10 @@ public class ImportGithubProjectActionIT {
   private final NewCodeDefinitionResolver newCodeDefinitionResolver = new NewCodeDefinitionResolver(db.getDbClient(), editionProvider);
 
   private final ManagedProjectService managedProjectService = mock(ManagedProjectService.class);
-  private final ManagedInstanceService managedInstanceService = mock(ManagedInstanceService.class);
 
   private final GithubPermissionConverter githubPermissionConverter = mock();
 
-  private final ProjectCreator projectCreator = new ProjectCreator(userSession, projectDefaultVisibility, managedInstanceService, componentUpdater);
+  private final ProjectCreator projectCreator = new ProjectCreator(userSession, projectDefaultVisibility, componentUpdater);
 
   private final GithubProjectCreatorFactory gitHubProjectCreatorFactory = new GithubProjectCreatorFactory(db.getDbClient(),
     null, appClient, projectKeyGenerator, userSession, projectCreator, gitHubSettings, githubPermissionConverter, userPermissionUpdater, permissionService,
@@ -151,7 +149,7 @@ public class ImportGithubProjectActionIT {
 
   @Before
   public void before() {
-    when(projectDefaultVisibility.get(any())).thenReturn(Visibility.PRIVATE);
+    when(projectDefaultVisibility.get(any())).thenReturn(Visibility.PUBLIC);
     when(defaultBranchNameResolver.getEffectiveMainBranchName()).thenReturn(DEFAULT_MAIN_BRANCH_NAME);
   }
 
@@ -160,6 +158,8 @@ public class ImportGithubProjectActionIT {
     AlmSettingDto githubAlmSetting = setupUserWithPatAndAlmSettings();
 
     GithubApplicationClient.Repository repository = mockGithubDevOpsAppInteractions();
+    mockGithubAuthAppInteractions();
+    when(gitHubSettings.isProvisioningEnabled()).thenReturn(true);
 
     Projects.CreateWsResponse response = callWebService(githubAlmSetting);
 
@@ -308,7 +308,7 @@ public class ImportGithubProjectActionIT {
   }
 
   @Test
-  public void importProject_whenGithubProvisioningIsDisabled_shouldApplyPermissionTemplate() {
+  public void importProject_whenGithubProvisioningIsDisabled_shouldApplyPermissionTemplateAndSetDefaultVisibility() {
     AlmSettingDto githubAlmSetting = setupUserWithPatAndAlmSettings();
 
     mockGithubDevOpsAppInteractions();
@@ -321,8 +321,9 @@ public class ImportGithubProjectActionIT {
 
     ArgumentCaptor<EntityDto> projectDtoArgumentCaptor = ArgumentCaptor.forClass(EntityDto.class);
     verify(permissionTemplateService).applyDefaultToNewComponent(any(DbSession.class), projectDtoArgumentCaptor.capture(), eq(userSession.getUuid()));
-    String projectKey = projectDtoArgumentCaptor.getValue().getKey();
-    assertThat(projectKey).isEqualTo(GENERATED_PROJECT_KEY);
+    EntityDto capturedProjectDto = projectDtoArgumentCaptor.getValue();
+    assertThat(capturedProjectDto.getKey()).isEqualTo(GENERATED_PROJECT_KEY);
+    assertThat(capturedProjectDto.isPrivate()).isFalse();
 
   }
 
@@ -330,7 +331,7 @@ public class ImportGithubProjectActionIT {
   public void importProject_whenGithubProvisioningIsEnabled_shouldNotApplyPermissionTemplate() {
     AlmSettingDto githubAlmSetting = setupUserWithPatAndAlmSettings();
 
-    when(managedInstanceService.isInstanceExternallyManaged()).thenReturn(true);
+    when(gitHubSettings.isProvisioningEnabled()).thenReturn(true);
     mockGithubDevOpsAppInteractions();
     mockGithubAuthAppInteractions();
 
@@ -443,7 +444,7 @@ public class ImportGithubProjectActionIT {
     assertThatThrownBy(request::execute)
       .isInstanceOf(BadConfigurationException.class)
       .hasMessage(format("GitHub auto-provisioning is activated. However the repo %s is not in the scope of the authentication application. "
-          + "The permissions can't be checked, and the project can not be created.",
+        + "The permissions can't be checked, and the project can not be created.",
         "octocat/" + PROJECT_KEY_NAME));
   }
 
index 8cb43dd15fe9e1b4b1bb11b60351d40c985297c2..97edaa41626be1e0d14c219b776cf3fc915753f0 100644 (file)
@@ -112,7 +112,7 @@ public class BranchReportSubmitterIT {
     null, null, userSession, null, null, null, null, null, null);
 
   private final ManagedInstanceService managedInstanceService = mock();
-  private final ProjectCreator projectCreator = new ProjectCreator(userSession, projectDefaultVisibility, managedInstanceService, componentUpdater);
+  private final ProjectCreator projectCreator = new ProjectCreator(userSession, projectDefaultVisibility, componentUpdater);
   private final ReportSubmitter underTest = new ReportSubmitter(queue, userSession, projectCreator, componentUpdater, permissionTemplateService, db.getDbClient(), branchSupport,
     devOpsProjectCreatorFactory, managedInstanceService);
 
index c539bced5949110e9d30101fe96a97edf227cc0d..f466a756c14c31c297b7c16b99c45660f6459010 100644 (file)
@@ -127,7 +127,7 @@ public class ReportSubmitterIT {
     new FavoriteUpdater(db.getDbClient()), projectIndexers, new SequenceUuidFactory(), defaultBranchNameResolver, mock(PermissionUpdater.class), permissionService);
   private final ManagedProjectService managedProjectService = mock();
   private final ManagedInstanceService managedInstanceService = mock();
-  private final ProjectCreator projectCreator = new ProjectCreator(userSession, projectDefaultVisibility, managedInstanceService, componentUpdater);
+  private final ProjectCreator projectCreator = new ProjectCreator(userSession, projectDefaultVisibility, componentUpdater);
   private final GithubProjectCreatorFactory githubProjectCreatorFactory = new GithubProjectCreatorFactory(db.getDbClient(), githubGlobalSettingsValidator,
     githubApplicationClient, projectKeyGenerator, userSession, projectCreator, gitHubSettings, null, permissionUpdater, permissionService,
     managedProjectService);
@@ -288,15 +288,33 @@ public class ReportSubmitterIT {
     UserDto user = db.users().insertUser();
     userSession.logIn(user).addPermission(PROVISION_PROJECTS).addPermission(SCAN);
 
-    when(managedInstanceService.isInstanceExternallyManaged()).thenReturn(true);
+    when(gitHubSettings.isProvisioningEnabled()).thenReturn(true);
     mockSuccessfulPrepareSubmitCall();
 
-    DevOpsProjectCreator devOpsProjectCreator = mockAlmSettingDtoAndDevOpsProjectCreator(CHARACTERISTICS);
+    DevOpsProjectCreator devOpsProjectCreator = mockAlmSettingDtoAndDevOpsProjectCreator(CHARACTERISTICS, false);
     doReturn(true).when(devOpsProjectCreator).isScanAllowedUsingPermissionsFromDevopsPlatform();
 
     underTest.submit(PROJECT_KEY, PROJECT_NAME, CHARACTERISTICS, IOUtils.toInputStream("{binary}", UTF_8));
 
-    assertProjectWasCreatedWithBinding();
+    assertProjectWasCreatedWithBinding(true);
+    verify(permissionTemplateService, never()).applyDefaultToNewComponent(any(), any(), any());
+  }
+
+  @Test
+  public void submit_whenReportIsForANewProjectWithValidAlmSettingsAutoProvisioningOnAndProjectVisibilitySyncAndPermOnGh_createsProjectWithBinding() {
+    UserDto user = db.users().insertUser();
+    userSession.logIn(user).addPermission(PROVISION_PROJECTS).addPermission(SCAN);
+
+    when(gitHubSettings.isProvisioningEnabled()).thenReturn(true);
+    when(gitHubSettings.isProjectVisibilitySynchronizationActivated()).thenReturn(true);
+    mockSuccessfulPrepareSubmitCall();
+
+    DevOpsProjectCreator devOpsProjectCreator = mockAlmSettingDtoAndDevOpsProjectCreator(CHARACTERISTICS, false);
+    doReturn(true).when(devOpsProjectCreator).isScanAllowedUsingPermissionsFromDevopsPlatform();
+
+    underTest.submit(PROJECT_KEY, PROJECT_NAME, CHARACTERISTICS, IOUtils.toInputStream("{binary}", UTF_8));
+
+    assertProjectWasCreatedWithBinding(false);
     verify(permissionTemplateService, never()).applyDefaultToNewComponent(any(), any(), any());
   }
 
@@ -304,15 +322,15 @@ public class ReportSubmitterIT {
   public void submit_whenReportIsForANewProjectWithValidAlmSettingsAutoProvisioningOnNoPermOnGhAndGlobalScanPerm_createsProjectWithBinding() {
     UserDto user = db.users().insertUser();
     userSession.logIn(user).addPermission(GlobalPermission.SCAN).addPermission(PROVISION_PROJECTS);
-    when(managedInstanceService.isInstanceExternallyManaged()).thenReturn(true);
+    when(gitHubSettings.isProvisioningEnabled()).thenReturn(true);
     mockSuccessfulPrepareSubmitCall();
 
-    DevOpsProjectCreator devOpsProjectCreator = mockAlmSettingDtoAndDevOpsProjectCreator(CHARACTERISTICS);
+    DevOpsProjectCreator devOpsProjectCreator = mockAlmSettingDtoAndDevOpsProjectCreator(CHARACTERISTICS, false);
     doReturn(true).when(devOpsProjectCreator).isScanAllowedUsingPermissionsFromDevopsPlatform();
 
     underTest.submit(PROJECT_KEY, PROJECT_NAME, CHARACTERISTICS, IOUtils.toInputStream("{binary}", UTF_8));
 
-    assertProjectWasCreatedWithBinding();
+    assertProjectWasCreatedWithBinding(true);
     verify(permissionTemplateService, never()).applyDefaultToNewComponent(any(), any(), any());
   }
 
@@ -346,19 +364,20 @@ public class ReportSubmitterIT {
     userSession.addPermission(GlobalPermission.SCAN).addPermission(PROVISION_PROJECTS);
     mockSuccessfulPrepareSubmitCall();
 
-    mockAlmSettingDtoAndDevOpsProjectCreator(CHARACTERISTICS);
+    mockAlmSettingDtoAndDevOpsProjectCreator(CHARACTERISTICS, true);
 
     when(permissionTemplateService.wouldUserHaveScanPermissionWithDefaultTemplate(any(DbSession.class), any(), eq(PROJECT_KEY))).thenReturn(true);
 
     underTest.submit(PROJECT_KEY, PROJECT_NAME, CHARACTERISTICS, IOUtils.toInputStream("{binary}", UTF_8));
 
-    assertProjectWasCreatedWithBinding();
+    assertProjectWasCreatedWithBinding(false);
   }
 
-  private void assertProjectWasCreatedWithBinding() {
+  private void assertProjectWasCreatedWithBinding(boolean isPrivate) {
     ProjectDto projectDto = db.getDbClient().projectDao().selectProjectByKey(db.getSession(), PROJECT_KEY).orElseThrow();
     assertThat(projectDto.getCreationMethod()).isEqualTo(CreationMethod.SCANNER_API_DEVOPS_AUTO_CONFIG);
     assertThat(projectDto.getName()).isEqualTo("repoName");
+    assertThat(projectDto.isPrivate()).isEqualTo(isPrivate);
 
     BranchDto branchDto = db.getDbClient().branchDao().selectByBranchKey(db.getSession(), projectDto.getUuid(), "defaultBranch").orElseThrow();
     assertThat(branchDto.isMain()).isTrue();
@@ -366,27 +385,28 @@ public class ReportSubmitterIT {
     assertThat(db.getDbClient().projectAlmSettingDao().selectByProject(db.getSession(), projectDto.getUuid())).isPresent();
   }
 
-  private DevOpsProjectCreator mockAlmSettingDtoAndDevOpsProjectCreator(Map<String, String> characteristics) {
+  private DevOpsProjectCreator mockAlmSettingDtoAndDevOpsProjectCreator(Map<String, String> characteristics, boolean isPrivate) {
     AlmSettingDto almSettingDto = mock(AlmSettingDto.class);
     when(almSettingDto.getAlm()).thenReturn(ALM.GITHUB);
     when(almSettingDto.getUrl()).thenReturn("https://www.toto.com");
     when(almSettingDto.getUuid()).thenReturn("uuid_gh_1");
 
-    mockGithubRepository();
+    mockGithubRepository(isPrivate);
 
     DevOpsProjectDescriptor projectDescriptor = new DevOpsProjectDescriptor(ALM.GITHUB, "apiUrl", "orga/repo");
     GithubProjectCreationParameters githubProjectCreationParameters = new GithubProjectCreationParameters(projectDescriptor, almSettingDto, userSession, mock(), null);
     DevOpsProjectCreator devOpsProjectCreator = spy(new GithubProjectCreator(db.getDbClient(), githubApplicationClient, null, projectKeyGenerator,
-      permissionUpdater, permissionService, managedProjectService, projectCreator, githubProjectCreationParameters));
+      permissionUpdater, permissionService, managedProjectService, projectCreator, githubProjectCreationParameters, gitHubSettings));
     doReturn(Optional.of(devOpsProjectCreator)).when(devOpsProjectCreatorFactorySpy).getDevOpsProjectCreator(any(), eq(characteristics));
     return devOpsProjectCreator;
   }
 
-  private void mockGithubRepository() {
+  private void mockGithubRepository(boolean isPrivate) {
     GithubApplicationClient.Repository repository = mock(GithubApplicationClient.Repository.class);
     when(repository.getDefaultBranch()).thenReturn("defaultBranch");
     when(repository.getFullName()).thenReturn("orga/repoName");
     when(repository.getName()).thenReturn("repoName");
+    when(repository.isPrivate()).thenReturn(isPrivate);
     when(githubApplicationClient.getRepository(any(), any(), any())).thenReturn(Optional.of(repository));
   }
 
index 81767282b9c0c54a91b630cba4190c60583f9138..36e9b8a0609be8c5906f748da6743f7cfbfdfce3 100644 (file)
@@ -24,10 +24,12 @@ import java.util.Set;
 import javax.annotation.CheckForNull;
 import javax.annotation.Nullable;
 import org.sonar.auth.github.AppInstallationToken;
+import org.sonar.auth.github.GitHubSettings;
 import org.sonar.auth.github.client.GithubApplicationClient;
 import org.sonar.alm.client.github.GithubPermissionConverter;
 import org.sonar.auth.github.GsonRepositoryCollaborator;
 import org.sonar.auth.github.GsonRepositoryTeam;
+import org.sonar.auth.github.client.GithubApplicationClient.Repository;
 import org.sonar.auth.github.security.AccessToken;
 import org.sonar.api.web.UserRole;
 import org.sonar.auth.github.GsonRepositoryPermissions;
@@ -70,13 +72,14 @@ public class GithubProjectCreator implements DevOpsProjectCreator {
   private final UserSession userSession;
   private final AlmSettingDto almSettingDto;
   private final AccessToken devOpsAppInstallationToken;
+  private final GitHubSettings gitHubSettings;
 
   @CheckForNull
   private final AppInstallationToken authAppInstallationToken;
 
   public GithubProjectCreator(DbClient dbClient, GithubApplicationClient githubApplicationClient, GithubPermissionConverter githubPermissionConverter,
     ProjectKeyGenerator projectKeyGenerator, PermissionUpdater<UserPermissionChange> permissionUpdater, PermissionService permissionService,
-    ManagedProjectService managedProjectService, ProjectCreator projectCreator, GithubProjectCreationParameters githubProjectCreationParameters) {
+    ManagedProjectService managedProjectService, ProjectCreator projectCreator, GithubProjectCreationParameters githubProjectCreationParameters, GitHubSettings gitHubSettings) {
 
     this.dbClient = dbClient;
     this.githubApplicationClient = githubApplicationClient;
@@ -92,6 +95,7 @@ public class GithubProjectCreator implements DevOpsProjectCreator {
     devOpsProjectDescriptor = githubProjectCreationParameters.devOpsProjectDescriptor();
     devOpsAppInstallationToken = githubProjectCreationParameters.devOpsAppInstallationToken();
     authAppInstallationToken = githubProjectCreationParameters.authAppInstallationToken();
+    this.gitHubSettings = gitHubSettings;
   }
 
   @Override
@@ -154,7 +158,7 @@ public class GithubProjectCreator implements DevOpsProjectCreator {
   @Override
   public ComponentCreationData createProjectAndBindToDevOpsPlatform(DbSession dbSession, CreationMethod creationMethod, @Nullable String projectKey) {
     String url = requireNonNull(almSettingDto.getUrl(), "DevOps Platform url cannot be null");
-    GithubApplicationClient.Repository repository = githubApplicationClient.getRepository(url, devOpsAppInstallationToken, devOpsProjectDescriptor.projectIdentifier())
+    Repository repository = githubApplicationClient.getRepository(url, devOpsAppInstallationToken, devOpsProjectDescriptor.projectIdentifier())
       .orElseThrow(() -> new IllegalStateException(
         String.format("Impossible to find the repository '%s' on GitHub, using the devops config %s", devOpsProjectDescriptor.projectIdentifier(), almSettingDto.getKey())));
 
@@ -162,26 +166,35 @@ public class GithubProjectCreator implements DevOpsProjectCreator {
   }
 
   private ComponentCreationData createProjectAndBindToDevOpsPlatform(DbSession dbSession, @Nullable String projectKey, AlmSettingDto almSettingDto,
-    GithubApplicationClient.Repository repository, CreationMethod creationMethod) {
+    Repository repository, CreationMethod creationMethod) {
     String key = Optional.ofNullable(projectKey).orElse(getUniqueProjectKey(repository));
 
-    boolean isPrivate;
-    if (managedProjectService.isProjectVisibilitySynchronizationActivated()) {
-      isPrivate = repository.isPrivate();
-    } else {
-      isPrivate = true;
-    }
+    boolean isManaged = gitHubSettings.isProvisioningEnabled();
 
-    ComponentCreationData componentCreationData = projectCreator.createProject(dbSession, key, repository.getName(), repository.getDefaultBranch(), creationMethod, isPrivate);
+    ComponentCreationData componentCreationData = projectCreator.createProject(dbSession, key, repository.getName(), repository.getDefaultBranch(), creationMethod,
+      shouldProjectBePrivate(repository), isManaged);
     ProjectDto projectDto = Optional.ofNullable(componentCreationData.projectDto()).orElseThrow();
     createProjectAlmSettingDto(dbSession, repository, projectDto, almSettingDto);
     addScanPermissionToCurrentUser(dbSession, projectDto);
 
     BranchDto mainBranchDto = Optional.ofNullable(componentCreationData.mainBranchDto()).orElseThrow();
-    syncProjectPermissionsWithGithub(projectDto, mainBranchDto);
+    if (gitHubSettings.isProvisioningEnabled()) {
+      syncProjectPermissionsWithGithub(projectDto, mainBranchDto);
+    }
     return componentCreationData;
   }
 
+  @CheckForNull
+  private Boolean shouldProjectBePrivate(Repository repository) {
+    if (gitHubSettings.isProvisioningEnabled() && gitHubSettings.isProjectVisibilitySynchronizationActivated()) {
+      return repository.isPrivate();
+    } else if (gitHubSettings.isProvisioningEnabled()) {
+      return true;
+    } else {
+      return null;
+    }
+  }
+
   private void addScanPermissionToCurrentUser(DbSession dbSession, ProjectDto projectDto) {
     UserIdDto userId = new UserIdDto(requireNonNull(userSession.getUuid()), requireNonNull(userSession.getLogin()));
     UserPermissionChange scanPermission = new UserPermissionChange(Operation.ADD, UserRole.SCAN, projectDto, userId, permissionService);
@@ -193,11 +206,11 @@ public class GithubProjectCreator implements DevOpsProjectCreator {
     managedProjectService.queuePermissionSyncTask(userUuid, mainBranchDto.getUuid(), projectDto.getUuid());
   }
 
-  private String getUniqueProjectKey(GithubApplicationClient.Repository repository) {
+  private String getUniqueProjectKey(Repository repository) {
     return projectKeyGenerator.generateUniqueProjectKey(repository.getFullName());
   }
 
-  private void createProjectAlmSettingDto(DbSession dbSession, GithubApplicationClient.Repository repo, ProjectDto projectDto, AlmSettingDto almSettingDto) {
+  private void createProjectAlmSettingDto(DbSession dbSession, Repository repo, ProjectDto projectDto, AlmSettingDto almSettingDto) {
     ProjectAlmSettingDto projectAlmSettingDto = new ProjectAlmSettingDto()
       .setAlmSettingUuid(almSettingDto.getUuid())
       .setAlmRepo(repo.getFullName())
index 49a4216af14e242013e877b21386d311b30e354e..f89327115ff5fff0aa28c01c3f549a1ef957216b 100644 (file)
@@ -62,7 +62,6 @@ public class GithubProjectCreatorFactory implements DevOpsProjectCreatorFactory
   private final GithubPermissionConverter githubPermissionConverter;
   private final PermissionUpdater<UserPermissionChange> permissionUpdater;
   private final PermissionService permissionService;
-
   private final ManagedProjectService managedProjectService;
 
   public GithubProjectCreatorFactory(DbClient dbClient, GithubGlobalSettingsValidator githubGlobalSettingsValidator,
@@ -115,7 +114,7 @@ public class GithubProjectCreatorFactory implements DevOpsProjectCreatorFactory
     GithubProjectCreationParameters githubProjectCreationParameters = new GithubProjectCreationParameters(devOpsProjectDescriptor, almSettingDto, userSession, appInstallationToken,
       authAppInstallationToken.orElse(null));
     return new GithubProjectCreator(dbClient, githubApplicationClient, githubPermissionConverter, projectKeyGenerator, permissionUpdater, permissionService,
-      managedProjectService, projectCreator, githubProjectCreationParameters);
+      managedProjectService, projectCreator, githubProjectCreationParameters, gitHubSettings);
   }
 
   public DevOpsProjectCreator getDevOpsProjectCreator(AlmSettingDto almSettingDto, AccessToken accessToken,
@@ -125,7 +124,7 @@ public class GithubProjectCreatorFactory implements DevOpsProjectCreatorFactory
     GithubProjectCreationParameters githubProjectCreationParameters = new GithubProjectCreationParameters(devOpsProjectDescriptor, almSettingDto, userSession, accessToken,
       authAppInstallationToken.orElse(null));
     return new GithubProjectCreator(dbClient, githubApplicationClient, githubPermissionConverter, projectKeyGenerator, permissionUpdater, permissionService,
-      managedProjectService, projectCreator, githubProjectCreationParameters
+      managedProjectService, projectCreator, githubProjectCreationParameters, gitHubSettings
     );
   }
 
index e52b5e9e43a193e1e6bbe1bc500b96e431e42406..219ed696dab81a89874bd008466d67396ac1e2d2 100644 (file)
@@ -27,7 +27,6 @@ import org.sonar.server.component.ComponentCreationData;
 import org.sonar.server.component.ComponentCreationParameters;
 import org.sonar.server.component.ComponentUpdater;
 import org.sonar.server.component.NewComponent;
-import org.sonar.server.management.ManagedInstanceService;
 import org.sonar.server.project.ProjectDefaultVisibility;
 import org.sonar.server.user.UserSession;
 
@@ -39,19 +38,16 @@ public class ProjectCreator {
 
   private final UserSession userSession;
   private final ProjectDefaultVisibility projectDefaultVisibility;
-  private final ManagedInstanceService managedInstanceService;
   private final ComponentUpdater componentUpdater;
 
-  public ProjectCreator(UserSession userSession, ProjectDefaultVisibility projectDefaultVisibility, ManagedInstanceService managedInstanceService,
-    ComponentUpdater componentUpdater) {
+  public ProjectCreator(UserSession userSession, ProjectDefaultVisibility projectDefaultVisibility, ComponentUpdater componentUpdater) {
     this.userSession = userSession;
     this.projectDefaultVisibility = projectDefaultVisibility;
-    this.managedInstanceService = managedInstanceService;
     this.componentUpdater = componentUpdater;
   }
 
   public ComponentCreationData createProject(DbSession dbSession, String projectKey, String projectName, @Nullable String mainBranchName, CreationMethod creationMethod,
-    @Nullable Boolean isPrivate) {
+    @Nullable Boolean isPrivate, boolean isManaged) {
     boolean visibility = isPrivate != null ? isPrivate : projectDefaultVisibility.get(dbSession).isPrivate();
     NewComponent projectComponent = newComponentBuilder()
       .setKey(projectKey)
@@ -64,13 +60,13 @@ public class ProjectCreator {
       .userLogin(userSession.getLogin())
       .userUuid(userSession.getUuid())
       .mainBranchName(mainBranchName)
-      .isManaged(managedInstanceService.isInstanceExternallyManaged() && !creationMethod.isLocal())
+      .isManaged(isManaged)
       .creationMethod(creationMethod)
       .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());
+    return createProject(dbSession, projectKey, projectName, mainBranchName, creationMethod, projectDefaultVisibility.get(dbSession).isPrivate(), false);
   }
 }
index 67a169fd365a649ccf6dd48048c7f27fd0257099..561d71cd7fc22a528b23ef07f8f493d9d28086e7 100644 (file)
@@ -237,7 +237,7 @@ public class GithubProjectCreatorFactoryTest {
     GithubProjectCreationParameters githubProjectCreationParameters = new GithubProjectCreationParameters(devOpsProjectDescriptor, almSettingDto, userSession, appInstallationToken,
       authAppInstallToken);
     return new GithubProjectCreator(dbClient, githubApplicationClient, githubPermissionConverter, projectKeyGenerator, permissionUpdater, permissionService,
-      managedProjectService, projectCreator, githubProjectCreationParameters);
+      managedProjectService, projectCreator, githubProjectCreationParameters, gitHubSettings);
   }
 
   private AlmSettingDto mockAlmSettingDto(boolean repoAccess) {
index 7156bba2d17edd9024d382b5c041174cd9afecac..999691665b843436acdb4b1930118d5eac1d8393 100644 (file)
@@ -31,15 +31,16 @@ import org.mockito.ArgumentCaptor;
 import org.mockito.Captor;
 import org.mockito.Mock;
 import org.mockito.junit.MockitoJUnitRunner;
+import org.sonar.alm.client.github.GithubPermissionConverter;
+import org.sonar.api.resources.Qualifiers;
+import org.sonar.api.web.UserRole;
 import org.sonar.auth.github.AppInstallationToken;
-import org.sonar.auth.github.client.GithubApplicationClient;
+import org.sonar.auth.github.GitHubSettings;
 import org.sonar.auth.github.GsonRepositoryCollaborator;
+import org.sonar.auth.github.GsonRepositoryPermissions;
 import org.sonar.auth.github.GsonRepositoryTeam;
+import org.sonar.auth.github.client.GithubApplicationClient;
 import org.sonar.auth.github.security.AccessToken;
-import org.sonar.api.resources.Qualifiers;
-import org.sonar.api.web.UserRole;
-import org.sonar.alm.client.github.GithubPermissionConverter;
-import org.sonar.auth.github.GsonRepositoryPermissions;
 import org.sonar.db.DbClient;
 import org.sonar.db.alm.setting.ALM;
 import org.sonar.db.alm.setting.AlmSettingDto;
@@ -55,13 +56,13 @@ import org.sonar.server.component.ComponentCreationData;
 import org.sonar.server.component.ComponentCreationParameters;
 import org.sonar.server.component.ComponentUpdater;
 import org.sonar.server.component.NewComponent;
-import org.sonar.server.management.ManagedInstanceService;
 import org.sonar.server.management.ManagedProjectService;
 import org.sonar.server.permission.PermissionService;
 import org.sonar.server.permission.PermissionServiceImpl;
 import org.sonar.server.permission.PermissionUpdater;
 import org.sonar.server.permission.UserPermissionChange;
 import org.sonar.server.project.ProjectDefaultVisibility;
+import org.sonar.server.project.Visibility;
 import org.sonar.server.project.ws.ProjectCreator;
 import org.sonar.server.user.UserSession;
 
@@ -115,11 +116,9 @@ public class GithubProjectCreatorTest {
   private PermissionUpdater<UserPermissionChange> permissionUpdater;
   @Mock
   private ManagedProjectService managedProjectService;
-  @Mock
-  private ManagedInstanceService managedInstanceService;
-
   @Mock(answer = Answers.RETURNS_DEEP_STUBS)
   private ProjectDefaultVisibility projectDefaultVisibility;
+  private GitHubSettings gitHubSettings = mock();
   private ProjectCreator projectCreator;
 
   private GithubProjectCreator githubProjectCreator;
@@ -143,9 +142,9 @@ public class GithubProjectCreatorTest {
     when(githubProjectCreationParameters.authAppInstallationToken()).thenReturn(authAppInstallationToken);
     when(githubProjectCreationParameters.almSettingDto()).thenReturn(almSettingDto);
 
-    projectCreator = new ProjectCreator(userSession, projectDefaultVisibility, managedInstanceService, componentUpdater);
+    projectCreator = new ProjectCreator(userSession, projectDefaultVisibility, componentUpdater);
     githubProjectCreator = new GithubProjectCreator(dbClient, githubApplicationClient, githubPermissionConverter, projectKeyGenerator,
-      permissionUpdater, permissionService, managedProjectService, projectCreator, githubProjectCreationParameters);
+      permissionUpdater, permissionService, managedProjectService, projectCreator, githubProjectCreationParameters,gitHubSettings);
 
   }
 
@@ -267,7 +266,7 @@ public class GithubProjectCreatorTest {
   @Test
   public void createProjectAndBindToDevOpsPlatform_whenRepoNotFound_throws() {
     assertThatIllegalStateException().isThrownBy(
-        () -> githubProjectCreator.createProjectAndBindToDevOpsPlatform(mock(), SCANNER_API_DEVOPS_AUTO_CONFIG, null))
+      () -> githubProjectCreator.createProjectAndBindToDevOpsPlatform(mock(), SCANNER_API_DEVOPS_AUTO_CONFIG, null))
       .withMessage("Impossible to find the repository 'orga2/repo1' on GitHub, using the devops config " + ALM_SETTING_KEY);
   }
 
@@ -279,6 +278,7 @@ public class GithubProjectCreatorTest {
     ComponentCreationData componentCreationData = mockProjectCreation("generated_orga2/repo1");
     ProjectAlmSettingDao projectAlmSettingDao = mock();
     when(dbClient.projectAlmSettingDao()).thenReturn(projectAlmSettingDao);
+    when(projectDefaultVisibility.get(any())).thenReturn(Visibility.PRIVATE);
 
     // when
     ComponentCreationData actualComponentCreationData = githubProjectCreator.createProjectAndBindToDevOpsPlatform(dbClient.openSession(true),
@@ -305,7 +305,8 @@ public class GithubProjectCreatorTest {
     ComponentCreationData componentCreationData = mockProjectCreation("generated_orga2/repo1");
     ProjectAlmSettingDao projectAlmSettingDao = mock();
     when(dbClient.projectAlmSettingDao()).thenReturn(projectAlmSettingDao);
-    when(managedProjectService.isProjectVisibilitySynchronizationActivated()).thenReturn(true);
+    when(gitHubSettings.isProvisioningEnabled()).thenReturn(true);
+    when(gitHubSettings.isProjectVisibilitySynchronizationActivated()).thenReturn(true);
 
     // when
     ComponentCreationData actualComponentCreationData = githubProjectCreator.createProjectAndBindToDevOpsPlatform(dbClient.openSession(true),
@@ -326,7 +327,8 @@ public class GithubProjectCreatorTest {
     ComponentCreationData componentCreationData = mockProjectCreation("generated_orga2/repo1");
     ProjectAlmSettingDao projectAlmSettingDao = mock();
     when(dbClient.projectAlmSettingDao()).thenReturn(projectAlmSettingDao);
-    when(managedProjectService.isProjectVisibilitySynchronizationActivated()).thenReturn(false);
+    when(gitHubSettings.isProvisioningEnabled()).thenReturn(true);
+    when(gitHubSettings.isProjectVisibilitySynchronizationActivated()).thenReturn(false);
 
     // when
     ComponentCreationData actualComponentCreationData = githubProjectCreator.createProjectAndBindToDevOpsPlatform(dbClient.openSession(true),
@@ -348,6 +350,7 @@ public class GithubProjectCreatorTest {
     ComponentCreationData componentCreationData = mockProjectCreation(projectKey);
     ProjectAlmSettingDao projectAlmSettingDao = mock();
     when(dbClient.projectAlmSettingDao()).thenReturn(projectAlmSettingDao);
+    when(projectDefaultVisibility.get(any())).thenReturn(Visibility.PRIVATE);
 
     // when
     ComponentCreationData actualComponentCreationData = githubProjectCreator.createProjectAndBindToDevOpsPlatform(dbClient.openSession(true), ALM_IMPORT_API, projectKey);
@@ -372,7 +375,6 @@ public class GithubProjectCreatorTest {
   public void createProjectAndBindToDevOpsPlatformFromApi_whenRepoFoundOnGitHubAutoProvisioningOnAndRepoPrivate_successfullyCreatesProject() {
     // given
     when(projectDefaultVisibility.get(any()).isPrivate()).thenReturn(true);
-    when(managedInstanceService.isInstanceExternallyManaged()).thenReturn(true);
 
     String projectKey = "customProjectKey";
     mockGitHubRepository();
@@ -380,6 +382,7 @@ public class GithubProjectCreatorTest {
     ComponentCreationData componentCreationData = mockProjectCreation(projectKey);
     ProjectAlmSettingDao projectAlmSettingDao = mock();
     when(dbClient.projectAlmSettingDao()).thenReturn(projectAlmSettingDao);
+    when(gitHubSettings.isProvisioningEnabled()).thenReturn(true);
 
     // when
     ComponentCreationData actualComponentCreationData = githubProjectCreator.createProjectAndBindToDevOpsPlatform(dbClient.openSession(true), ALM_IMPORT_API, projectKey);
@@ -416,7 +419,7 @@ public class GithubProjectCreatorTest {
   }
 
   private void mockPublicGithubRepository() {
-    GithubApplicationClient.Repository repository =mockGitHubRepository();
+    GithubApplicationClient.Repository repository = mockGitHubRepository();
     when(repository.isPrivate()).thenReturn(false);
   }
 
@@ -429,11 +432,9 @@ public class GithubProjectCreatorTest {
     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;
+    return repository;
   }
 
-
-
   private ComponentCreationData mockProjectCreation(String projectKey) {
     ComponentCreationData componentCreationData = mock();
     ProjectDto projectDto = mockProjectDto(projectKey);