1
2
3
4 package statusreaders
5
6 import (
7 "context"
8 "fmt"
9 "testing"
10
11 "github.com/stretchr/testify/assert"
12 v1 "k8s.io/api/apps/v1"
13 "k8s.io/apimachinery/pkg/api/meta"
14 "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
15 "k8s.io/apimachinery/pkg/runtime/schema"
16 fakecr "sigs.k8s.io/cli-utils/pkg/kstatus/polling/clusterreader/fake"
17 "sigs.k8s.io/cli-utils/pkg/kstatus/polling/engine"
18 "sigs.k8s.io/cli-utils/pkg/kstatus/polling/event"
19 "sigs.k8s.io/cli-utils/pkg/kstatus/status"
20 "sigs.k8s.io/cli-utils/pkg/object"
21 fakemapper "sigs.k8s.io/cli-utils/pkg/testutil"
22 )
23
24 func TestPodControllerStatusReader(t *testing.T) {
25 rsGVK = v1.SchemeGroupVersion.WithKind("ReplicaSet")
26 name := "Foo"
27 namespace := "Bar"
28
29 testCases := map[string]struct {
30 computeStatusResult *status.Result
31 computeStatusErr error
32 genResourceStatuses event.ResourceStatuses
33 expectedIdentifier object.ObjMetadata
34 expectedStatus status.Status
35 }{
36 "successfully computes status": {
37 computeStatusResult: &status.Result{
38 Status: status.InProgressStatus,
39 Message: "this is a test",
40 },
41 expectedIdentifier: object.ObjMetadata{
42 GroupKind: rsGVK.GroupKind(),
43 Name: name,
44 Namespace: namespace,
45 },
46 expectedStatus: status.InProgressStatus,
47 },
48 "computing status fails": {
49 computeStatusErr: fmt.Errorf("this error is a test"),
50 expectedIdentifier: object.ObjMetadata{
51 GroupKind: rsGVK.GroupKind(),
52 Name: name,
53 Namespace: namespace,
54 },
55 expectedStatus: status.UnknownStatus,
56 },
57 "one of the pods has failed status": {
58 computeStatusResult: &status.Result{
59 Status: status.InProgressStatus,
60 Message: "this is a test",
61 },
62 genResourceStatuses: event.ResourceStatuses{
63 {
64 Status: status.CurrentStatus,
65 },
66 {
67 Status: status.InProgressStatus,
68 },
69 {
70 Status: status.FailedStatus,
71 },
72 },
73 expectedIdentifier: object.ObjMetadata{
74 GroupKind: rsGVK.GroupKind(),
75 Name: name,
76 Namespace: namespace,
77 },
78 expectedStatus: status.FailedStatus,
79 },
80 }
81
82 for tn, tc := range testCases {
83 t.Run(tn, func(t *testing.T) {
84 fakeReader := fakecr.NewNoopClusterReader()
85 fakeMapper := fakemapper.NewFakeRESTMapper()
86 podControllerStatusReader := &podControllerStatusReader{
87 mapper: fakeMapper,
88 statusFunc: func(u *unstructured.Unstructured) (*status.Result, error) {
89 return tc.computeStatusResult, tc.computeStatusErr
90 },
91 statusForGenResourcesFunc: fakeStatusForGenResourcesFunc(tc.genResourceStatuses, nil),
92 }
93
94 rs := &unstructured.Unstructured{}
95 rs.SetGroupVersionKind(rsGVK)
96 rs.SetName(name)
97 rs.SetNamespace(namespace)
98
99 resourceStatus, err := podControllerStatusReader.readStatus(context.Background(), fakeReader, rs)
100
101 assert.NoError(t, err)
102 assert.Equal(t, tc.expectedIdentifier, resourceStatus.Identifier)
103 assert.Equal(t, tc.expectedStatus, resourceStatus.Status)
104 })
105 }
106 }
107
108 func fakeStatusForGenResourcesFunc(resourceStatuses event.ResourceStatuses, err error) statusForGenResourcesFunc {
109 return func(_ context.Context, _ meta.RESTMapper, _ engine.ClusterReader, _ resourceTypeStatusReader,
110 _ *unstructured.Unstructured, _ schema.GroupKind, _ ...string) (event.ResourceStatuses, error) {
111 return resourceStatuses, err
112 }
113 }
114
View as plain text