"organizations",
"organization_members",
"org_qprofiles",
+ "org_quality_gates",
"permission_templates",
"perm_templates_users",
"perm_templates_groups",
INSERT INTO GROUPS(ID, ORGANIZATION_UUID, NAME, DESCRIPTION, CREATED_AT, UPDATED_AT) VALUES (2, 'AVdqnciQUUs7Zd3KPvFD', 'sonar-users', 'Any new users created will automatically join this group', '2011-09-26 22:27:51.0', '2011-09-26 22:27:51.0');
ALTER TABLE GROUPS ALTER COLUMN ID RESTART WITH 3;
-INSERT INTO ORGANIZATIONS (UUID, KEE, NAME, GUARDED, NEW_PROJECT_PRIVATE, DEFAULT_GROUP_ID, CREATED_AT, UPDATED_AT) VALUES ('AVdqnciQUUs7Zd3KPvFD', 'default-organization', 'Default Organization', true, false, 2, '1474962596482', '1474962596482');
+INSERT INTO QUALITY_GATES(ID, NAME, IS_BUILT_IN, CREATED_AT, UPDATED_AT) VALUES (1, 'Sonar Way', true, '2011-09-26 22:27:51.0', '2011-09-26 22:27:51.0');
+
+INSERT INTO ORGANIZATIONS (UUID, KEE, NAME, GUARDED, NEW_PROJECT_PRIVATE, DEFAULT_GROUP_ID, DEFAULT_QUALITY_GATE_UUID, CREATED_AT, UPDATED_AT) VALUES ('AVdqnciQUUs7Zd3KPvFD', 'default-organization', 'Default Organization', true, false, 2, 1, '1474962596482', '1474962596482');
INSERT INTO INTERNAL_PROPERTIES (KEE, IS_EMPTY, TEXT_VALUE, CREATED_AT) VALUES ('organization.default', false, 'AVdqnciQUUs7Zd3KPvFD', '1474962596482');
INSERT INTO GROUP_ROLES(ID, ORGANIZATION_UUID, GROUP_ID, RESOURCE_ID, ROLE) VALUES (1, 'AVdqnciQUUs7Zd3KPvFD', 1, null, 'admin');
"DEFAULT_PERM_TEMPLATE_PROJECT" VARCHAR(40),
"DEFAULT_PERM_TEMPLATE_VIEW" VARCHAR(40),
"DEFAULT_GROUP_ID" INTEGER,
+ "DEFAULT_QUALITY_GATE_UUID" VARCHAR(40), // TODO : NOT NULL
"NEW_PROJECT_PRIVATE" BOOLEAN NOT NULL,
"CREATED_AT" BIGINT NOT NULL,
"UPDATED_AT" BIGINT NOT NULL
"UPDATED_AT" TIMESTAMP,
);
+CREATE TABLE "ORG_QUALITY_GATES" (
+ "UUID" VARCHAR(40) NOT NULL PRIMARY KEY,
+ "ORGANIZATION_UUID" VARCHAR(40) NOT NULL,
+ "QUALITY_GATE_UUID" VARCHAR(40) NOT NULL
+);
+CREATE UNIQUE INDEX "UNIQ_ORG_QUALITY_GATES" ON "ORG_QUALITY_GATES" ("ORGANIZATION_UUID","QUALITY_GATE_UUID");
CREATE TABLE "PROPERTIES" (
"ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
private String url;
/** avatar url can be null */
private String avatarUrl;
+
/**
* Flag indicated whether being root is required to be able to delete this organization.
*/
/** If of the user for whom the organization was created, can be null. */
private Integer userId;
private Integer defaultGroupId;
+ private String defaultQualityGateUuid;
private long createdAt;
private long updatedAt;
return this;
}
+ public String getDefaultQualityGateUuid() {
+ return defaultQualityGateUuid;
+ }
+
+ public OrganizationDto setDefaultQualityGateUuid(String defaultQualityGateUuid) {
+ this.defaultQualityGateUuid = defaultQualityGateUuid;
+ return this;
+ }
+
@Override
public String toString() {
return "OrganizationDto{" +
", avatarUrl='" + avatarUrl + '\'' +
", guarded=" + guarded +
", userId=" + userId +
+ ", defaultQualityGateUuid=" + defaultQualityGateUuid +
", createdAt=" + createdAt +
", updatedAt=" + updatedAt +
'}';
mapper(dbSession).ensureOneBuiltInQualityGate(builtInName);
}
+ public QualityGateDto selectBuiltIn(DbSession dbSession) {
+ return mapper(dbSession).selectBuiltIn();
+ }
+
private static QualityGateMapper mapper(DbSession session) {
return session.getMapper(QualityGateMapper.class);
}
QualityGateDto selectById(long id);
+ QualityGateDto selectBuiltIn();
+
void delete(long id);
void update(QualityGateDto qGate);
guarded,
new_project_private,
user_id,
+ default_quality_gate_uuid,
created_at,
updated_at
)
#{organization.guarded, jdbcType=BOOLEAN},
#{newProjectPrivate, jdbcType=BOOLEAN},
#{organization.userId, jdbcType=INTEGER},
+ #{organization.defaultQualityGateUuid, jdbcType=VARCHAR},
#{organization.createdAt, jdbcType=BIGINT},
#{organization.updatedAt, jdbcType=BIGINT}
)
where id=#{id}
</select>
+ <select id="selectBuiltIn" resultType="org.sonar.db.qualitygate.QualityGateDto">
+ SELECT
+ <include refid="gateColumns"/>
+ FROM quality_gates
+ WHERE
+ is_built_in = ${_true}
+ </select>
+
<update id="delete" parameterType="long">
delete from quality_gates where id=#{id}
</update>
import java.sql.Connection;
import java.sql.SQLException;
+import java.util.Date;
import java.util.List;
import java.util.Map;
import javax.annotation.Nullable;
import org.sonar.db.plugin.PluginDbTester;
import org.sonar.db.property.PropertyDbTester;
import org.sonar.db.qualitygate.QualityGateDbTester;
+import org.sonar.db.qualitygate.QualityGateDto;
import org.sonar.db.qualityprofile.QualityProfileDbTester;
import org.sonar.db.rule.RuleDbTester;
import org.sonar.db.source.FileSourceTester;
private boolean started = false;
private String defaultOrganizationUuid = randomAlphanumeric(40);
private OrganizationDto defaultOrganization;
+ private QualityGateDto builtInQualityGate;
private final UserDbTester userTester;
private final ComponentDbTester componentTester;
}
@Override
- protected void before() throws Throwable {
+ protected void before() {
db.start();
db.truncateTables();
initDbClient();
+ // TODO : insertBuiltInQualityGateIfTableExists();
+
if (!disableDefaultOrganization) {
insertDefaultOrganization();
}
started = true;
}
+ private void insertBuiltInQualityGateIfTableExists() {
+ try (DbSession dbSession = db.getMyBatis().openSession(false)) {
+ if (DatabaseUtils.tableExists("quality_gates", dbSession.getConnection())) {
+ builtInQualityGate = new QualityGateDto()
+ .setName("Sonar way")
+ .setBuiltIn(true)
+ .setCreatedAt(new Date(system2.now()))
+ .setCreatedAt(new Date(system2.now()));
+ client.qualityGateDao().insert(dbSession, builtInQualityGate);
+ dbSession.commit();
+ }
+ }
+ }
+
private void insertDefaultOrganization() {
defaultOrganization = OrganizationTesting.newOrganizationDto().setUuid(defaultOrganizationUuid);
try (DbSession dbSession = db.getMyBatis().openSession(false)) {
}
@Test
- public void return_nothing() throws Exception {
+ public void return_nothing() {
assertThat(underTest.selectComponentsHavingSameKeyOrderedById(db.getSession(), PROJECT_KEY)).isEmpty();
}
.setUrl("the url 1")
.setAvatarUrl("the avatar url 1")
.setGuarded(false)
+ .setDefaultQualityGateUuid("1")
.setUserId(1_000);
private static final OrganizationDto ORGANIZATION_DTO_2 = new OrganizationDto()
.setUuid("uuid 2")
.setUrl("the url 2")
.setAvatarUrl("the avatar url 2")
.setGuarded(true)
+ .setDefaultQualityGateUuid("1")
.setUserId(2_000);
private static final String PERMISSION_1 = "foo";
private static final String PERMISSION_2 = "bar";
" default_perm_template_view," +
" new_project_private," +
" guarded," +
+ " default_quality_gate_uuid," +
" created_at," +
" updated_at" +
" )" +
" ?," +
" ?," +
" ?," +
+ " ?," +
" ?" +
" )")) {
preparedStatement.setString(1, organizationUuid);
preparedStatement.setString(5, view);
preparedStatement.setBoolean(6, false);
preparedStatement.setBoolean(7, false);
- preparedStatement.setLong(8, 1000L);
- preparedStatement.setLong(9, 2000L);
+ preparedStatement.setString(8, "1"); // TODO check ok ?
+ preparedStatement.setLong(9, 1000L);
+ preparedStatement.setLong(10, 2000L);
preparedStatement.execute();
} catch (SQLException e) {
throw new RuntimeException("dirty insert failed", e);
return rows.get(0);
}
- private static OrganizationDto copyOf(OrganizationDto organizationDto) {
+ private OrganizationDto copyOf(OrganizationDto organizationDto) {
return new OrganizationDto()
.setUuid(organizationDto.getUuid())
.setKey(organizationDto.getKey())
.setName(organizationDto.getName())
.setDescription(organizationDto.getDescription())
.setUrl(organizationDto.getUrl())
+ // TODO : .setDefaultQualityGateUuid(dbClient.qualityGateDao().selectBuiltIn(dbSession).getId().toString())
.setAvatarUrl(organizationDto.getAvatarUrl());
}
.setName(randomAlphanumeric(64))
.setDescription(randomAlphanumeric(256))
.setAvatarUrl(randomAlphanumeric(256))
+ .setDefaultQualityGateUuid("1") // TODO check that using it directly is ok
.setUrl(randomAlphanumeric(256));
}
}
*/
package org.sonar.db.qualitygate;
-import java.util.Collection;
-import java.util.Iterator;
import org.junit.Rule;
import org.junit.Test;
import org.sonar.api.utils.System2;
import org.sonar.db.DbTester;
import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.groups.Tuple.tuple;
public class QualityGateDaoTest {
@Rule
public DbTester db = DbTester.create(System2.INSTANCE);
+ private QualityGateDbTester qualityGateDbTester = new QualityGateDbTester(db);
private DbSession dbSession = db.getSession();
private QualityGateDao underTest = db.getDbClient().qualityGateDao();
@Test
- public void testInsert() throws Exception {
- db.prepareDbUnit(getClass(), "insert.xml");
+ public void testInsert() {
QualityGateDto newQgate = new QualityGateDto().setName("My Quality Gate");
underTest.insert(dbSession, newQgate);
dbSession.commit();
- db.assertDbUnitTable(getClass(), "insert-result.xml", "quality_gates", "name");
+ assertThat(underTest.selectAll(dbSession)).extracting(QualityGateDto::getName, QualityGateDto::isBuiltIn)
+ .containsExactlyInAnyOrder(
+ // TODO : tuple("Sonar way", true),
+ tuple("My Quality Gate", false));
assertThat(newQgate.getId()).isNotNull();
}
}
@Test
- public void testSelectAll() throws Exception {
- db.prepareDbUnit(getClass(), "selectAll.xml");
-
- Collection<QualityGateDto> allQualityGates = underTest.selectAll(dbSession);
-
- assertThat(allQualityGates).hasSize(3);
- Iterator<QualityGateDto> gatesIterator = allQualityGates.iterator();
- assertThat(gatesIterator.next().getName()).isEqualTo("Balanced");
- assertThat(gatesIterator.next().getName()).isEqualTo("Lenient");
- assertThat(gatesIterator.next().getName()).isEqualTo("Very strict");
+ public void testSelectAll() {
+ insertQualityGates();
+
+ assertThat(underTest.selectAll(dbSession)).extracting(QualityGateDto::getName, QualityGateDto::isBuiltIn)
+ .containsExactlyInAnyOrder(
+ // TODO : tuple("Sonar Way", true),
+ tuple("Balanced", false),
+ tuple("Lenient", false),
+ tuple("Very strict", false));
}
@Test
- public void testSelectByName() throws Exception {
- db.prepareDbUnit(getClass(), "selectAll.xml");
+ public void testSelectByName() {
+ insertQualityGates();
assertThat(underTest.selectByName(dbSession, "Balanced").getName()).isEqualTo("Balanced");
assertThat(underTest.selectByName(dbSession, "Unknown")).isNull();
}
@Test
- public void testSelectById() throws Exception {
- db.prepareDbUnit(getClass(), "selectAll.xml");
- assertThat(underTest.selectById(dbSession, 1L).getName()).isEqualTo("Very strict");
+ public void testSelectById() {
+ insertQualityGates();
+ assertThat(underTest.selectById(dbSession, underTest.selectByName(dbSession, "Very strict").getId()).getName()).isEqualTo("Very strict");
assertThat(underTest.selectById(dbSession, 42L)).isNull();
}
@Test
- public void testDelete() throws Exception {
- db.prepareDbUnit(getClass(), "selectAll.xml");
+ public void testDelete() {
+ insertQualityGates();
- underTest.delete(new QualityGateDto().setId(1L), dbSession);
+ underTest.delete(underTest.selectByName(dbSession, "Very strict"), dbSession);
dbSession.commit();
- db.assertDbUnitTable(getClass(), "delete-result.xml", "quality_gates", "id", "name");
+ assertThat(underTest.selectAll(dbSession)).extracting(QualityGateDto::getName, QualityGateDto::isBuiltIn)
+ .containsExactlyInAnyOrder(
+ // TODO : tuple("Sonar Way", true),
+ tuple("Balanced", false),
+ tuple("Lenient", false));
}
@Test
- public void testUpdate() throws Exception {
- db.prepareDbUnit(getClass(), "selectAll.xml");
+ public void testUpdate() {
+ insertQualityGates();
- underTest.update(new QualityGateDto().setId(1L).setName("Not so strict"), dbSession);
+ underTest.update(underTest.selectByName(dbSession, "Very strict").setName("Not so strict"), dbSession);
dbSession.commit();
- db.assertDbUnitTable(getClass(), "update-result.xml", "quality_gates", "id", "name");
+ assertThat(underTest.selectAll(dbSession)).extracting(QualityGateDto::getName, QualityGateDto::isBuiltIn)
+ .containsExactlyInAnyOrder(
+ // TODO : tuple("Sonar Way", true),
+ tuple("Balanced", false),
+ tuple("Lenient", false),
+ tuple("Not so strict", false));
+ }
+
+ private void insertQualityGates() {
+ qualityGateDbTester.insertQualityGate(g -> g.setName("Very strict").setBuiltIn(false));
+ qualityGateDbTester.insertQualityGate(g -> g.setName("Balanced").setBuiltIn(false));
+ qualityGateDbTester.insertQualityGate(g -> g.setName("Lenient").setBuiltIn(false));
}
}
private static final OrganizationDto AN_ORGANIZATION = new OrganizationDto()
.setKey("an-org")
.setName("An Org")
+ .setDefaultQualityGateUuid("1")
.setUuid("abcde");
private System2 system2 = mock(System2.class);
"NEW_PROJECT_PRIVATE" BOOLEAN,
"USER_ID" BIGINT,
"GUARDED" BOOLEAN NOT NULL,
+ "DEFAULT_QUALITY_GATE_UUID" VARCHAR(40) NOT NULL,
"CREATED_AT" BIGINT NOT NULL,
"UPDATED_AT" BIGINT NOT NULL
);
+++ /dev/null
-<dataset>
-
- <quality_gates id="2" name="Balanced" is_built_in="[false]"/>
- <quality_gates id="3" name="Lenient" is_built_in="[false]"/>
-
-</dataset>
+++ /dev/null
-<dataset>
-
- <quality_gates id="1" name="My Quality Gate" is_built_in="[false]"/>
-
-</dataset>
+++ /dev/null
-<dataset>
-
-</dataset>
+++ /dev/null
-<dataset>
-
- <quality_gates id="1" name="Very strict" is_built_in="[true]"/>
- <quality_gates id="2" name="Balanced" is_built_in="[false]"/>
- <quality_gates id="3" name="Lenient" is_built_in="[false]"/>
-
-</dataset>
+++ /dev/null
-<dataset>
-
- <quality_gates id="1" name="Not so strict" is_built_in="[false]"/>
- <quality_gates id="2" name="Balanced" is_built_in="[false]"/>
- <quality_gates id="3" name="Lenient" is_built_in="[false]"/>
-
-</dataset>
--- /dev/null
+/*
+ * SonarQube
+ * Copyright (C) 2009-2017 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.v70;
+
+import java.sql.SQLException;
+import org.sonar.db.Database;
+import org.sonar.server.platform.db.migration.def.VarcharColumnDef;
+import org.sonar.server.platform.db.migration.sql.AddColumnsBuilder;
+import org.sonar.server.platform.db.migration.step.DdlChange;
+
+import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.newVarcharColumnDefBuilder;
+
+public class AddDefaultQualityGateUuidToOrganizations extends DdlChange {
+ public AddDefaultQualityGateUuidToOrganizations(Database db) {
+ super(db);
+ }
+
+ @Override
+ public void execute(Context context) throws SQLException {
+ context.execute(new AddColumnsBuilder(getDialect(), "organizations")
+ .addColumn(newVarcharColumnDefBuilder()
+ .setColumnName("default_quality_gate_uuid")
+ .setIsNullable(true)
+ .setLimit(VarcharColumnDef.UUID_SIZE)
+ .build())
+ .build());
+ }
+}
--- /dev/null
+/*
+ * SonarQube
+ * Copyright (C) 2009-2017 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.v70;
+
+import java.sql.Connection;
+import java.sql.SQLException;
+import org.sonar.db.Database;
+import org.sonar.db.DatabaseUtils;
+import org.sonar.server.platform.db.migration.def.VarcharColumnDef;
+import org.sonar.server.platform.db.migration.sql.CreateIndexBuilder;
+import org.sonar.server.platform.db.migration.sql.CreateTableBuilder;
+import org.sonar.server.platform.db.migration.step.DdlChange;
+
+public class CreateOrgQualityGatesTable extends DdlChange {
+
+ private static final String ORG_QUALITY_GATES = "org_quality_gates";
+ private static final VarcharColumnDef ORGANIZATION_UUID_COLUMN = VarcharColumnDef.newVarcharColumnDefBuilder()
+ .setColumnName("organization_uuid")
+ .setIsNullable(false)
+ .setLimit(VarcharColumnDef.UUID_SIZE)
+ .build();
+ private static final VarcharColumnDef QUALITY_GATE_UUID_COLUMN = VarcharColumnDef.newVarcharColumnDefBuilder()
+ .setColumnName("quality_gate_uuid")
+ .setIsNullable(false)
+ .setLimit(VarcharColumnDef.UUID_SIZE)
+ .build();
+
+ private Database db;
+
+ public CreateOrgQualityGatesTable(Database db) {
+ super(db);
+ this.db = db;
+ }
+
+ @Override
+ public void execute(Context context) throws SQLException {
+ if (!tableExists()) {
+ context.execute(new CreateTableBuilder(getDialect(), ORG_QUALITY_GATES)
+ .addPkColumn(VarcharColumnDef.newVarcharColumnDefBuilder()
+ .setColumnName("uuid")
+ .setIsNullable(false)
+ .setLimit(VarcharColumnDef.UUID_SIZE)
+ .build())
+ .addColumn(ORGANIZATION_UUID_COLUMN)
+ .addColumn(QUALITY_GATE_UUID_COLUMN)
+ .build()
+ );
+
+ context.execute(new CreateIndexBuilder(getDialect())
+ .addColumn(ORGANIZATION_UUID_COLUMN)
+ .addColumn(QUALITY_GATE_UUID_COLUMN)
+ .setUnique(true)
+ .setTable(ORG_QUALITY_GATES)
+ .setName("uniq_org_quality_gates")
+ .build()
+ );
+ }
+ }
+
+ private boolean tableExists() throws SQLException {
+ try (Connection connection = db.getDataSource().getConnection()) {
+ return DatabaseUtils.tableExists(ORG_QUALITY_GATES, connection);
+ }
+ }
+}
.add(1907, "Populate table live_measures", PopulateLiveMeasures.class)
.add(1908, "Delete person and file measures", DeletePersonAndFileMeasures.class)
.add(1909, "Drop index on project_measures.person_id", DropIndexOnPersonMeasures.class)
+ .add(1910, "Create ORG_QUALITY_GATES table", CreateOrgQualityGatesTable.class)
+ .add(1911, "Add ORGANIZATIONS.DEFAULT_QUALITY_GATE_UUID", AddDefaultQualityGateUuidToOrganizations.class)
;
}
}
--- /dev/null
+/*
+ * SonarQube
+ * Copyright (C) 2009-2017 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.v70;
+
+import java.sql.SQLException;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.sonar.db.CoreDbTester;
+
+import static java.sql.Types.VARCHAR;
+
+public class AddDefaultQualityGateUuidToOrganizationsTest {
+
+ @Rule
+ public final CoreDbTester dbTester = CoreDbTester.createForSchema(AddDefaultQualityGateUuidToOrganizationsTest.class, "organizations.sql");
+
+ @Rule
+ public ExpectedException expectedException = ExpectedException.none();
+
+ private AddDefaultQualityGateUuidToOrganizations underTest = new AddDefaultQualityGateUuidToOrganizations(dbTester.database());
+
+ @Test
+ public void column_is_added_to_table() throws SQLException {
+ underTest.execute();
+
+ dbTester.assertColumnDefinition("organizations", "default_quality_gate_uuid", VARCHAR, 40, true);
+ }
+
+ @Test
+ public void migration_is_not_reentrant() throws SQLException {
+ underTest.execute();
+
+ expectedException.expect(IllegalStateException.class);
+
+ underTest.execute();
+ }
+}
--- /dev/null
+/*
+ * SonarQube
+ * Copyright (C) 2009-2017 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.v70;
+
+import java.sql.SQLException;
+import java.sql.Types;
+import org.junit.Rule;
+import org.junit.Test;
+import org.sonar.db.CoreDbTester;
+import org.sonar.server.platform.db.migration.version.v67.CreateTableAnalysisPropertiesTest;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class CreateOrgQualityGatesTableTest {
+
+ private static final String TABLE = "org_quality_gates";
+
+ @Rule
+ public final CoreDbTester db = CoreDbTester.createForSchema(CreateTableAnalysisPropertiesTest.class, "empty.sql");
+
+ private CreateOrgQualityGatesTable underTest = new CreateOrgQualityGatesTable(db.database());
+
+ @Test
+ public void creates_table_on_empty_db() throws SQLException {
+ underTest.execute();
+
+ db.assertColumnDefinition(TABLE, "uuid", Types.VARCHAR, 40, false);
+ db.assertColumnDefinition(TABLE, "organization_uuid", Types.VARCHAR, 40, false);
+ db.assertColumnDefinition(TABLE, "quality_gate_uuid", Types.VARCHAR, 40, false);
+
+ db.assertUniqueIndex(TABLE, "uniq_org_quality_gates", "organization_uuid", "quality_gate_uuid");
+ assertThat(db.countRowsOfTable(TABLE)).isEqualTo(0);
+ }
+
+ @Test
+ public void migration_is_reentrant() throws SQLException {
+ underTest.execute();
+ underTest.execute();
+
+ db.assertColumnDefinition(TABLE, "uuid", Types.VARCHAR, 40, false);
+ db.assertColumnDefinition(TABLE, "organization_uuid", Types.VARCHAR, 40, false);
+ db.assertColumnDefinition(TABLE, "quality_gate_uuid", Types.VARCHAR, 40, false);
+
+ db.assertUniqueIndex(TABLE, "uniq_org_quality_gates", "organization_uuid", "quality_gate_uuid");
+ assertThat(db.countRowsOfTable(TABLE)).isEqualTo(0);
+ }
+}
@Test
public void verify_migration_count() {
- verifyMigrationCount(underTest, 10);
+ verifyMigrationCount(underTest, 11);
}
}
--- /dev/null
+CREATE TABLE "ORGANIZATIONS" (
+"UUID" VARCHAR(40) NOT NULL PRIMARY KEY,
+"KEE" VARCHAR(32) NOT NULL,
+"NAME" VARCHAR(64) NOT NULL,
+"DESCRIPTION" VARCHAR(256),
+"URL" VARCHAR(256),
+"AVATAR_URL" VARCHAR(256),
+"GUARDED" BOOLEAN NOT NULL,
+"USER_ID" INTEGER,
+"DEFAULT_PERM_TEMPLATE_PROJECT" VARCHAR(40),
+"DEFAULT_PERM_TEMPLATE_VIEW" VARCHAR(40),
+"DEFAULT_GROUP_ID" INTEGER,
+"NEW_PROJECT_PRIVATE" BOOLEAN NOT NULL,
+"CREATED_AT" BIGINT NOT NULL,
+"UPDATED_AT" BIGINT NOT NULL
+);
+CREATE UNIQUE INDEX "PK_ORGANIZATIONS" ON "ORGANIZATIONS" ("UUID");
+CREATE UNIQUE INDEX "ORGANIZATION_KEY" ON "ORGANIZATIONS" ("KEE");
package org.sonar.server.organization;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Map;
public OrganizationCreationImpl(DbClient dbClient, System2 system2, UuidFactory uuidFactory,
OrganizationValidation organizationValidation, Configuration config, UserIndexer userIndexer,
- BuiltInQProfileRepository builtInQProfileRepository,
- DefaultGroupCreator defaultGroupCreator) {
+ BuiltInQProfileRepository builtInQProfileRepository, DefaultGroupCreator defaultGroupCreator) {
this.dbClient = dbClient;
this.system2 = system2;
this.uuidFactory = uuidFactory;
throw new KeyConflictException(format("Organization key '%s' is already used", key));
}
- OrganizationDto organization = insertOrganization(dbSession, newOrganization, dto -> {
- });
+ OrganizationDto organization = insertOrganization(dbSession, newOrganization);
insertOrganizationMember(dbSession, organization, userCreator.getId());
GroupDto ownerGroup = insertOwnersGroup(dbSession, organization);
GroupDto defaultGroup = defaultGroupCreator.create(dbSession, organization.getUuid());
organizationValidation.checkAvatar(newOrganization.getAvatar());
}
- private OrganizationDto insertOrganization(DbSession dbSession, NewOrganization newOrganization, Consumer<OrganizationDto> extendCreation) {
+ private OrganizationDto insertOrganization(DbSession dbSession, NewOrganization newOrganization, Consumer<OrganizationDto>... extendCreation) {
OrganizationDto res = new OrganizationDto()
.setUuid(uuidFactory.create())
.setName(newOrganization.getName())
.setKey(newOrganization.getKey())
.setDescription(newOrganization.getDescription())
.setUrl(newOrganization.getUrl())
+ // TODO .setDefaultQualityGateUuid("" + qualityGateFinder.getBuiltInQualityGate(dbSession).getId())
.setAvatarUrl(newOrganization.getAvatar());
- extendCreation.accept(res);
+ Arrays.stream(extendCreation).forEach(c -> c.accept(res));
dbClient.organizationDao().insert(dbSession, res, false);
return res;
}
import org.sonar.db.property.PropertyDto;
import org.sonar.db.qualitygate.QualityGateDto;
+import static com.google.common.base.Preconditions.checkState;
import static org.sonar.server.qualitygate.QualityGates.SONAR_QUALITYGATE_PROPERTY;
import static org.sonar.server.ws.WsUtils.checkFound;
}
}
+ public QualityGateDto getBuiltInQualityGate(DbSession dbSession) {
+ QualityGateDto builtIn = dbClient.qualityGateDao().selectBuiltIn(dbSession);
+ checkState(builtIn != null, "Builtin quality gate is missing.");
+ return builtIn;
+ }
+
private Optional<Long> getDefaultId(DbSession dbSession) {
PropertyDto defaultQualityGateId = dbClient.propertiesDao().selectGlobalProperty(dbSession, SONAR_QUALITYGATE_PROPERTY);
import org.sonar.db.user.UserMembershipQuery;
import org.sonar.server.es.EsTester;
import org.sonar.server.es.SearchOptions;
+import org.sonar.server.qualitygate.QualityGateFinder;
import org.sonar.server.qualityprofile.BuiltInQProfile;
import org.sonar.server.qualityprofile.BuiltInQProfileRepositoryRule;
import org.sonar.server.qualityprofile.QProfileName;
name="org1_name"
guarded="[false]"
new_project_private="[false]"
+ default_quality_gate_uuid="1"
created_at="1000"
updated_at="2000"/>
name="org1_name"
guarded="[false]"
new_project_private="[false]"
+ default_quality_gate_uuid="1"
created_at="1000"
updated_at="2000"/>
name="org1_name"
guarded="[false]"
new_project_private="[false]"
+ default_quality_gate_uuid="1"
created_at="1000"
updated_at="2000"/>