Skip to content

Commit e9dd218

Browse files
author
Per Goncalves da Silva
committed
Harden ToUnstructured and add unit tests
Signed-off-by: Per Goncalves da Silva <[email protected]>
1 parent 7861571 commit e9dd218

File tree

3 files changed

+71
-11
lines changed

3 files changed

+71
-11
lines changed

internal/operator-controller/rukpak/render/certprovider_test.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66

77
"github.com/stretchr/testify/require"
88
corev1 "k8s.io/api/core/v1"
9+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
910
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
1011
"sigs.k8s.io/controller-runtime/pkg/client"
1112

@@ -36,7 +37,9 @@ func Test_CertificateProvisioner_WithCertProvider(t *testing.T) {
3637
return nil
3738
},
3839
AdditionalObjectsFn: func(cfg render.CertificateProvisionerConfig) ([]unstructured.Unstructured, error) {
39-
return []unstructured.Unstructured{*ToUnstructuredT(t, &corev1.Secret{})}, nil
40+
return []unstructured.Unstructured{*ToUnstructuredT(t, &corev1.Secret{
41+
TypeMeta: metav1.TypeMeta{Kind: "Secret", APIVersion: corev1.SchemeGroupVersion.String()},
42+
})}, nil
4043
},
4144
GetCertSecretInfoFn: func(cfg render.CertificateProvisionerConfig) render.CertSecretInfo {
4245
return render.CertSecretInfo{
@@ -59,7 +62,9 @@ func Test_CertificateProvisioner_WithCertProvider(t *testing.T) {
5962

6063
objs, err := provisioner.AdditionalObjects()
6164
require.NoError(t, err)
62-
require.Equal(t, []unstructured.Unstructured{*ToUnstructuredT(t, &corev1.Secret{})}, objs)
65+
require.Equal(t, []unstructured.Unstructured{*ToUnstructuredT(t, &corev1.Secret{
66+
TypeMeta: metav1.TypeMeta{Kind: "Secret", APIVersion: corev1.SchemeGroupVersion.String()},
67+
})}, objs)
6368

6469
require.Equal(t, &render.CertSecretInfo{
6570
SecretName: "some-secret",

internal/operator-controller/rukpak/util/util.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package util
22

33
import (
4+
"errors"
45
"fmt"
56
"io"
67

@@ -19,8 +20,20 @@ func ObjectNameForBaseAndSuffix(base string, suffix string) string {
1920
return fmt.Sprintf("%s-%s", base, suffix)
2021
}
2122

23+
// ToUnstructured converts obj into an Unstructured. It expects the obj's gvk to be defined. If it is not,
24+
// an error will be returned.
2225
func ToUnstructured(obj client.Object) (*unstructured.Unstructured, error) {
26+
if obj == nil {
27+
return nil, errors.New("object is nil")
28+
}
29+
2330
gvk := obj.GetObjectKind().GroupVersionKind()
31+
if len(gvk.Kind) == 0 {
32+
return nil, errors.New("object has no kind")
33+
}
34+
if len(gvk.Version) == 0 {
35+
return nil, errors.New("object has no version")
36+
}
2437

2538
var u unstructured.Unstructured
2639
uObj, err := runtime.DefaultUnstructuredConverter.ToUnstructured(obj)

internal/operator-controller/rukpak/util/util_test.go

Lines changed: 51 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -56,15 +56,6 @@ func TestMergeMaps(t *testing.T) {
5656
}
5757
}
5858

59-
// Mock reader for testing that always returns an error when Read is called
60-
type errorReader struct {
61-
io.Reader
62-
}
63-
64-
func (m errorReader) Read(p []byte) (int, error) {
65-
return 0, errors.New("Oh no!")
66-
}
67-
6859
func TestManifestObjects(t *testing.T) {
6960
tests := []struct {
7061
name string
@@ -152,3 +143,54 @@ spec:
152143
})
153144
}
154145
}
146+
147+
func Test_ToUnstructured(t *testing.T) {
148+
for _, tc := range []struct {
149+
name string
150+
obj client.Object
151+
err error
152+
}{
153+
{
154+
name: "converts object to unstructured",
155+
obj: &corev1.Service{
156+
TypeMeta: metav1.TypeMeta{Kind: "Service", APIVersion: "v1"},
157+
ObjectMeta: metav1.ObjectMeta{Name: "my-service", Namespace: "my-namespace"},
158+
},
159+
}, {
160+
name: "fails if object doesn't define kind",
161+
obj: &corev1.Service{
162+
TypeMeta: metav1.TypeMeta{Kind: "", APIVersion: "v1"},
163+
ObjectMeta: metav1.ObjectMeta{Name: "my-service", Namespace: "my-namespace"},
164+
},
165+
err: errors.New("object has no kind"),
166+
}, {
167+
name: "fails if object doesn't define version",
168+
obj: &corev1.Service{
169+
TypeMeta: metav1.TypeMeta{Kind: "Service", APIVersion: ""},
170+
ObjectMeta: metav1.ObjectMeta{Name: "my-service", Namespace: "my-namespace"},
171+
},
172+
err: errors.New("object has no version"),
173+
}, {
174+
name: "fails if object is nil",
175+
err: errors.New("object is nil"),
176+
},
177+
} {
178+
t.Run(tc.name, func(t *testing.T) {
179+
out, err := util.ToUnstructured(tc.obj)
180+
if tc.err != nil {
181+
require.Error(t, err)
182+
} else {
183+
assert.Equal(t, tc.obj.GetObjectKind().GroupVersionKind(), out.GroupVersionKind())
184+
}
185+
})
186+
}
187+
}
188+
189+
// Mock reader for testing that always returns an error when Read is called
190+
type errorReader struct {
191+
io.Reader
192+
}
193+
194+
func (m errorReader) Read(p []byte) (int, error) {
195+
return 0, errors.New("Oh no!")
196+
}

0 commit comments

Comments
 (0)