diff --git a/Documentation/rest-api-config.txt b/Documentation/rest-api-config.txt index 3d18abb32c..59a4608bcd 100644 --- a/Documentation/rest-api-config.txt +++ b/Documentation/rest-api-config.txt @@ -194,6 +194,51 @@ is returned that contains detected consistency problems. ---- +[[reload-config]] +=== Reload Config +-- +'POST /config/server/reload' +-- + +Reloads the gerrit.config configuration. + +Not all configuration value can be picked up by this command. Which config +sections and values that are supported is documented here: +link:config-gerrit.html[Configuration] + +_The output shows only modified config values that are picked up by Gerrit +and applied._ + +If a config entry is added or removed from gerrit.config, but still brings +no effect due to a matching default value, no output for this entry is shown. + +.Request +---- + POST /config/server/reload HTTP/1.0 +---- + +As result a link:#config-update-info[ConfigUpdateInfo] entity is returned that +contains information about how the updated config entries were handled. + +.Response +---- + HTTP/1.1 200 OK + Content-Type: application/json; charset=UTF-8 + + )]}' + { + "rejected": [], + "applied": [ + { + "config_key": "addreviewer.maxAllowed", + "old_value": "20", + "new_value": "15" + } + ] + } +---- + + [[confirm-email]] === Confirm Email -- @@ -1609,6 +1654,39 @@ Possible values are `ERROR` and `WARNING`. |`message` |Message describing the consistency problem. |====================== +[[config-update-info]] +=== ConfigUpdateInfo +The entity describes the result of a reload of gerrit.config. + +If a changed config value is missing from the `applied` and the `rejected` +lists there are no guarantees to whether they have or have not taken effect. + +[options="header",cols="1,6"] +|====================== +|Field Name|Description +|`applied` |A list of link:#config-update-entry-info[ConfigUpdateEntryInfos] +describing the applied configuration changes. + +Every config value change representation present in this list is guaranteed to +have taken effect. +|`rejected` |A list of link:#config-update-entry-info[ConfigUpdateEntryInfos] +describing the rejected configuration changes. + +Every config value change representation present in this list is guaranteed not +to have taken effect. +|====================== + +[[config-update-entry-info]] +=== ConfigUpdateEntryInfo +The entity describes an updated config value. + +[options="header",cols="1,6"] +|====================== +|Field Name|Description +|`config_key` |The config key that contains the value. +|`old_value` |The old config value. + +Missing if value was not previously configured. +|`new_value` |The new config value, picked up after reload. +|====================== + [[download-info]] === DownloadInfo The `DownloadInfo` entity contains information about supported download diff --git a/java/com/google/gerrit/extensions/api/config/ConfigUpdateEntryInfo.java b/java/com/google/gerrit/extensions/api/config/ConfigUpdateEntryInfo.java new file mode 100644 index 0000000000..4ebf7b2664 --- /dev/null +++ b/java/com/google/gerrit/extensions/api/config/ConfigUpdateEntryInfo.java @@ -0,0 +1,21 @@ +// Copyright (C) 2018 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.gerrit.extensions.api.config; + +public class ConfigUpdateEntryInfo { + public String configKey; + public String oldValue; + public String newValue; +} diff --git a/java/com/google/gerrit/server/restapi/config/ConfigRestModule.java b/java/com/google/gerrit/server/restapi/config/ConfigRestModule.java index 90fa5c43ad..0b94d168e2 100644 --- a/java/com/google/gerrit/server/restapi/config/ConfigRestModule.java +++ b/java/com/google/gerrit/server/restapi/config/ConfigRestModule.java @@ -37,6 +37,7 @@ public class ConfigRestModule extends RestApiModule { get(CONFIG_KIND, "version").to(GetVersion.class); get(CONFIG_KIND, "info").to(GetServerInfo.class); post(CONFIG_KIND, "check.consistency").to(CheckConsistency.class); + post(CONFIG_KIND, "reload").to(ReloadConfig.class); get(CONFIG_KIND, "preferences").to(GetPreferences.class); put(CONFIG_KIND, "preferences").to(SetPreferences.class); get(CONFIG_KIND, "preferences.diff").to(GetDiffPreferences.class); diff --git a/java/com/google/gerrit/server/restapi/config/ReloadConfig.java b/java/com/google/gerrit/server/restapi/config/ReloadConfig.java new file mode 100644 index 0000000000..0c9cf178a1 --- /dev/null +++ b/java/com/google/gerrit/server/restapi/config/ReloadConfig.java @@ -0,0 +1,83 @@ +// Copyright (C) 2018 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.gerrit.server.restapi.config; + +import static com.google.common.collect.ImmutableList.toImmutableList; + +import com.google.gerrit.extensions.api.config.ConfigUpdateEntryInfo; +import com.google.gerrit.extensions.common.Input; +import com.google.gerrit.extensions.restapi.RestApiException; +import com.google.gerrit.extensions.restapi.RestModifyView; +import com.google.gerrit.server.config.ConfigResource; +import com.google.gerrit.server.config.ConfigUpdatedEvent; +import com.google.gerrit.server.config.ConfigUpdatedEvent.ConfigUpdateEntry; +import com.google.gerrit.server.config.ConfigUpdatedEvent.UpdateResult; +import com.google.gerrit.server.config.GerritServerConfigReloader; +import com.google.gerrit.server.permissions.GlobalPermission; +import com.google.gerrit.server.permissions.PermissionBackend; +import com.google.gerrit.server.permissions.PermissionBackendException; +import com.google.inject.Inject; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class ReloadConfig implements RestModifyView { + + private GerritServerConfigReloader config; + private PermissionBackend permissions; + + @Inject + ReloadConfig(GerritServerConfigReloader config, PermissionBackend permissions) { + this.config = config; + this.permissions = permissions; + } + + @Override + public Map> apply(ConfigResource resource, Input input) + throws RestApiException, PermissionBackendException { + permissions.currentUser().check(GlobalPermission.ADMINISTRATE_SERVER); + + List updates = config.reloadConfig(); + + Map> reply = new HashMap<>(); + for (UpdateResult result : UpdateResult.values()) { + reply.put(result.name().toLowerCase(), new ArrayList<>()); + } + if (updates.isEmpty()) { + return reply; + } + updates + .stream() + .forEach(u -> reply.get(u.getResult().name().toLowerCase()).addAll(toEntryInfos(u))); + return reply; + } + + private static List toEntryInfos(ConfigUpdatedEvent.Update update) { + return update + .getConfigUpdates() + .stream() + .map(e -> toConfigUpdateEntryInfo(e)) + .collect(toImmutableList()); + } + + private static ConfigUpdateEntryInfo toConfigUpdateEntryInfo(ConfigUpdateEntry e) { + ConfigUpdateEntryInfo uei = new ConfigUpdateEntryInfo(); + uei.configKey = e.key.toString(); + uei.oldValue = e.oldVal; + uei.newValue = e.newVal; + return uei; + } +}