]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-10166 Delete quality gates when deleting organization
authorJulien Lancelot <julien.lancelot@sonarsource.com>
Thu, 7 Dec 2017 13:09:56 +0000 (14:09 +0100)
committerJulien Lancelot <julien.lancelot@sonarsource.com>
Thu, 14 Dec 2017 16:03:35 +0000 (17:03 +0100)
server/sonar-db-dao/src/main/java/org/sonar/db/qualitygate/QualityGateDao.java
server/sonar-db-dao/src/main/java/org/sonar/db/qualitygate/QualityGateMapper.java
server/sonar-db-dao/src/main/resources/org/sonar/db/qualitygate/QualityGateMapper.xml
server/sonar-db-dao/src/test/java/org/sonar/db/qualitygate/QualityGateDaoTest.java
server/sonar-server/src/main/java/org/sonar/server/organization/ws/DeleteAction.java
server/sonar-server/src/test/java/org/sonar/server/organization/ws/DeleteActionTest.java

index 5e226c64537b85bed9b1104934e9f7363b15d543..1529d4f7fa61c9774b5e4cbe1714c7efbc04ab1b 100644 (file)
@@ -23,6 +23,7 @@ import java.util.Collection;
 import java.util.Date;
 import javax.annotation.CheckForNull;
 import org.sonar.db.Dao;
+import org.sonar.db.DatabaseUtils;
 import org.sonar.db.DbSession;
 import org.sonar.db.organization.OrganizationDto;
 
@@ -76,6 +77,14 @@ public class QualityGateDao implements Dao {
     mapper(session).deleteOrgQualityGatesByQualityGateUuid(qGate.getUuid());
   }
 
+  public void deleteByUuids(DbSession session, Collection<String> uuids) {
+    QualityGateMapper mapper = mapper(session);
+    DatabaseUtils.executeLargeUpdates(uuids, partitionUuids -> {
+      mapper.deleteByUuids(partitionUuids);
+      mapper.deleteOrgQualityGatesByQualityGateUuids(partitionUuids);
+    });
+  }
+
   public void update(QualityGateDto qGate, DbSession session) {
     mapper(session).update(qGate.setUpdatedAt(new Date()));
   }
index b804b904f0ed07ace36aeeabc307f2f5dcd2eeaf..783d32bc65073680621f70187576fcd568fe1587 100644 (file)
@@ -19,6 +19,7 @@
  */
 package org.sonar.db.qualitygate;
 
+import java.util.Collection;
 import java.util.List;
 import org.apache.ibatis.annotations.Param;
 
