2015-03-15 04:27:04 +00:00
|
|
|
package config
|
|
|
|
|
|
|
|
import (
|
2018-09-16 04:55:26 +00:00
|
|
|
"github.com/rancher/os/pkg/log"
|
|
|
|
"github.com/rancher/os/pkg/util"
|
2015-03-15 04:27:04 +00:00
|
|
|
)
|
|
|
|
|
2015-09-23 11:36:28 +00:00
|
|
|
type CfgFunc func(*CloudConfig) (*CloudConfig, error)
|
2017-05-02 23:45:58 +00:00
|
|
|
type CfgFuncData struct {
|
|
|
|
Name string
|
|
|
|
Func CfgFunc
|
|
|
|
}
|
2017-08-11 17:09:47 +00:00
|
|
|
|
2017-05-02 23:45:58 +00:00
|
|
|
type CfgFuncs []CfgFuncData
|
2015-09-23 11:36:28 +00:00
|
|
|
|
2017-05-02 23:45:58 +00:00
|
|
|
func ChainCfgFuncs(cfg *CloudConfig, cfgFuncs CfgFuncs) (*CloudConfig, error) {
|
|
|
|
len := len(cfgFuncs)
|
|
|
|
for c, d := range cfgFuncs {
|
|
|
|
i := c + 1
|
|
|
|
name := d.Name
|
|
|
|
cfgFunc := d.Func
|
|
|
|
if cfg == nil {
|
|
|
|
log.Infof("[%d/%d] Starting %s WITH NIL cfg", i, len, name)
|
|
|
|
} else {
|
|
|
|
log.Infof("[%d/%d] Starting %s", i, len, name)
|
|
|
|
}
|
2015-09-23 11:36:28 +00:00
|
|
|
var err error
|
|
|
|
if cfg, err = cfgFunc(cfg); err != nil {
|
2018-01-25 01:47:17 +00:00
|
|
|
log.Errorf("Failed [%d/%d] %s: %v", i, len, name, err)
|
2015-09-23 11:36:28 +00:00
|
|
|
return cfg, err
|
|
|
|
}
|
2017-05-02 23:45:58 +00:00
|
|
|
log.Debugf("[%d/%d] Done %s", i, len, name)
|
2015-09-23 11:36:28 +00:00
|
|
|
}
|
|
|
|
return cfg, nil
|
|
|
|
}
|
|
|
|
|
2015-07-29 06:52:15 +00:00
|
|
|
func filterKey(data map[interface{}]interface{}, key []string) (filtered, rest map[interface{}]interface{}) {
|
|
|
|
if len(key) == 0 {
|
|
|
|
return data, map[interface{}]interface{}{}
|
|
|
|
}
|
|
|
|
|
|
|
|
filtered = map[interface{}]interface{}{}
|
|
|
|
rest = util.MapCopy(data)
|
|
|
|
|
|
|
|
k := key[0]
|
|
|
|
if d, ok := data[k]; ok {
|
|
|
|
switch d := d.(type) {
|
|
|
|
|
|
|
|
case map[interface{}]interface{}:
|
|
|
|
f, r := filterKey(d, key[1:])
|
|
|
|
|
|
|
|
if len(f) != 0 {
|
|
|
|
filtered[k] = f
|
|
|
|
}
|
|
|
|
|
|
|
|
if len(r) != 0 {
|
|
|
|
rest[k] = r
|
|
|
|
} else {
|
|
|
|
delete(rest, k)
|
|
|
|
}
|
|
|
|
|
|
|
|
default:
|
|
|
|
filtered[k] = d
|
|
|
|
delete(rest, k)
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return
|
|
|
|
}
|