mirror of
https://github.com/kyverno/kyverno.git
synced 2025-03-06 16:06:56 +00:00
34 lines
940 B
Go
34 lines
940 B
Go
|
package resource
|
||
|
|
||
|
import (
|
||
|
"k8s.io/apimachinery/pkg/runtime/schema"
|
||
|
"k8s.io/apiserver/pkg/cel"
|
||
|
"k8s.io/apiserver/pkg/cel/common"
|
||
|
"k8s.io/apiserver/pkg/cel/openapi"
|
||
|
"k8s.io/kube-openapi/pkg/validation/spec"
|
||
|
)
|
||
|
|
||
|
// https://pkg.go.dev/k8s.io/apiserver@v0.32.0/pkg/cel/openapi/resolver#ClientDiscoveryResolver
|
||
|
type SchemaClient interface {
|
||
|
ResolveSchema(gvk schema.GroupVersionKind) (*spec.Schema, error)
|
||
|
}
|
||
|
|
||
|
type OpenAPITypeResolver struct {
|
||
|
client SchemaClient
|
||
|
}
|
||
|
|
||
|
func (o *OpenAPITypeResolver) GetDeclProvier(gvk schema.GroupVersionKind, typeName string) (*cel.DeclTypeProvider, error) {
|
||
|
spec, err := o.client.ResolveSchema(gvk)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
schema := common.SchemaDeclType(&openapi.Schema{Schema: spec}, true)
|
||
|
|
||
|
return cel.NewDeclTypeProvider(schema.MaybeAssignTypeName(typeName)), nil
|
||
|
}
|
||
|
|
||
|
func NewOpenAPITypeResolver(client SchemaClient) *OpenAPITypeResolver {
|
||
|
return &OpenAPITypeResolver{client: client}
|
||
|
}
|