Allow envoy resources to implement custom error wrappers
Custom error wrappers allow additional context for more complex cases.
This commit is contained in:
@@ -62,6 +62,15 @@ func NewRbacRule(res *rbac.Rule, refRole, refRes *Ref, refResource string, refPa
|
||||
return r
|
||||
}
|
||||
|
||||
func (r *RbacRule) WrapError(act string, err error) error {
|
||||
return fmt.Errorf("%s %s %v: %s",
|
||||
act,
|
||||
r.ResourceType(),
|
||||
fmt.Sprintf("{ role: %s, resource: %s, operation: %s, access: %s }", r.RefRole.Identifiers.First(), r.RefResource, r.Res.Operation, r.Res.Access),
|
||||
err,
|
||||
)
|
||||
}
|
||||
|
||||
func (r *RbacRule) Resource() interface{} {
|
||||
return r.Res
|
||||
}
|
||||
|
||||
@@ -16,6 +16,10 @@ type (
|
||||
ReRef(old RefSet, new RefSet)
|
||||
}
|
||||
|
||||
ErrorWrapper interface {
|
||||
WrapError(act string, err error) error
|
||||
}
|
||||
|
||||
InterfaceSet []Interface
|
||||
|
||||
IdentifiableInterface interface {
|
||||
|
||||
@@ -216,7 +216,13 @@ func (se *storeEncoder) makePayload(ctx context.Context, s store.Storer, dal dal
|
||||
}
|
||||
|
||||
func (se *storeEncoder) WrapError(act string, res resource.Interface, err error) error {
|
||||
return fmt.Errorf("store encoder %s %s %v: %s", act, res.ResourceType(), res.Identifiers().StringSlice(), err)
|
||||
if ww, ok := res.(resource.ErrorWrapper); ok {
|
||||
err = ww.WrapError(act, err)
|
||||
} else {
|
||||
err = fmt.Errorf("%s %s %v: %s", act, res.ResourceType(), res.Identifiers().StringSlice(), err)
|
||||
}
|
||||
|
||||
return fmt.Errorf("store encoder %s", err)
|
||||
}
|
||||
|
||||
func resourceErrIdentifierNotUnique(i string) error {
|
||||
|
||||
@@ -373,7 +373,7 @@ func (n *rbacRule) makeRBACResource(pl *payload) (string, error) {
|
||||
|
||||
// @todo if we wish to support rbac for external stuff, this needs to pass through.
|
||||
// this also requires some tweaks in the path ID thing.
|
||||
return "", fmt.Errorf("unsupported resource type '%s' for RBAC store encode", n.rule.Resource)
|
||||
return "", fmt.Errorf("unsupported resource type '%s' for RBAC store encode", rt)
|
||||
}
|
||||
|
||||
func (n *rbacRule) handleComposeRecord(pp []resource.Interface) bool {
|
||||
|
||||
@@ -46,6 +46,7 @@ func (rr rbacRuleSet) decodeRbac(a rbac.Access, rules *yaml.Node) (oo rbacRuleSe
|
||||
res: &rbac.Rule{
|
||||
Access: a,
|
||||
Operation: op.Value,
|
||||
Resource: res,
|
||||
},
|
||||
refRole: resource.MakeRef(types.RoleResourceType, resource.MakeIdentifiers(roleRef)),
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user