forked from secretflow/kuscia
-
Notifications
You must be signed in to change notification settings - Fork 0
/
configs.go
77 lines (68 loc) · 2.07 KB
/
configs.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
// Copyright 2023 Ant Group Co., Ltd.
//
// 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 engine
import (
"fmt"
"sync"
"github.com/spf13/pflag"
"github.com/secretflow/kuscia/pkg/web/errorcode"
"github.com/secretflow/kuscia/pkg/web/framework"
)
// configContext provide a container for engine to save all beans
type configContext struct {
sync.RWMutex
Order []string
Context map[string]framework.Config
}
func (c *configContext) register(name string, conf framework.Config) error {
if len(name) == 0 || conf == nil {
return fmt.Errorf("invalidate name:'%s' config:%v", name, conf)
}
c.RWMutex.Lock()
defer c.RWMutex.Unlock()
if _, ok := c.Context[name]; ok {
return fmt.Errorf("duplicate regist config name:'%s'", name)
}
c.Context[name] = conf
c.Order = append(c.Order, name)
return nil
}
// flags register all flags.
func (c *configContext) flags(fs *pflag.FlagSet) {
c.RWMutex.Lock()
defer c.RWMutex.Unlock()
for name, conf := range c.Context {
if loader, ok := conf.(framework.ConfigLoader); ok {
loader.RegisterFlags(conf, name, fs)
}
}
}
// SetValidate calls Process/validate in order.
func (c *configContext) setValidate(errs *errorcode.Errs) {
c.RWMutex.Lock()
defer c.RWMutex.Unlock()
for _, name := range c.Order {
if loader, ok := c.Context[name].(framework.ConfigLoader); ok {
loader.Process(c.Context[name], name, errs)
}
c.Context[name].Validate(errs)
}
}
// get config.
func (c *configContext) getByName(name string) (conf framework.Config, ok bool) {
c.RWMutex.RLock()
defer c.RWMutex.RUnlock()
conf, ok = c.Context[name]
return
}