From 4046315dac616d2bff6dab54a123d8aec79e558a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Charles-Edouard=20Br=C3=A9t=C3=A9ch=C3=A9?= Date: Thu, 21 Sep 2023 11:34:38 +0200 Subject: [PATCH] feat: add a package to convert unstructured into typed (#8484) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Charles-Edouard Brétéché --- .../_testdata/resources/namespace.yaml | 6 +++ .../resource/convert/convert.go | 18 ++++++++ .../resource/convert/convert_test.go | 42 +++++++++++++++++++ 3 files changed, 66 insertions(+) create mode 100644 cmd/cli/kubectl-kyverno/_testdata/resources/namespace.yaml create mode 100644 cmd/cli/kubectl-kyverno/resource/convert/convert.go create mode 100644 cmd/cli/kubectl-kyverno/resource/convert/convert_test.go diff --git a/cmd/cli/kubectl-kyverno/_testdata/resources/namespace.yaml b/cmd/cli/kubectl-kyverno/_testdata/resources/namespace.yaml new file mode 100644 index 0000000000..67744f627d --- /dev/null +++ b/cmd/cli/kubectl-kyverno/_testdata/resources/namespace.yaml @@ -0,0 +1,6 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: prod-bus-app1 + labels: + purpose: production diff --git a/cmd/cli/kubectl-kyverno/resource/convert/convert.go b/cmd/cli/kubectl-kyverno/resource/convert/convert.go new file mode 100644 index 0000000000..876c2c76d1 --- /dev/null +++ b/cmd/cli/kubectl-kyverno/resource/convert/convert.go @@ -0,0 +1,18 @@ +package convert + +import ( + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/runtime" +) + +func Into[T any](untyped unstructured.Unstructured, result *T) error { + return runtime.DefaultUnstructuredConverter.FromUnstructuredWithValidation(untyped.UnstructuredContent(), result, true) +} + +func To[T any](untyped unstructured.Unstructured) (*T, error) { + var result T + if err := Into(untyped, &result); err != nil { + return nil, err + } + return &result, nil +} diff --git a/cmd/cli/kubectl-kyverno/resource/convert/convert_test.go b/cmd/cli/kubectl-kyverno/resource/convert/convert_test.go new file mode 100644 index 0000000000..1b7a9d9db1 --- /dev/null +++ b/cmd/cli/kubectl-kyverno/resource/convert/convert_test.go @@ -0,0 +1,42 @@ +package convert + +import ( + "os" + "testing" + + "github.com/stretchr/testify/require" + corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "sigs.k8s.io/yaml" +) + +func TestTo(t *testing.T) { + { + data, err := os.ReadFile("../../_testdata/policies/check-image.yaml") + require.NoError(t, err) + + json, err := yaml.YAMLToJSON(data) + require.NoError(t, err) + + var untyped unstructured.Unstructured + require.NoError(t, untyped.UnmarshalJSON(json)) + + typed, err := To[corev1.ConfigMap](untyped) + require.Nil(t, typed) + require.Error(t, err) + } + { + data, err := os.ReadFile("../../_testdata/resources/namespace.yaml") + require.NoError(t, err) + + json, err := yaml.YAMLToJSON(data) + require.NoError(t, err) + + var untyped unstructured.Unstructured + require.NoError(t, untyped.UnmarshalJSON(json)) + + typed, err := To[corev1.Namespace](untyped) + require.NotNil(t, typed) + require.NoError(t, err) + } +}