@@ -46,8 +47,12 @@ public interface QualityGateMapper {
 
   void delete(String uuid);
 
+  void deleteByUuids(@Param("uuids") Collection<String> uuids);
+
   void deleteOrgQualityGatesByQualityGateUuid(String uuid);
 
+  void deleteOrgQualityGatesByQualityGateUuids(@Param("uuids") Collection<String> uuids);
+
   void update(QualityGateDto qGate);
 
   void ensureOneBuiltInQualityGate(String builtInQualityName);
index 89142897865d4991d36b21def446cef5a0e2511d..a235cefcf9076234e16a320c39e1386c4d4030d5 100644 (file)
     delete from quality_gates where uuid=#{uuid}
   </update>
 
+  <update id="deleteByUuids" parameterType="map">
+    delete from quality_gates
+    where uuid in
+    <foreach collection="uuids" open="(" close=")" item="uuid" separator=",">#{uuid, jdbcType=VARCHAR}</foreach>
+  </update>
+
   <update id="deleteOrgQualityGatesByQualityGateUuid" parameterType="String">
     delete from org_quality_gates where quality_gate_uuid=#{uuid}
   </update>
 
+  <update id="deleteOrgQualityGatesByQualityGateUuids" parameterType="map">
+    delete from org_quality_gates
+    where quality_gate_uuid in
+    <foreach collection="uuids" open="(" close=")" item="uuid" separator=",">#{uuid, jdbcType=VARCHAR}</foreach>
+  </update>
+
   <update id="update" parameterType="QualityGate">
     update quality_gates set
     name=#{name},
index 037058302560cc65f2f634f901231a362b41e4b7..8c950112625328f17b92f342f691105ec8c19609 100644 (file)
@@ -19,6 +19,7 @@
  */
 package org.sonar.db.qualitygate;
 
+import java.util.Collections;
 import java.util.Date;
 import org.junit.Rule;
 import org.junit.Test;
@@ -29,6 +30,7 @@ import org.sonar.db.DbTester;
 import org.sonar.db.organization.OrganizationDto;
 
 import static java.lang.String.format;
+import static java.util.Arrays.asList;
 import static org.assertj.core.api.Assertions.assertThat;
 
 public class QualityGateDaoTest {
@@ -174,6 +176,27 @@ public class QualityGateDaoTest {
     assertThat(db.countSql(dbSession, format("select count(*) from org_quality_gates where quality_gate_uuid='%s'", otherQualityGate.getUuid()))).isEqualTo(1);
   }
 
+  @Test
+  public void delete_by_uuids() {
+    OrganizationDto organization = db.organizations().insert();
+    QGateWithOrgDto qualityGate1 = qualityGateDbTester.insertQualityGate(organization);
+    QGateWithOrgDto qualityGate2 = qualityGateDbTester.insertQualityGate(organization);
+
+    underTest.deleteByUuids(dbSession, asList(qualityGate1.getUuid(), qualityGate2.getUuid()));
+    dbSession.commit();
+
+    assertThat(db.countRowsOfTable(dbSession, "quality_gates")).isZero();
+    assertThat(db.countRowsOfTable(dbSession, "org_quality_gates")).isZero();
+  }
+
+  @Test
+  public void delete_by_uuids_does_nothing_on_empty_list() {
+    underTest.deleteByUuids(dbSession, Collections.emptyList());
+    dbSession.commit();
+
+    assertThat(db.countRowsOfTable(dbSession, "quality_gates")).isZero();
+  }
+
   @Test
   public void update() {
     OrganizationDto organization = db.organizations().insert();
index f3c4f59644632baabc7eb7a18137a19205697e00..6a50ee5ef122709951ff4bbc1ef4e977cc791eb5 100644 (file)
@@ -24,10 +24,12 @@ import java.util.List;
 import org.sonar.api.server.ws.Request;
 import org.sonar.api.server.ws.Response;
 import org.sonar.api.server.ws.WebService;
+import org.sonar.core.util.stream.MoreCollectors;
 import org.sonar.db.DbClient;
 import org.sonar.db.DbSession;
 import org.sonar.db.component.ComponentDto;
 import org.sonar.db.organization.OrganizationDto;
+import org.sonar.db.qualitygate.QualityGateDto;
 import org.sonar.db.qualityprofile.QProfileDto;
 import org.sonar.server.component.ComponentCleanerService;
 import org.sonar.server.organization.DefaultOrganization;
@@ -93,11 +95,7 @@ public class DeleteAction implements OrganizationsWsAction {
       String key = request.mandatoryParam(PARAM_ORGANIZATION);
       preventDeletionOfDefaultOrganization(key, defaultOrganizationProvider.get());
 
-      OrganizationDto organization = checkFoundWithOptional(
-        dbClient.organizationDao().selectByKey(dbSession, key),
-        "Organization with key '%s' not found",
-        key);
-
+      OrganizationDto organization = checkFoundWithOptional(dbClient.organizationDao().selectByKey(dbSession, key), "Organization with key '%s' not found", key);
       if (organization.isGuarded()) {
         userSession.checkIsSystemAdministrator();
       } else {
@@ -108,6 +106,7 @@ public class DeleteAction implements OrganizationsWsAction {
       deletePermissions(dbSession, organization);
       deleteGroups(dbSession, organization);
       deleteQualityProfiles(dbSession, organization);
+      deleteQualityGates(dbSession, organization);
       deleteOrganization(dbSession, organization);
 
       response.noContent();
@@ -138,6 +137,11 @@ public class DeleteAction implements OrganizationsWsAction {
     qProfileFactory.delete(dbSession, profiles);
   }
 
+  private void deleteQualityGates(DbSession dbSession, OrganizationDto organization) {
+    Collection<QualityGateDto> qualityGates = dbClient.qualityGateDao().selectAll(dbSession, organization);
+    dbClient.qualityGateDao().deleteByUuids(dbSession, qualityGates.stream().map(QualityGateDto::getUuid).collect(MoreCollectors.toList()));
+  }
+
   private void deleteOrganization(DbSession dbSession, OrganizationDto organization) {
     Collection<String> logins = dbClient.organizationMemberDao().selectLoginsByOrganizationUuid(dbSession, organization.getUuid());
     dbClient.organizationMemberDao().deleteByOrganizationUuid(dbSession, organization.getUuid());
index 95b37cc554da9b0a43cd97b5d3db8288ef1ae2de..f6db373cd88ab891b5db515371b4ab3212933214 100644 (file)
@@ -35,6 +35,7 @@ import org.sonar.db.component.ComponentTesting;
 import org.sonar.db.component.ResourceTypesRule;
 import org.sonar.db.organization.OrganizationDto;
 import org.sonar.db.permission.template.PermissionTemplateDto;
+import org.sonar.db.qualitygate.QGateWithOrgDto;
 import org.sonar.db.qualityprofile.QProfileDto;
 import org.sonar.db.user.GroupDto;
 import org.sonar.db.user.UserDto;
@@ -348,6 +349,25 @@ public class DeleteActionTest {
       .containsOnly(profileInOtherOrg.getKee());
   }
 
+  @Test
+  public void delete_quality_gates() {
+    OrganizationDto org = db.organizations().insert();
+    OrganizationDto otherOrg = db.organizations().insert();
+    QGateWithOrgDto qualityGate = db.qualityGates().insertQualityGate(org);
+    QGateWithOrgDto qualityGateInOtherOrg = db.qualityGates().insertQualityGate(otherOrg);
+    logInAsAdministrator(org);
+
+    sendRequest(org);
+
+    verifyOrganizationDoesNotExist(org);
+    assertThat(db.select("select uuid as \"uuid\" from quality_gates"))
+      .extracting(row -> (String) row.get("uuid"))
+      .containsOnly(qualityGateInOtherOrg.getUuid());
+    assertThat(db.select("select organization_uuid as \"organizationUuid\" from org_quality_gates"))
+      .extracting(row -> (String) row.get("organizationUuid"))
+      .containsOnly(otherOrg.getUuid());
+  }
+
   private void verifyOrganizationDoesNotExist(OrganizationDto organization) {
     assertThat(db.getDbClient().organizationDao().selectByKey(session, organization.getKey())).isEmpty();
   }