Skip to content

Commit e8305df

Browse files
ozevrenistio-merge-robot
authored andcommittedNov 21, 2017
Rationalize the Evaluator interface. (istio#1775)
Automatic merge from submit-queue. Remove the TypeChecker interface from Evaluator + Also, the PredicateEvaluator interface is subsumed to the Evaluator interface. **What this PR does / why we need it**: This is a sanity-refactoring that teases out responsibilities for the interfaces. With this CL, the exact nature of dependencies to the expression language is clearly demarcated. **Which issue this PR fixes** *(optional, in `fixes #<issue number>(, fixes #<issue_number>, ...)` format, will close that issue when PR gets merged)*: fixes # **Special notes for your reviewer**: **Release note**: ```release-note NONE ```
1 parent cf96940 commit e8305df

12 files changed

+34
-29
lines changed
 

‎mixer/cmd/server/cmd/server.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,7 @@ func setupServer(sa *serverArgs, info map[string]template.Info, adapters []adptr
269269
if err != nil {
270270
fatalf("Failed to connect to the configuration server. %v", err)
271271
}
272-
dispatcher, err = mixerRuntime.New(eval, gp, adapterGP,
272+
dispatcher, err = mixerRuntime.New(eval, evaluator.NewTypeChecker(), gp, adapterGP,
273273
sa.configIdentityAttribute, sa.configDefaultNamespace,
274274
store2, adapterMap, info,
275275
)
@@ -281,13 +281,13 @@ func setupServer(sa *serverArgs, info map[string]template.Info, adapters []adptr
281281
repo := template.NewRepository(info)
282282
store := configStore(sa.configStoreURL, sa.serviceConfigFile, sa.globalConfigFile, printf, fatalf)
283283
adapterMgr := adapterManager.NewManager(legacyAdapters, aspect.Inventory(), evalForLegacy, gp, adapterGP)
284-
configManager := config.NewManager(evalForLegacy, adapterMgr.AspectValidatorFinder, adapterMgr.BuilderValidatorFinder, adapters,
284+
configManager := config.NewManager(evalForLegacy, evaluator.NewTypeChecker(), adapterMgr.AspectValidatorFinder, adapterMgr.BuilderValidatorFinder, adapters,
285285
adapterMgr.SupportedKinds,
286286
repo, store, time.Second*time.Duration(sa.configFetchIntervalSec),
287287
sa.configIdentityAttribute,
288288
sa.configIdentityAttributeDomain)
289289

290-
configAPIServer := config.NewAPI("v1", sa.configAPIPort, evalForLegacy,
290+
configAPIServer := config.NewAPI("v1", sa.configAPIPort, evaluator.NewTypeChecker(),
291291
adapterMgr.AspectValidatorFinder, adapterMgr.BuilderValidatorFinder, adapters,
292292
adapterMgr.SupportedKinds, store, repo)
293293

‎mixer/pkg/aspect/test/evaluator.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import (
2525
type EvalBody func(string, attribute.Bag) (interface{}, error)
2626

2727
type fakeEval struct {
28-
expr.PredicateEvaluator
28+
expr.Evaluator
2929
expr.TypeChecker
3030

3131
body EvalBody

‎mixer/pkg/config/manager.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ type Manager struct {
8585
// as command line input parameters.
8686
// GlobalConfig specifies the location of Global Config.
8787
// ServiceConfig specifies the location of Service config.
88-
func NewManager(eval expr.Evaluator, aspectFinder AspectValidatorFinder, builderFinder BuilderValidatorFinder,
88+
func NewManager(eval expr.Evaluator, typeChecker expr.TypeChecker, aspectFinder AspectValidatorFinder, builderFinder BuilderValidatorFinder,
8989
getBuilderInfoFns []adapter.InfoFn, findAspects AdapterToAspectMapper, repository template.Repository,
9090
store store.KeyValueStore, loopDelay time.Duration, identityAttribute string,
9191
identityAttributeDomain string) *Manager {
@@ -100,7 +100,7 @@ func NewManager(eval expr.Evaluator, aspectFinder AspectValidatorFinder, builder
100100
identityAttributeDomain: identityAttributeDomain,
101101
validate: func(cfg map[string]string) (*Validated, descriptor.Finder, *adapter.ConfigErrors) {
102102
r := newRegistry2(getBuilderInfoFns, repository.SupportsTemplate)
103-
v := newValidator(aspectFinder, builderFinder, r.FindAdapterInfo, SetupHandlers, repository, findAspects, true, eval)
103+
v := newValidator(aspectFinder, builderFinder, r.FindAdapterInfo, SetupHandlers, repository, findAspects, true, typeChecker)
104104
rt, ce := v.validate(cfg)
105105
return rt, v.descriptorFinder, ce
106106
},

‎mixer/pkg/config/manager_test.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ func TestConfigManager(t *testing.T) {
9090
if mt.errStr != "" {
9191
store.err = errors.New(mt.errStr)
9292
}
93-
ma := NewManager(evaluator, vf.FindAspectValidator, vf.FindAdapterValidator, nil, vf.AdapterToAspectMapperFunc,
93+
ma := NewManager(evaluator, evaluator, vf.FindAspectValidator, vf.FindAdapterValidator, nil, vf.AdapterToAspectMapperFunc,
9494
template.NewRepository(nil), store, loopDelay, keyTargetService, keyServiceDomain)
9595
testConfigManager(t, ma, mt)
9696
})
@@ -100,7 +100,7 @@ func TestConfigManager(t *testing.T) {
100100
func TestManager_FetchError(t *testing.T) {
101101
errStr := "TestManager_FetchError"
102102
store := newFakeStore("{}", "{}")
103-
mgr := NewManager(nil, nil, nil, nil, nil,
103+
mgr := NewManager(nil, nil,nil, nil, nil, nil,
104104
template.NewRepository(nil), store, loopDelay, keyTargetService, keyServiceDomain)
105105

106106
mgr.validate = func(cfg map[string]string) (rt *Validated, desc descriptor.Finder, ce *adapter.ConfigErrors) {

‎mixer/pkg/config/runtime.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ type (
3333
runtime struct {
3434
Validated
3535
// used to evaluate selectors
36-
eval expr.PredicateEvaluator
36+
eval expr.Evaluator
3737

3838
// config is organized around the identityAttribute.
3939
identityAttribute string
@@ -42,7 +42,7 @@ type (
4242
)
4343

4444
// newRuntime returns a runtime object given a validated config and a predicate eval.
45-
func newRuntime(v *Validated, evaluator expr.PredicateEvaluator, identityAttribute, identityAttributeDomain string) *runtime {
45+
func newRuntime(v *Validated, evaluator expr.Evaluator, identityAttribute, identityAttributeDomain string) *runtime {
4646
return &runtime{
4747
Validated: *v,
4848
eval: evaluator,

‎mixer/pkg/config/runtime_test.go

+4
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,10 @@ type trueEval struct {
3535
ret bool
3636
}
3737

38+
func (t *trueEval) Eval(expression string, attrs attribute.Bag) (interface{}, error) {
39+
return t.EvalPredicate(expression, attrs)
40+
}
41+
3842
func (t *trueEval) EvalPredicate(expression string, attrs attribute.Bag) (bool, error) {
3943
if t.ncalls == 0 {
4044
return t.ret, t.err

‎mixer/pkg/expr/evaluator.go

-7
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,6 @@ type (
2626
// Eval evaluates given expression using the attribute bag
2727
Eval(expr string, attrs attribute.Bag) (interface{}, error)
2828

29-
PredicateEvaluator
30-
31-
TypeChecker
32-
}
33-
34-
// PredicateEvaluator evaluates a predicate to true or false
35-
PredicateEvaluator interface {
3629
// EvalPredicate evaluates given predicate using the attribute bag
3730
EvalPredicate(expr string, attrs attribute.Bag) (bool, error)
3831
}

‎mixer/pkg/runtime/controller.go

+5-4
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@ type Controller struct {
4040
// Static information
4141
adapterInfo map[string]*adapter.Info // maps adapter shortName to Info.
4242
templateInfo map[string]template.Info // maps template name to Info.
43-
eval expr.Evaluator // Used to infer types. Used by resolver and dispatcher.
43+
evaluator expr.Evaluator // used by resolver
44+
typeChecker expr.TypeChecker // used to infer types
4445
identityAttribute string // used by resolver
4546
defaultConfigNamespace string // used by resolver
4647

@@ -114,7 +115,7 @@ func (c *Controller) publishSnapShot() {
114115
// attribute manifests are used by type inference during handler creation.
115116
attributes := c.processAttributeManifests()
116117

117-
if cl, ok := c.eval.(VocabularyChangeListener); ok {
118+
if cl, ok := c.evaluator.(VocabularyChangeListener); ok {
118119
cl.ChangeVocabulary(attributes)
119120
}
120121

@@ -127,7 +128,7 @@ func (c *Controller) publishSnapShot() {
127128
instanceConfig := c.validInstanceConfigs()
128129

129130
// new handler factory is created for every config change.
130-
hb := c.createHandlerFactory(c.templateInfo, c.eval, attributes, c.adapterInfo)
131+
hb := c.createHandlerFactory(c.templateInfo, c.typeChecker, attributes, c.adapterInfo)
131132

132133
// new handler table is created for every config change. It uses handler factory
133134
// to create new handlers.
@@ -151,7 +152,7 @@ func (c *Controller) publishSnapShot() {
151152

152153
// Create new resolver and cleanup the old resolver.
153154
c.nextResolverID++
154-
resolver := newResolver(c.eval, c.identityAttribute, c.defaultConfigNamespace, resolvedRules, c.nextResolverID)
155+
resolver := newResolver(c.evaluator, c.identityAttribute, c.defaultConfigNamespace, resolvedRules, c.nextResolverID)
155156
c.dispatcher.ChangeResolver(resolver)
156157

157158
// copy old for deletion.

‎mixer/pkg/runtime/controller_test.go

+4-2
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@ func TestControllerEmpty(t *testing.T) {
4646
c := &Controller{
4747
adapterInfo: make(map[string]*adapter.Info),
4848
templateInfo: make(map[string]template.Info),
49-
eval: nil,
49+
evaluator: nil,
50+
typeChecker: nil,
5051
configState: make(map[store.Key]*store.Resource),
5152
dispatcher: d,
5253
resolver: &resolver{}, // get an empty resolver
@@ -206,7 +207,8 @@ func TestController_workflow(t *testing.T) {
206207
c := &Controller{
207208
adapterInfo: adapterInfo,
208209
templateInfo: templateInfo,
209-
eval: nil,
210+
evaluator: nil,
211+
typeChecker: nil,
210212
configState: configState,
211213
dispatcher: d,
212214
resolver: res, // get an empty resolver

‎mixer/pkg/runtime/init.go

+5-4
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,13 @@ import (
3434
// New creates a new runtime Dispatcher
3535
// Create a new controller and a dispatcher.
3636
// Returns a ready to use dispatcher.
37-
func New(eval expr.Evaluator, gp *pool.GoroutinePool, handlerPool *pool.GoroutinePool,
37+
func New(eval expr.Evaluator, typeChecker expr.TypeChecker, gp *pool.GoroutinePool, handlerPool *pool.GoroutinePool,
3838
identityAttribute string, defaultConfigNamespace string,
3939
s store.Store2, adapterInfo map[string]*adapter.Info,
4040
templateInfo map[string]template.Info) (Dispatcher, error) {
4141
// controller will set Resolver before the dispatcher is used.
4242
d := newDispatcher(eval, nil, gp, identityAttribute)
43-
err := startController(s, adapterInfo, templateInfo, eval, d,
43+
err := startController(s, adapterInfo, templateInfo, eval, typeChecker, d,
4444
identityAttribute, defaultConfigNamespace, handlerPool)
4545

4646
return d, err
@@ -86,7 +86,7 @@ func kindMap(adapterInfo map[string]*adapter.Info,
8686

8787
// startController creates a controller from the given params.
8888
func startController(s store.Store2, adapterInfo map[string]*adapter.Info,
89-
templateInfo map[string]template.Info, eval expr.Evaluator,
89+
templateInfo map[string]template.Info, eval expr.Evaluator, checker expr.TypeChecker,
9090
dispatcher ResolverChangeListener,
9191
identityAttribute string, defaultConfigNamespace string, handlerPool *pool.GoroutinePool) error {
9292

@@ -98,7 +98,8 @@ func startController(s store.Store2, adapterInfo map[string]*adapter.Info,
9898
c := &Controller{
9999
adapterInfo: adapterInfo,
100100
templateInfo: templateInfo,
101-
eval: eval,
101+
evaluator: eval,
102+
typeChecker: checker,
102103
configState: data,
103104
dispatcher: dispatcher,
104105
resolver: &resolver{}, // get an empty resolver

‎mixer/pkg/runtime/resolver.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ func (r Rule) String() string {
5151
// resolver is the runtime view of the configuration database.
5252
type resolver struct {
5353
// evaluator evaluates selectors
54-
evaluator expr.PredicateEvaluator
54+
evaluator expr.Evaluator
5555

5656
// identityAttribute defines which configuration scopes apply to a request.
5757
// default: target.service
@@ -75,7 +75,7 @@ type resolver struct {
7575
}
7676

7777
// newResolver returns a Resolver.
78-
func newResolver(evaluator expr.PredicateEvaluator, identityAttribute string, defaultConfigNamespace string,
78+
func newResolver(evaluator expr.Evaluator, identityAttribute string, defaultConfigNamespace string,
7979
rules map[string][]*Rule, id int) *resolver {
8080
return &resolver{
8181
evaluator: evaluator,

‎mixer/pkg/runtime/resolver_test.go

+4
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,10 @@ func fakePred(reject bool, err string) *fakePredEval {
185185
return f
186186
}
187187

188+
func (f *fakePredEval) Eval(expr string, bag attribute.Bag) (interface{}, error) {
189+
return f.EvalPredicate(expr, bag)
190+
}
191+
188192
func (f *fakePredEval) EvalPredicate(expr string, _ attribute.Bag) (bool, error) {
189193
return !f.reject, f.err
190194
}

0 commit comments

Comments
 (0)
Please sign in to comment.