mirror of https://github.com/k3s-io/k3s
add union registry for quota
parent
ec6181d5d3
commit
a094a33560
|
@ -214,7 +214,7 @@ func (r *replenishmentControllerFactory) NewController(options *ReplenishmentCon
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
default:
|
default:
|
||||||
return nil, fmt.Errorf("no replenishment controller available for %s", options.GroupKind)
|
return nil, NewUnhandledGroupKindError(options.GroupKind)
|
||||||
}
|
}
|
||||||
return result, nil
|
return result, nil
|
||||||
}
|
}
|
||||||
|
@ -229,3 +229,38 @@ func ServiceReplenishmentUpdateFunc(options *ReplenishmentControllerOptions) fun
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type unhandledKindErr struct {
|
||||||
|
kind unversioned.GroupKind
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e unhandledKindErr) Error() string {
|
||||||
|
return fmt.Sprintf("no replenishment controller available for %s", e.kind)
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewUnhandledGroupKindError(kind unversioned.GroupKind) error {
|
||||||
|
return unhandledKindErr{kind: kind}
|
||||||
|
}
|
||||||
|
|
||||||
|
func IsUnhandledGroupKindError(err error) bool {
|
||||||
|
if err == nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
_, ok := err.(unhandledKindErr)
|
||||||
|
return ok
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnionReplenishmentControllerFactory iterates through its constituent factories ignoring, UnhandledGroupKindErrors
|
||||||
|
// returning the first success or failure it hits. If there are no hits either way, it return an UnhandledGroupKind error
|
||||||
|
type UnionReplenishmentControllerFactory []ReplenishmentControllerFactory
|
||||||
|
|
||||||
|
func (f UnionReplenishmentControllerFactory) NewController(options *ReplenishmentControllerOptions) (framework.ControllerInterface, error) {
|
||||||
|
for _, factory := range f {
|
||||||
|
controller, err := factory.NewController(options)
|
||||||
|
if !IsUnhandledGroupKindError(err) {
|
||||||
|
return controller, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil, NewUnhandledGroupKindError(options.GroupKind)
|
||||||
|
}
|
||||||
|
|
|
@ -64,3 +64,19 @@ type Registry interface {
|
||||||
// Evaluators returns the set Evaluator objects registered to a groupKind
|
// Evaluators returns the set Evaluator objects registered to a groupKind
|
||||||
Evaluators() map[unversioned.GroupKind]Evaluator
|
Evaluators() map[unversioned.GroupKind]Evaluator
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// UnionRegistry combines multiple registries. Order matters because first registry to claim a GroupKind
|
||||||
|
// is the "winner"
|
||||||
|
type UnionRegistry []Registry
|
||||||
|
|
||||||
|
func (r UnionRegistry) Evaluators() map[unversioned.GroupKind]Evaluator {
|
||||||
|
ret := map[unversioned.GroupKind]Evaluator{}
|
||||||
|
|
||||||
|
for i := len(r) - 1; i >= 0; i-- {
|
||||||
|
for k, v := range r[i].Evaluators() {
|
||||||
|
ret[k] = v
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue