-
Notifications
You must be signed in to change notification settings - Fork 4.7k
/
store.go
112 lines (101 loc) · 3.18 KB
/
store.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
// Package store is only used in the internal implement of manager, not a public api.
package store
import (
"errors"
"fmt"
"github.com/goharbor/harbor/src/common/config/metadata"
"github.com/goharbor/harbor/src/common/config/store/driver"
"github.com/goharbor/harbor/src/common/utils"
"github.com/goharbor/harbor/src/common/utils/log"
"sync"
)
// ConfigStore - the config data store
type ConfigStore struct {
cfgDriver driver.Driver
cfgValues sync.Map
}
// NewConfigStore create config store
func NewConfigStore(cfgDriver driver.Driver) *ConfigStore {
return &ConfigStore{cfgDriver: cfgDriver}
}
// Get - Get config data from current store
func (c *ConfigStore) Get(key string) (*metadata.ConfigureValue, error) {
if value, ok := c.cfgValues.Load(key); ok {
if result, ok := value.(metadata.ConfigureValue); ok {
return &result, nil
}
return nil, errors.New("data in config store is not a ConfigureValue type")
}
return nil, metadata.ErrValueNotSet
}
// GetAnyType get interface{} type for config items
func (c *ConfigStore) GetAnyType(key string) (interface{}, error) {
if value, ok := c.cfgValues.Load(key); ok {
if result, ok := value.(metadata.ConfigureValue); ok {
return result.GetAnyType()
}
return nil, errors.New("data in config store is not a ConfigureValue type")
}
return nil, metadata.ErrValueNotSet
}
// Set - Set configure value in store, not saved to config driver
func (c *ConfigStore) Set(key string, value metadata.ConfigureValue) error {
c.cfgValues.Store(key, value)
return nil
}
// Load - Load data from driver, all user config in the store will be refreshed
func (c *ConfigStore) Load() error {
if c.cfgDriver == nil {
return errors.New("failed to load store, cfgDriver is nil")
}
cfgs, err := c.cfgDriver.Load()
if err != nil {
return err
}
for key, value := range cfgs {
cfgValue := metadata.ConfigureValue{}
strValue := fmt.Sprintf("%v", value)
err = cfgValue.Set(key, strValue)
if err != nil {
log.Errorf("error when loading data item, key %v, value %v, error %v", key, value, err)
continue
}
c.cfgValues.Store(key, cfgValue)
}
return nil
}
// Save - Save all data in current store
func (c *ConfigStore) Save() error {
cfgMap := map[string]interface{}{}
c.cfgValues.Range(func(key, value interface{}) bool {
keyStr := fmt.Sprintf("%v", key)
if configValue, ok := value.(metadata.ConfigureValue); ok {
valueStr := configValue.Value
if _, ok := metadata.Instance().GetByName(keyStr); ok {
cfgMap[keyStr] = valueStr
} else {
log.Errorf("failed to get metadata for key %v", keyStr)
}
}
return true
})
if c.cfgDriver == nil {
return errors.New("failed to save store, cfgDriver is nil")
}
return c.cfgDriver.Save(cfgMap)
}
// Update - Only update specified settings in cfgMap in store and driver
func (c *ConfigStore) Update(cfgMap map[string]interface{}) error {
// Update to store
for key, value := range cfgMap {
configValue, err := metadata.NewCfgValue(key, utils.GetStrValueOfAnyType(value))
if err != nil {
log.Warningf("error %v, skip to update configure item, key:%v ", err, key)
delete(cfgMap, key)
continue
}
c.Set(key, *configValue)
}
// Update to driver
return c.cfgDriver.Save(cfgMap)
}