63 lines
1.1 KiB
Go
63 lines
1.1 KiB
Go
package resource
|
|
|
|
import (
|
|
"bytes"
|
|
"errors"
|
|
"fmt"
|
|
"io"
|
|
|
|
"go.uber.org/zap"
|
|
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
|
|
k8syaml "k8s.io/apimachinery/pkg/util/yaml"
|
|
)
|
|
|
|
func ParseManifest(manifest []byte, defaultNamespace string, logger *zap.SugaredLogger) ([]Resource, error) {
|
|
var resources []Resource
|
|
|
|
decoder := k8syaml.NewYAMLOrJSONDecoder(bytes.NewReader(manifest), 4096)
|
|
|
|
for {
|
|
var obj unstructured.Unstructured
|
|
err := decoder.Decode(&obj)
|
|
if err != nil {
|
|
if errors.Is(err, io.EOF) {
|
|
break
|
|
}
|
|
return nil, fmt.Errorf("failed to decode manifest: %w", err)
|
|
}
|
|
|
|
if len(obj.Object) == 0 {
|
|
continue
|
|
}
|
|
|
|
kind := obj.GetKind()
|
|
if kind == "" {
|
|
if logger != nil {
|
|
logger.Debugf("Skipping resource without kind")
|
|
}
|
|
continue
|
|
}
|
|
|
|
name := obj.GetName()
|
|
if name == "" {
|
|
if logger != nil {
|
|
logger.Debugf("Skipping %s resource without name", kind)
|
|
}
|
|
continue
|
|
}
|
|
|
|
namespace := obj.GetNamespace()
|
|
if namespace == "" {
|
|
namespace = defaultNamespace
|
|
}
|
|
|
|
resources = append(resources, Resource{
|
|
Kind: kind,
|
|
Name: name,
|
|
Namespace: namespace,
|
|
})
|
|
}
|
|
|
|
return resources, nil
|
|
}
|