pkg/function/inputs.go (59 lines of code) (raw):
package function
import (
"encoding/json"
"errors"
"fmt"
"io"
"os"
krmv1 "github.com/Azure/eno/pkg/krm/functions/api/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/runtime"
"sigs.k8s.io/controller-runtime/pkg/client"
)
type InputReader struct {
resources *krmv1.ResourceList
}
func NewDefaultInputReader() (*InputReader, error) {
return NewInputReader(os.Stdin)
}
func NewInputReader(r io.Reader) (*InputReader, error) {
rl := krmv1.ResourceList{}
err := json.NewDecoder(r).Decode(&rl)
if err != nil && !errors.Is(err, io.EOF) {
return nil, fmt.Errorf("decoding stdin as krm resource list: %w", err)
}
return &InputReader{
resources: &rl,
}, nil
}
func ReadInput[T client.Object](ir *InputReader, key string, out T) error {
var found bool
for _, i := range ir.resources.Items {
i := i
if getKey(i) == key {
err := runtime.DefaultUnstructuredConverter.FromUnstructured(i.Object, out)
if err != nil {
return fmt.Errorf("converting item to Input: %w", err)
}
found = true
break
}
}
if !found {
return fmt.Errorf("input %q was not found", key)
}
return nil
}
func (i *InputReader) All() map[string]*unstructured.Unstructured {
m := map[string]*unstructured.Unstructured{}
for _, o := range i.resources.Items {
m[getKey(o)] = o
}
return m
}
func getKey(obj client.Object) string {
if obj.GetAnnotations() == nil {
return ""
}
return obj.GetAnnotations()["eno.azure.io/input-key"]
}