feat: nested config value setting using env vars (#21049)

Automatic Merge
Этот коммит содержится в:
Gábor Boros
2022-10-15 06:32:14 +02:00
коммит произвёл GitHub
родитель 21bf5b5dd5
Коммит 9a857b47b4
2 изменённых файлов: 81 добавлений и 1 удалений

Просмотреть файл

@@ -4,6 +4,7 @@
package config
import (
"encoding/json"
"os"
"reflect"
"strconv"
@@ -73,6 +74,11 @@ func applyEnvKey(key, value string, rValueSubject reflect.Value) {
}
case reflect.SliceOf(reflect.TypeOf("")).Kind():
rFieldValue.Set(reflect.ValueOf(strings.Split(value, " ")))
case reflect.Map:
target := reflect.New(rFieldValue.Type()).Interface()
if err := json.Unmarshal([]byte(value), target); err == nil {
rFieldValue.Set(reflect.ValueOf(target).Elem())
}
}
}

Просмотреть файл

@@ -31,15 +31,54 @@ func TestRemoveEnvOverrides(t *testing.T) {
expectedConfig *model.Config
}{
{
name: "basic override",
name: "config override",
inputConfig: modifiedDefault(func(in *model.Config) {
*in.ServiceSettings.TLSMinVer = "1.4"
in.PluginSettings.PluginStates = map[string]*model.PluginState{
"plugin1": {
Enable: false,
},
}
in.PluginSettings.Plugins = map[string]map[string]interface{}{
"com.mattermost.plugin-1": {
"key1": "value1",
},
"com_mattermost_plugin-2": {
"key2": "value2",
},
}
}),
env: map[string]string{
"MM_SERVICESETTINGS_TLSMINVER": "1.5",
"MM_PLUGINSETTINGS_PLUGINSTATES": `{
"plugin1": {
"Enable": true
}
}`,
"MM_PLUGINSETTINGS_PLUGINS": `{
"com.mattermost.plugin-1": {
"key1": "other-value"
},
"com_mattermost_plugin-2": {
"key2": "other-value"
}
}`,
},
expectedConfig: modifiedDefault(func(in *model.Config) {
*in.ServiceSettings.TLSMinVer = "1.5"
in.PluginSettings.PluginStates = map[string]*model.PluginState{
"plugin1": {
Enable: true,
},
}
in.PluginSettings.Plugins = map[string]map[string]interface{}{
"com.mattermost.plugin-1": {
"key1": "other-value",
},
"com_mattermost_plugin-2": {
"key2": "other-value",
},
}
}),
},
{
@@ -102,6 +141,41 @@ func TestRemoveEnvOverrides(t *testing.T) {
in.SqlSettings.DataSourceReplicas = []string{"otherthing", "alsothis"}
}),
},
{
name: "complex env settings",
inputConfig: modifiedDefault(func(in *model.Config) {
}),
env: map[string]string{
"MM_PLUGINSETTINGS_PLUGINSTATES": `{
"com.mattermost.plugin-1": {
"enable": true
}
}`,
"MM_PLUGINSETTINGS_PLUGINS": `{
"com.mattermost.plugin-1": {
"key": {
"key": "(?P<key>KEY)-(?P<id>\\d{1,6})(?P<comma>[,;]*)",
"value": "[$key-$id](https://example.com/?$project-$id)$comma"
}
}
}`,
},
expectedConfig: modifiedDefault(func(in *model.Config) {
in.PluginSettings.PluginStates = map[string]*model.PluginState{
"com.mattermost.plugin-1": {
Enable: true,
},
}
in.PluginSettings.Plugins = map[string]map[string]interface{}{
"com.mattermost.plugin-1": {
"key": map[string]interface{}{
"key": "(?P<key>KEY)-(?P<id>\\d{1,6})(?P<comma>[,;]*)",
"value": "[$key-$id](https://example.com/?$project-$id)$comma",
},
},
}
}),
},
{
name: "bad env",
inputConfig: modifiedDefault(func(in *model.Config) {