mirror of
https://gitee.com/rainbond/Rainbond.git
synced 2024-12-04 12:47:36 +08:00
215 lines
5.7 KiB
Go
215 lines
5.7 KiB
Go
// Copyright (C) 2014-2018 Goodrain Co., Ltd.
|
|
// RAINBOND, Application Management Platform
|
|
|
|
// This program is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License as published by
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
// (at your option) any later version. For any non-GPL usage of Rainbond,
|
|
// one or multiple Commercial Licenses authorized by Goodrain Co., Ltd.
|
|
// must be obtained first.
|
|
|
|
// 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 General Public License for more details.
|
|
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
package config
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"regexp"
|
|
"strconv"
|
|
"strings"
|
|
|
|
"github.com/Sirupsen/logrus"
|
|
"github.com/goodrain/rainbond/cmd/node/option"
|
|
"github.com/goodrain/rainbond/node/core/store"
|
|
)
|
|
|
|
//GroupContext 组任务会话
|
|
type GroupContext struct {
|
|
ctx context.Context
|
|
groupID string
|
|
}
|
|
|
|
//NewGroupContext 创建组配置会话
|
|
func NewGroupContext(groupID string) *GroupContext {
|
|
return &GroupContext{
|
|
ctx: context.Background(),
|
|
groupID: groupID,
|
|
}
|
|
}
|
|
|
|
//Add 添加配置项
|
|
func (g *GroupContext) Add(k, v interface{}) {
|
|
g.ctx = context.WithValue(g.ctx, k, v)
|
|
store.DefalutClient.Put(fmt.Sprintf("%s/group/%s/%s", option.Config.ConfigStoragePath, g.groupID, k), v.(string))
|
|
}
|
|
|
|
//Get get
|
|
func (g *GroupContext) Get(k interface{}) interface{} {
|
|
if v := g.ctx.Value(k); v != nil {
|
|
return v
|
|
}
|
|
res, _ := store.DefalutClient.Get(fmt.Sprintf("%s/group/%s/%s", option.Config.ConfigStoragePath, g.groupID, k))
|
|
if res.Count > 0 {
|
|
return string(res.Kvs[0].Value)
|
|
}
|
|
return ""
|
|
}
|
|
|
|
//GetString get
|
|
func (g *GroupContext) GetString(k interface{}) string {
|
|
if v := g.ctx.Value(k); v != nil {
|
|
return v.(string)
|
|
}
|
|
res, _ := store.DefalutClient.Get(fmt.Sprintf("%s/group/%s/%s", option.Config.ConfigStoragePath, g.groupID, k))
|
|
if res.Count > 0 {
|
|
return string(res.Kvs[0].Value)
|
|
}
|
|
return ""
|
|
}
|
|
|
|
var reg = regexp.MustCompile(`(?U)\$\{.*\}`)
|
|
|
|
//GetConfigKey 获取配置key
|
|
func GetConfigKey(rk string) string {
|
|
if len(rk) < 4 {
|
|
return ""
|
|
}
|
|
left := strings.Index(rk, "{")
|
|
right := strings.Index(rk, "}")
|
|
return rk[left+1 : right]
|
|
}
|
|
|
|
//ResettingArray 根据实际配置解析数组字符串
|
|
func ResettingArray(groupCtx *GroupContext, source []string) ([]string, error) {
|
|
sourcecopy := make([]string, len(source))
|
|
// 使用copy
|
|
for i, s := range source {
|
|
sourcecopy[i] = s
|
|
}
|
|
for i, s := range sourcecopy {
|
|
resultKey := reg.FindAllString(s, -1)
|
|
for _, rk := range resultKey {
|
|
key := strings.ToUpper(GetConfigKey(rk))
|
|
// if len(key) < 1 {
|
|
// return nil, fmt.Errorf("%s Parameter configuration error.please make sure `${XXX}`", s)
|
|
// }
|
|
value := GetConfig(groupCtx, key)
|
|
sourcecopy[i] = strings.Replace(s, rk, value, -1)
|
|
}
|
|
}
|
|
return sourcecopy, nil
|
|
}
|
|
|
|
//GetConfig 获取配置信息
|
|
func GetConfig(groupCtx *GroupContext, key string) string {
|
|
if groupCtx != nil {
|
|
value := groupCtx.Get(key)
|
|
if value != nil {
|
|
switch value.(type) {
|
|
case string:
|
|
if value.(string) != "" {
|
|
return value.(string)
|
|
}
|
|
case int:
|
|
if value.(int) != 0 {
|
|
return strconv.Itoa(value.(int))
|
|
}
|
|
case []string:
|
|
if value.([]string) != nil {
|
|
result := strings.Join(value.([]string), ",")
|
|
if strings.HasSuffix(result, ",") {
|
|
return result
|
|
}
|
|
return result + ","
|
|
}
|
|
case []interface{}:
|
|
if value.([]interface{}) != nil && len(value.([]interface{})) > 0 {
|
|
result := ""
|
|
for _, v := range value.([]interface{}) {
|
|
switch v.(type) {
|
|
case string:
|
|
result += v.(string) + ","
|
|
case int:
|
|
result += strconv.Itoa(v.(int)) + ","
|
|
}
|
|
}
|
|
return result
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if dataCenterConfig == nil {
|
|
return ""
|
|
}
|
|
cn := dataCenterConfig.GetConfig(key)
|
|
if cn != nil && cn.Value != nil {
|
|
if cn.ValueType == "string" || cn.ValueType == "" {
|
|
return cn.Value.(string)
|
|
}
|
|
if cn.ValueType == "array" {
|
|
switch cn.Value.(type) {
|
|
case []string:
|
|
return strings.Join(cn.Value.([]string), ",")
|
|
case []interface{}:
|
|
vas := cn.Value.([]interface{})
|
|
result := ""
|
|
for _, va := range vas {
|
|
switch va.(type) {
|
|
case string:
|
|
result += va.(string) + ","
|
|
case int:
|
|
result += strconv.Itoa(va.(int)) + ","
|
|
}
|
|
}
|
|
return result
|
|
}
|
|
}
|
|
if cn.ValueType == "int" {
|
|
return strconv.Itoa(cn.Value.(int))
|
|
}
|
|
}
|
|
logrus.Warnf("can not find config for key %s", key)
|
|
return ""
|
|
}
|
|
|
|
//ResettingString 根据实际配置解析字符串
|
|
func ResettingString(groupCtx *GroupContext, source string) (string, error) {
|
|
resultKey := reg.FindAllString(source, -1)
|
|
for _, rk := range resultKey {
|
|
key := strings.ToUpper(GetConfigKey(rk))
|
|
// if len(key) < 1 {
|
|
// return nil, fmt.Errorf("%s Parameter configuration error.please make sure `${XXX}`", s)
|
|
// }
|
|
value := GetConfig(groupCtx, key)
|
|
source = strings.Replace(source, rk, value, -1)
|
|
}
|
|
return source, nil
|
|
}
|
|
|
|
//ResettingMap 根据实际配置解析Map字符串
|
|
func ResettingMap(groupCtx *GroupContext, source map[string]string) (map[string]string, error) {
|
|
sourcecopy := make(map[string]string, len(source))
|
|
for k, v := range source {
|
|
sourcecopy[k] = v
|
|
}
|
|
for k, s := range sourcecopy {
|
|
resultKey := reg.FindAllString(s, -1)
|
|
for _, rk := range resultKey {
|
|
key := strings.ToUpper(GetConfigKey(rk))
|
|
// if len(key) < 1 {
|
|
// return nil, fmt.Errorf("%s Parameter configuration error.please make sure `${XXX}`", s)
|
|
// }
|
|
value := GetConfig(groupCtx, key)
|
|
sourcecopy[k] = strings.Replace(s, rk, value, -1)
|
|
}
|
|
}
|
|
return sourcecopy, nil
|
|
}
|