Skip to content

Commit f8df39c

Browse files
Merge pull request #220 from bharath-b-rh/cm-235-istio-csr
CM-418,CM-419: Adds new istio-csr CRD and controller to manage lifecycle for the CR
2 parents 6fbe831 + 99f9aa9 commit f8df39c

81 files changed

Lines changed: 13278 additions & 5 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package v1alpha1
2+
3+
import (
4+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
5+
)
6+
7+
const (
8+
// Degraded is the condition type used to inform state of the operator when
9+
// it has failed with irrecoverable error like permission issues.
10+
// DebugEnabled has the following options:
11+
// Status:
12+
// - True
13+
// - False
14+
// Reason:
15+
// - Failed
16+
Degraded string = "Degraded"
17+
18+
// Ready is the condition type used to inform state of readiness of the
19+
// operator to process istio-csr enabling requests.
20+
// Status:
21+
// - True
22+
// - False
23+
// Reason:
24+
// - Progressing
25+
// - Failed
26+
// - Ready: operand successfully deployed and ready
27+
Ready string = "Ready"
28+
)
29+
30+
const (
31+
ReasonFailed string = "Failed"
32+
33+
ReasonReady string = "Ready"
34+
35+
ReasonInProgress string = "Progressing"
36+
)
37+
38+
func (c *ConditionalStatus) GetCondition(t string) *metav1.Condition {
39+
for i, cond := range c.Conditions {
40+
if cond.Type == t {
41+
return &c.Conditions[i]
42+
}
43+
}
44+
return nil
45+
}
46+
47+
func (c *ConditionalStatus) SetCondition(t string, cs metav1.ConditionStatus, reason, msg string) bool {
48+
condition := c.GetCondition(t)
49+
if condition == nil {
50+
c.Conditions = append(c.Conditions, metav1.Condition{
51+
Type: t,
52+
Status: cs,
53+
LastTransitionTime: metav1.Now(),
54+
Reason: reason,
55+
Message: msg,
56+
})
57+
return true
58+
}
59+
if condition.Status != cs || condition.Reason != reason {
60+
condition.Status = cs
61+
condition.LastTransitionTime = metav1.Now()
62+
condition.Reason = reason
63+
condition.Message = msg
64+
return true
65+
}
66+
return false
67+
}
Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
1+
package v1alpha1
2+
3+
import (
4+
"reflect"
5+
"testing"
6+
7+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
8+
)
9+
10+
func TestGetCondition(t *testing.T) {
11+
tests := []struct {
12+
name string
13+
conditionalStatus ConditionalStatus
14+
condition string
15+
expectedCondition *metav1.Condition
16+
}{
17+
{
18+
name: "requested condition present",
19+
conditionalStatus: ConditionalStatus{
20+
Conditions: []metav1.Condition{
21+
{
22+
Type: Ready,
23+
Status: metav1.ConditionTrue,
24+
Reason: ReasonReady,
25+
},
26+
{
27+
Type: Degraded,
28+
Status: metav1.ConditionFalse,
29+
Reason: ReasonReady,
30+
},
31+
},
32+
},
33+
condition: Ready,
34+
expectedCondition: &metav1.Condition{
35+
Type: Ready,
36+
Status: metav1.ConditionTrue,
37+
Reason: ReasonReady,
38+
},
39+
},
40+
{
41+
name: "requested condition not present",
42+
conditionalStatus: ConditionalStatus{
43+
Conditions: []metav1.Condition{
44+
{
45+
Type: Ready,
46+
Status: metav1.ConditionTrue,
47+
Reason: ReasonReady,
48+
},
49+
{
50+
Type: Degraded,
51+
Status: metav1.ConditionFalse,
52+
Reason: ReasonReady,
53+
},
54+
},
55+
},
56+
condition: "TestCondition",
57+
expectedCondition: nil,
58+
},
59+
}
60+
61+
for _, tt := range tests {
62+
t.Run(tt.name, func(t *testing.T) {
63+
cond := tt.conditionalStatus.GetCondition(tt.condition)
64+
if !reflect.DeepEqual(tt.expectedCondition, cond) {
65+
t.Errorf("GetCondition() condition: %v, expectedCondition: %v", cond, tt.expectedCondition)
66+
}
67+
})
68+
}
69+
}
70+
71+
func TestSetCondition(t *testing.T) {
72+
tests := []struct {
73+
name string
74+
conditionalStatus ConditionalStatus
75+
condition string
76+
conditionStatus metav1.ConditionStatus
77+
conditionReason string
78+
conditionMessage string
79+
conditionUpdated bool
80+
}{
81+
{
82+
name: "condition does not exist",
83+
conditionalStatus: ConditionalStatus{
84+
Conditions: []metav1.Condition{
85+
{
86+
Type: Degraded,
87+
Status: metav1.ConditionFalse,
88+
Reason: ReasonReady,
89+
},
90+
},
91+
},
92+
condition: Ready,
93+
conditionStatus: metav1.ConditionTrue,
94+
conditionReason: ReasonReady,
95+
conditionUpdated: true,
96+
},
97+
{
98+
name: "condition exists and status changed",
99+
conditionalStatus: ConditionalStatus{
100+
Conditions: []metav1.Condition{
101+
{
102+
Type: Ready,
103+
Status: metav1.ConditionTrue,
104+
Reason: ReasonReady,
105+
},
106+
{
107+
Type: Degraded,
108+
Status: metav1.ConditionFalse,
109+
Reason: ReasonReady,
110+
},
111+
},
112+
},
113+
condition: Ready,
114+
conditionStatus: metav1.ConditionFalse,
115+
conditionReason: ReasonReady,
116+
conditionUpdated: true,
117+
},
118+
{
119+
name: "condition exists and no new change",
120+
conditionalStatus: ConditionalStatus{
121+
Conditions: []metav1.Condition{
122+
{
123+
Type: Ready,
124+
Status: metav1.ConditionTrue,
125+
Reason: ReasonReady,
126+
},
127+
{
128+
Type: Degraded,
129+
Status: metav1.ConditionFalse,
130+
Reason: ReasonReady,
131+
},
132+
},
133+
},
134+
condition: Ready,
135+
conditionStatus: metav1.ConditionTrue,
136+
conditionReason: ReasonReady,
137+
conditionUpdated: false,
138+
},
139+
}
140+
141+
for _, tt := range tests {
142+
t.Run(tt.name, func(t *testing.T) {
143+
updated := tt.conditionalStatus.SetCondition(tt.condition, tt.conditionStatus, tt.conditionReason, tt.conditionMessage)
144+
if updated != tt.conditionUpdated {
145+
t.Errorf("SetCondition() updated: %v, conditionUpdated: %v", updated, tt.conditionUpdated)
146+
}
147+
})
148+
}
149+
}

0 commit comments

Comments
 (0)