From ffb6ac23bee90134b99a02959c1eabb986d7d998 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Beno=C3=AEt=20Gianinetti?= Date: Fri, 1 Feb 2019 13:57:05 +0100 Subject: [PATCH] SONARCLOUD-379 Add ORG_ALM_BINDING#MEMBERS_SYNC column --- .../org/sonar/db/version/schema-h2.ddl | 1 + .../db/alm/OrganizationAlmBindingDao.java | 7 ++- .../db/alm/OrganizationAlmBindingDto.java | 13 +++++ .../db/alm/OrganizationAlmBindingMapper.java | 2 + .../db/alm/OrganizationAlmBindingMapper.xml | 9 +++ .../db/alm/OrganizationAlmBindingDaoTest.java | 17 +++++- .../AddMembersSyncFlagToOrgAlmBinding.java | 44 +++++++++++++++ .../db/migration/version/v77/DbVersion77.java | 3 +- ...AddMembersSyncFlagToOrgAlmBindingTest.java | 55 +++++++++++++++++++ .../version/v77/DbVersion77Test.java | 2 +- .../org_alm_binding.sql | 12 ++++ 11 files changed, 159 insertions(+), 6 deletions(-) create mode 100644 server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v77/AddMembersSyncFlagToOrgAlmBinding.java create mode 100644 server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v77/AddMembersSyncFlagToOrgAlmBindingTest.java create mode 100644 server/sonar-db-migration/src/test/resources/org/sonar/server/platform/db/migration/version/v77/AddMembersSyncFlagToOrgAlmBindingTest/org_alm_binding.sql diff --git a/server/sonar-db-core/src/main/resources/org/sonar/db/version/schema-h2.ddl b/server/sonar-db-core/src/main/resources/org/sonar/db/version/schema-h2.ddl index 785fc278f5c..34decebab6b 100644 --- a/server/sonar-db-core/src/main/resources/org/sonar/db/version/schema-h2.ddl +++ b/server/sonar-db-core/src/main/resources/org/sonar/db/version/schema-h2.ddl @@ -935,6 +935,7 @@ CREATE TABLE "ORGANIZATION_ALM_BINDINGS" ( "ALM_ID" VARCHAR(40) NOT NULL, "URL" VARCHAR(2000) NOT NULL, "USER_UUID" VARCHAR(255) NOT NULL, + "MEMBERS_SYNC_ENABLED" BOOLEAN, "CREATED_AT" BIGINT NOT NULL, CONSTRAINT "PK_ORGANIZATION_ALM_BINDINGS" PRIMARY KEY ("UUID") ); diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/alm/OrganizationAlmBindingDao.java b/server/sonar-db-dao/src/main/java/org/sonar/db/alm/OrganizationAlmBindingDao.java index dcc495136d2..10c91dd5099 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/alm/OrganizationAlmBindingDao.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/alm/OrganizationAlmBindingDao.java @@ -59,7 +59,7 @@ public class OrganizationAlmBindingDao implements Dao { return ofNullable(getMapper(dbSession).selectByInstallationUuid(almAppInstall.getUuid())); } - public void insert(DbSession dbSession, OrganizationDto organization, AlmAppInstallDto almAppInstall, String url, String userUuid) { + public void insert(DbSession dbSession, OrganizationDto organization, AlmAppInstallDto almAppInstall, String url, String userUuid, boolean membersSync) { long now = system2.now(); getMapper(dbSession).insert(new OrganizationAlmBindingDto() .setUuid(uuidFactory.create()) @@ -68,6 +68,7 @@ public class OrganizationAlmBindingDao implements Dao { .setAlmId(almAppInstall.getAlm()) .setUrl(url) .setUserUuid(userUuid) + .setMembersSyncEnabled(membersSync) .setCreatedAt(now)); } @@ -79,6 +80,10 @@ public class OrganizationAlmBindingDao implements Dao { getMapper(dbSession).deleteByAlmAppInstallUuid(almAppInstall.getUuid()); } + public void updateMembersSync(DbSession dbSession, OrganizationAlmBindingDto orgAlmBinding, boolean enabled) { + getMapper(dbSession).updateMembersSync(orgAlmBinding.getUuid(), enabled); + } + private static OrganizationAlmBindingMapper getMapper(DbSession dbSession) { return dbSession.getMapper(OrganizationAlmBindingMapper.class); } diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/alm/OrganizationAlmBindingDto.java b/server/sonar-db-dao/src/main/java/org/sonar/db/alm/OrganizationAlmBindingDto.java index b8dbf5137d2..6831e87cb85 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/alm/OrganizationAlmBindingDto.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/alm/OrganizationAlmBindingDto.java @@ -52,6 +52,10 @@ public class OrganizationAlmBindingDto { * The UUID of the user who has created the link between the organization and the ALM installation. Can't be null. Max size is 255. */ private String userUuid; + /** + * If the members of the org are automatically sync with the ALM org + */ + private boolean membersSyncEnabled; /** * Technical creation date */ @@ -114,6 +118,15 @@ public class OrganizationAlmBindingDto { return this; } + public boolean isMembersSyncEnable() { + return membersSyncEnabled; + } + + public OrganizationAlmBindingDto setMembersSyncEnabled(boolean membersSyncEnabled) { + this.membersSyncEnabled = membersSyncEnabled; + return this; + } + public long getCreatedAt() { return createdAt; } diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/alm/OrganizationAlmBindingMapper.java b/server/sonar-db-dao/src/main/java/org/sonar/db/alm/OrganizationAlmBindingMapper.java index 62961d2cbf1..d59c5bfd0ce 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/alm/OrganizationAlmBindingMapper.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/alm/OrganizationAlmBindingMapper.java @@ -39,4 +39,6 @@ public interface OrganizationAlmBindingMapper { void deleteByOrganizationUuid(@Param("organizationUuid") String organizationUuid); void deleteByAlmAppInstallUuid(@Param("almAppInstallUuid") String almAppInstallUuid); + + void updateMembersSync(@Param("uuid") String uuid, @Param("membersSyncEnabled") boolean membersSyncEnabled); } diff --git a/server/sonar-db-dao/src/main/resources/org/sonar/db/alm/OrganizationAlmBindingMapper.xml b/server/sonar-db-dao/src/main/resources/org/sonar/db/alm/OrganizationAlmBindingMapper.xml index 1f636ee415b..e55533434ea 100644 --- a/server/sonar-db-dao/src/main/resources/org/sonar/db/alm/OrganizationAlmBindingMapper.xml +++ b/server/sonar-db-dao/src/main/resources/org/sonar/db/alm/OrganizationAlmBindingMapper.xml @@ -10,6 +10,7 @@ alm_id as rawAlmId, url, user_uuid as userUuid, + members_sync_enabled as membersSyncEnabled, created_at as createdAt @@ -52,6 +53,7 @@ alm_id, url, user_uuid, + members_sync_enabled, created_at ) VALUES ( @@ -61,6 +63,7 @@ #{dto.rawAlmId, jdbcType=VARCHAR}, #{dto.url, jdbcType=VARCHAR}, #{dto.userUuid, jdbcType=VARCHAR}, + #{dto.membersSyncEnabled, jdbcType=BOOLEAN}, #{dto.createdAt, jdbcType=BIGINT} ) @@ -73,4 +76,10 @@ DELETE FROM organization_alm_bindings WHERE alm_app_install_uuid = #{almAppInstallUuid, jdbcType=VARCHAR} + + update organization_alm_bindings set + members_sync_enabled = #{membersSyncEnabled, jdbcType=BOOLEAN} + where + uuid = #{uuid, jdbcType=VARCHAR} + diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/alm/OrganizationAlmBindingDaoTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/alm/OrganizationAlmBindingDaoTest.java index b1d38519d97..b72e7a6e12c 100644 --- a/server/sonar-db-dao/src/test/java/org/sonar/db/alm/OrganizationAlmBindingDaoTest.java +++ b/server/sonar-db-dao/src/test/java/org/sonar/db/alm/OrganizationAlmBindingDaoTest.java @@ -152,12 +152,12 @@ public class OrganizationAlmBindingDaoTest { UserDto user = db.users().insertUser(); AlmAppInstallDto almAppInstall = db.alm().insertAlmAppInstall(); - underTest.insert(db.getSession(), organization, almAppInstall, "http://myorg.com", user.getUuid()); + underTest.insert(db.getSession(), organization, almAppInstall, "http://myorg.com", user.getUuid(), true); assertThat(db.selectFirst(db.getSession(), "select" + " uuid as \"uuid\", organization_uuid as \"organizationUuid\", alm_app_install_uuid as \"almAppInstallUuid\", url as \"url\", alm_id as \"almId\"," + - " user_uuid as \"userUuid\", created_at as \"createdAt\"" + + " user_uuid as \"userUuid\", members_sync_enabled as \"membersSync\", created_at as \"createdAt\"" + " from organization_alm_bindings" + " where organization_uuid='" + organization.getUuid() + "'")) .contains( @@ -167,7 +167,8 @@ public class OrganizationAlmBindingDaoTest { entry("almId", "github"), entry("url", "http://myorg.com"), entry("userUuid", user.getUuid()), - entry("createdAt", NOW)); + entry("createdAt", NOW), + entry("membersSync", true)); } @Test @@ -200,4 +201,14 @@ public class OrganizationAlmBindingDaoTest { assertThat(underTest.selectByOrganization(db.getSession(), otherOrganization)).isPresent(); } + @Test + public void updateMembersSync() { + OrganizationDto organization = db.organizations().insert(); + AlmAppInstallDto almAppInstall = db.alm().insertAlmAppInstall(); + OrganizationAlmBindingDto orgAlmBindingDto = db.alm().insertOrganizationAlmBinding(organization, almAppInstall); + + underTest.updateMembersSync(db.getSession(), orgAlmBindingDto, false); + + assertThat(db.getDbClient().organizationAlmBindingDao().selectByOrganization(db.getSession(), organization).get().isMembersSyncEnable()).isFalse(); + } } diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v77/AddMembersSyncFlagToOrgAlmBinding.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v77/AddMembersSyncFlagToOrgAlmBinding.java new file mode 100644 index 00000000000..babef353f17 --- /dev/null +++ b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v77/AddMembersSyncFlagToOrgAlmBinding.java @@ -0,0 +1,44 @@ +/* + * SonarQube + * Copyright (C) 2009-2019 SonarSource SA + * mailto:info AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +package org.sonar.server.platform.db.migration.version.v77; + +import java.sql.SQLException; +import org.sonar.db.Database; +import org.sonar.server.platform.db.migration.def.BooleanColumnDef; +import org.sonar.server.platform.db.migration.sql.AddColumnsBuilder; +import org.sonar.server.platform.db.migration.step.DdlChange; + +public class AddMembersSyncFlagToOrgAlmBinding extends DdlChange { + + public AddMembersSyncFlagToOrgAlmBinding(Database db) { + super(db); + } + + @Override + public void execute(DdlChange.Context context) throws SQLException { + context.execute(new AddColumnsBuilder(getDialect(), "organization_alm_bindings") + .addColumn(BooleanColumnDef.newBooleanColumnDefBuilder() + .setColumnName("members_sync_enabled") + .setIsNullable(true) + .build()) + .build()); + } + +} diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v77/DbVersion77.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v77/DbVersion77.java index aa7c48e35d6..d7a09e032ad 100644 --- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v77/DbVersion77.java +++ b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v77/DbVersion77.java @@ -33,6 +33,7 @@ public class DbVersion77 implements DbVersion { .add(2603, "Add column LAST_USED_DATE to USER_TOKENS table", AddLastConnectionDateToUserTokens.class) .add(2604, "Add baseline columns in PROJECT_BRANCHES", AddManualBaselineToProjectBranches.class) .add(2605, "Add SNAPSHOTS.PROJECT_VERSION", AddProjectVersionToSnapshot.class) - .add(2606, "Drop DATA_TYPE column from FILE_SOURCES table", DropDataTypeFromFileSources.class); + .add(2606, "Drop DATA_TYPE column from FILE_SOURCES table", DropDataTypeFromFileSources.class) + .add(2607, "Add MEMBERS_SYNC_ENABLED column to ORGANIZATIONS_ALM_BINDING table", AddMembersSyncFlagToOrgAlmBinding.class); } } diff --git a/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v77/AddMembersSyncFlagToOrgAlmBindingTest.java b/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v77/AddMembersSyncFlagToOrgAlmBindingTest.java new file mode 100644 index 00000000000..2bcbbaf25c6 --- /dev/null +++ b/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v77/AddMembersSyncFlagToOrgAlmBindingTest.java @@ -0,0 +1,55 @@ +/* + * SonarQube + * Copyright (C) 2009-2019 SonarSource SA + * mailto:info AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +package org.sonar.server.platform.db.migration.version.v77; + +import java.sql.SQLException; +import java.sql.Types; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; +import org.sonar.db.CoreDbTester; + +public class AddMembersSyncFlagToOrgAlmBindingTest { + + private static final String TABLE = "organization_alm_bindings"; + + @Rule + public final CoreDbTester db = CoreDbTester.createForSchema(AddMembersSyncFlagToOrgAlmBindingTest.class, "org_alm_binding.sql"); + @Rule + public ExpectedException expectedException = ExpectedException.none(); + + private AddMembersSyncFlagToOrgAlmBinding underTest = new AddMembersSyncFlagToOrgAlmBinding(db.database()); + + @Test + public void add_column() throws SQLException { + underTest.execute(); + + db.assertColumnDefinition(TABLE, "members_sync_enabled", Types.BOOLEAN, null); + } + + @Test + public void migration_is_not_re_entrant() throws SQLException { + underTest.execute(); + + expectedException.expect(IllegalStateException.class); + + underTest.execute(); + } +} diff --git a/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v77/DbVersion77Test.java b/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v77/DbVersion77Test.java index 559d2bc0ae8..57b6c229209 100644 --- a/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v77/DbVersion77Test.java +++ b/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v77/DbVersion77Test.java @@ -36,7 +36,7 @@ public class DbVersion77Test { @Test public void verify_migration_count() { - verifyMigrationCount(underTest, 7); + verifyMigrationCount(underTest, 8); } } diff --git a/server/sonar-db-migration/src/test/resources/org/sonar/server/platform/db/migration/version/v77/AddMembersSyncFlagToOrgAlmBindingTest/org_alm_binding.sql b/server/sonar-db-migration/src/test/resources/org/sonar/server/platform/db/migration/version/v77/AddMembersSyncFlagToOrgAlmBindingTest/org_alm_binding.sql new file mode 100644 index 00000000000..8b0128ce331 --- /dev/null +++ b/server/sonar-db-migration/src/test/resources/org/sonar/server/platform/db/migration/version/v77/AddMembersSyncFlagToOrgAlmBindingTest/org_alm_binding.sql @@ -0,0 +1,12 @@ +CREATE TABLE "ORGANIZATION_ALM_BINDINGS" ( + "UUID" VARCHAR(40) NOT NULL, + "ORGANIZATION_UUID" VARCHAR(40) NOT NULL, + "ALM_APP_INSTALL_UUID" VARCHAR(40) NOT NULL, + "ALM_ID" VARCHAR(40) NOT NULL, + "URL" VARCHAR(2000) NOT NULL, + "USER_UUID" VARCHAR(255) NOT NULL, + "CREATED_AT" BIGINT NOT NULL, + CONSTRAINT "PK_ORGANIZATION_ALM_BINDINGS" PRIMARY KEY ("UUID") +); +CREATE UNIQUE INDEX "ORG_ALM_BINDINGS_ORG" ON "ORGANIZATION_ALM_BINDINGS" ("ORGANIZATION_UUID"); +CREATE UNIQUE INDEX "ORG_ALM_BINDINGS_INSTALL" ON "ORGANIZATION_ALM_BINDINGS" ("ALM_APP_INSTALL_UUID"); -- 2.39.5