From: Teryk Bellahsene Date: Mon, 20 Jul 2015 12:50:42 +0000 (+0200) Subject: SONAR-6652 ws system/db_migration_status status of database migration X-Git-Tag: 5.2-RC1~1059 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=refs%2Fpull%2F423%2Fhead;p=sonarqube.git SONAR-6652 ws system/db_migration_status status of database migration --- diff --git a/server/sonar-server/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel4.java b/server/sonar-server/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel4.java index 26c3a75f8a9..92cdbaaa37d 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel4.java +++ b/server/sonar-server/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel4.java @@ -185,6 +185,7 @@ import org.sonar.server.platform.monitoring.JvmPropertiesMonitor; import org.sonar.server.platform.monitoring.PluginsMonitor; import org.sonar.server.platform.monitoring.SonarQubeMonitor; import org.sonar.server.platform.monitoring.SystemMonitor; +import org.sonar.server.platform.ws.DbMigrationStatusAction; import org.sonar.server.platform.ws.InfoAction; import org.sonar.server.platform.ws.L10nWs; import org.sonar.server.platform.ws.MigrateDbAction; @@ -694,7 +695,6 @@ public class PlatformLevel4 extends PlatformLevel { RestartAction.class, InfoAction.class, UpgradesAction.class, - MigrateDbAction.class, StatusAction.class, SystemWs.class, SystemMonitor.class, @@ -703,6 +703,8 @@ public class PlatformLevel4 extends PlatformLevel { PluginsMonitor.class, JvmPropertiesMonitor.class, DatabaseMonitor.class, + MigrateDbAction.class, + DbMigrationStatusAction.class, // Plugins WS PluginWSCommons.class, diff --git a/server/sonar-server/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevelSafeMode.java b/server/sonar-server/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevelSafeMode.java index c1445a403b6..190436d17f5 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevelSafeMode.java +++ b/server/sonar-server/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevelSafeMode.java @@ -19,6 +19,7 @@ */ package org.sonar.server.platform.platformlevel; +import org.sonar.server.platform.ws.DbMigrationStatusAction; import org.sonar.server.platform.ws.MigrateDbAction; import org.sonar.server.platform.ws.StatusAction; import org.sonar.server.platform.ws.SystemWs; @@ -36,6 +37,7 @@ public class PlatformLevelSafeMode extends PlatformLevel { // Server WS StatusAction.class, MigrateDbAction.class, + DbMigrationStatusAction.class, SystemWs.class, // Listing WS diff --git a/server/sonar-server/src/main/java/org/sonar/server/platform/ws/DbMigrationJsonWriter.java b/server/sonar-server/src/main/java/org/sonar/server/platform/ws/DbMigrationJsonWriter.java new file mode 100644 index 00000000000..567d06800f5 --- /dev/null +++ b/server/sonar-server/src/main/java/org/sonar/server/platform/ws/DbMigrationJsonWriter.java @@ -0,0 +1,132 @@ +/* + * SonarQube, open source software quality management tool. + * Copyright (C) 2008-2014 SonarSource + * mailto:contact AT sonarsource DOT com + * + * SonarQube 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. + * + * SonarQube 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.ws; + +import org.sonar.api.utils.text.JsonWriter; +import org.sonar.db.version.DatabaseMigration; + +import static org.sonar.db.version.DatabaseMigration.Status.NONE; +import static org.sonar.db.version.DatabaseMigration.Status.RUNNING; + +public class DbMigrationJsonWriter { + static final String FIELD_STATE = "state"; + static final String FIELD_MESSAGE = "message"; + static final String FIELD_STARTED_AT = "startedAt"; + + static final String STATUS_NO_MIGRATION = "NO_MIGRATION"; + static final String STATUS_NOT_SUPPORTED = "NOT_SUPPORTED"; + static final String STATUS_MIGRATION_RUNNING = "MIGRATION_RUNNING"; + static final String STATUS_MIGRATION_FAILED = "MIGRATION_FAILED"; + static final String STATUS_MIGRATION_SUCCEEDED = "MIGRATION_SUCCEEDED"; + + static final String UNSUPPORTED_DATABASE_MIGRATION_STATUS = "Unsupported DatabaseMigration status"; + static final String MESSAGE_NO_MIGRATION_ON_EMBEDDED_DATABASE = "Upgrade is not supported on embedded database."; + static final String MESSAGE_MIGRATION_NEEDED = "Database migration is required. DB migration can be started using WS /api/system/migrate_db."; + static final String MESSAGE_STATUS_NONE = "Database is up-to-date, no migration needed."; + static final String MESSAGE_STATUS_RUNNING = "Database migration is running."; + static final String MESSAGE_STATUS_SUCCEEDED = "Migration succeeded."; + static final String MESSAGE_STATUS_FAILED = "Migration failed: %s.
Please check logs."; + + private DbMigrationJsonWriter() { + // static methods only + } + + static void write(JsonWriter json, DatabaseMigration databaseMigration) { + json.beginObject() + .prop(FIELD_STATE, statusToJson(databaseMigration.status())) + .prop(FIELD_MESSAGE, buildMessage(databaseMigration)) + .propDateTime(FIELD_STARTED_AT, databaseMigration.startedAt()) + .endObject(); + } + + static void writeNotSupportedResponse(JsonWriter json) { + json.beginObject() + .prop(FIELD_STATE, STATUS_NOT_SUPPORTED) + .prop(FIELD_MESSAGE, MESSAGE_NO_MIGRATION_ON_EMBEDDED_DATABASE) + .endObject(); + } + + static void writeJustStartedResponse(JsonWriter json, DatabaseMigration databaseMigration) { + json.beginObject() + .prop(FIELD_STATE, statusToJson(RUNNING)) + .prop(FIELD_MESSAGE, MESSAGE_STATUS_RUNNING) + .propDateTime(FIELD_STARTED_AT, databaseMigration.startedAt()) + .endObject(); + } + + static void writeMigrationNeededResponse(JsonWriter json) { + json.beginObject() + .prop(FIELD_STATE, statusToJson(NONE)) + .prop(FIELD_MESSAGE, MESSAGE_MIGRATION_NEEDED) + .endObject(); + } + + private static String statusToJson(DatabaseMigration.Status status) { + switch (status) { + case NONE: + return STATUS_NO_MIGRATION; + case RUNNING: + return STATUS_MIGRATION_RUNNING; + case FAILED: + return STATUS_MIGRATION_FAILED; + case SUCCEEDED: + return STATUS_MIGRATION_SUCCEEDED; + default: + throw new IllegalArgumentException( + "Unsupported DatabaseMigration.Status " + status + " can not be converted to JSON value"); + } + } + + private static String buildMessage(DatabaseMigration databaseMigration) { + switch (databaseMigration.status()) { + case NONE: + return MESSAGE_STATUS_NONE; + case RUNNING: + return MESSAGE_STATUS_RUNNING; + case SUCCEEDED: + return MESSAGE_STATUS_SUCCEEDED; + case FAILED: + return String.format(MESSAGE_STATUS_FAILED, failureMessage(databaseMigration)); + default: + return UNSUPPORTED_DATABASE_MIGRATION_STATUS; + } + } + + private static String failureMessage(DatabaseMigration databaseMigration) { + Throwable failureError = databaseMigration.failureError(); + if (failureError == null) { + return "No failure error"; + } + return failureError.getMessage(); + } + + static String statusDescription() { + return + "State values are:" + + "