2023-09-21 13:59:45 +02:00
|
|
|
package loader
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
|
|
|
|
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
|
2023-09-22 05:10:15 +02:00
|
|
|
"k8s.io/apimachinery/pkg/runtime/schema"
|
2023-09-21 13:59:45 +02:00
|
|
|
"k8s.io/client-go/openapi"
|
|
|
|
"sigs.k8s.io/kubectl-validate/pkg/validator"
|
|
|
|
)
|
|
|
|
|
|
|
|
type Loader interface {
|
2023-09-22 05:10:15 +02:00
|
|
|
Load([]byte) (schema.GroupVersionKind, unstructured.Unstructured, error)
|
2023-09-21 13:59:45 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
type loader struct {
|
|
|
|
validator *validator.Validator
|
|
|
|
}
|
|
|
|
|
|
|
|
func New(client openapi.Client) (Loader, error) {
|
|
|
|
factory, err := validator.New(client)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
return &loader{
|
|
|
|
validator: factory,
|
|
|
|
}, nil
|
|
|
|
}
|
|
|
|
|
2023-09-22 05:10:15 +02:00
|
|
|
func (l *loader) Load(document []byte) (schema.GroupVersionKind, unstructured.Unstructured, error) {
|
|
|
|
gvk, result, err := l.validator.Parse(document)
|
2023-09-21 13:59:45 +02:00
|
|
|
if err != nil {
|
2023-09-22 05:10:15 +02:00
|
|
|
return gvk, unstructured.Unstructured{}, fmt.Errorf("failed to parse document (%w)", err)
|
2023-09-21 13:59:45 +02:00
|
|
|
}
|
2023-09-27 21:08:03 +02:00
|
|
|
if err := l.validator.Validate(result); err != nil {
|
2023-09-22 05:10:15 +02:00
|
|
|
return gvk, unstructured.Unstructured{}, fmt.Errorf("failed to validate resource (%w)", err)
|
2023-09-21 13:59:45 +02:00
|
|
|
}
|
2023-09-22 05:10:15 +02:00
|
|
|
return gvk, *result, nil
|
2023-09-21 13:59:45 +02:00
|
|
|
}
|