github.imxd.top/operator-framework/operator-sdk@v0.8.2/pkg/ansible/controller/status/utils_test.go (about) 1 // Copyright 2018 The Operator-SDK Authors 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package status 16 17 import ( 18 "reflect" 19 "testing" 20 21 "k8s.io/api/core/v1" 22 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 23 ) 24 25 func TestNewCondition(t *testing.T) { 26 testCases := []struct { 27 name string 28 condType ConditionType 29 status v1.ConditionStatus 30 ansibleResult *AnsibleResult 31 reason string 32 message string 33 expectedCondtion Condition 34 }{ 35 { 36 name: "running condition creating", 37 condType: RunningConditionType, 38 status: v1.ConditionTrue, 39 ansibleResult: nil, 40 reason: RunningReason, 41 message: RunningMessage, 42 expectedCondtion: Condition{ 43 Type: RunningConditionType, 44 Status: v1.ConditionTrue, 45 Reason: RunningReason, 46 Message: RunningMessage, 47 }, 48 }, 49 { 50 name: "failure condition creating", 51 condType: FailureConditionType, 52 status: v1.ConditionFalse, 53 ansibleResult: &AnsibleResult{ 54 Changed: 0, 55 Failures: 1, 56 Ok: 10, 57 Skipped: 1, 58 }, 59 reason: FailedReason, 60 message: "invalid parameter", 61 expectedCondtion: Condition{ 62 Type: FailureConditionType, 63 Status: v1.ConditionFalse, 64 Reason: FailedReason, 65 Message: "invalid parameter", 66 AnsibleResult: &AnsibleResult{ 67 Changed: 0, 68 Failures: 1, 69 Ok: 10, 70 Skipped: 1, 71 }, 72 }, 73 }, 74 } 75 76 for _, tc := range testCases { 77 t.Run(tc.name, func(t *testing.T) { 78 ac := NewCondition(tc.condType, tc.status, tc.ansibleResult, tc.reason, tc.message) 79 tc.expectedCondtion.LastTransitionTime = ac.LastTransitionTime 80 if !reflect.DeepEqual(*ac, tc.expectedCondtion) { 81 t.Fatalf("Condition did no match expected:\nActual: %#v\nExpected: %#v", *ac, tc.expectedCondtion) 82 } 83 }) 84 } 85 } 86 87 func TestGetCondition(t *testing.T) { 88 testCases := []struct { 89 name string 90 condType ConditionType 91 status Status 92 expectedCondition *Condition 93 }{ 94 { 95 name: "find RunningCondition", 96 condType: RunningConditionType, 97 status: Status{ 98 Conditions: []Condition{ 99 Condition{ 100 Type: RunningConditionType, 101 }, 102 }, 103 }, 104 expectedCondition: &Condition{ 105 Type: RunningConditionType, 106 }, 107 }, 108 { 109 name: "did not find RunningCondition", 110 condType: RunningConditionType, 111 status: Status{ 112 Conditions: []Condition{ 113 Condition{ 114 Type: FailureConditionType, 115 }, 116 }, 117 }, 118 expectedCondition: nil, 119 }, 120 { 121 name: "find FailureCondition", 122 condType: FailureConditionType, 123 status: Status{ 124 Conditions: []Condition{ 125 Condition{ 126 Type: FailureConditionType, 127 }, 128 }, 129 }, 130 expectedCondition: &Condition{ 131 Type: FailureConditionType, 132 }, 133 }, 134 { 135 name: "did not find FailureCondition", 136 condType: FailureConditionType, 137 status: Status{ 138 Conditions: []Condition{ 139 Condition{ 140 Type: RunningConditionType, 141 }, 142 }, 143 }, 144 expectedCondition: nil, 145 }, 146 } 147 148 for _, tc := range testCases { 149 t.Run(tc.name, func(t *testing.T) { 150 ac := GetCondition(tc.status, tc.condType) 151 if !reflect.DeepEqual(ac, tc.expectedCondition) { 152 t.Fatalf("Condition did no match expected:\nActual: %#v\nExpected: %#v", ac, tc.expectedCondition) 153 } 154 }) 155 } 156 } 157 158 func TestRemoveCondition(t *testing.T) { 159 testCases := []struct { 160 name string 161 condType ConditionType 162 status Status 163 expectedSize int 164 }{ 165 { 166 name: "remove RunningCondition", 167 condType: RunningConditionType, 168 status: Status{ 169 Conditions: []Condition{ 170 Condition{ 171 Type: RunningConditionType, 172 }, 173 }, 174 }, 175 expectedSize: 0, 176 }, 177 { 178 name: "did not find RunningCondition", 179 condType: RunningConditionType, 180 status: Status{ 181 Conditions: []Condition{ 182 Condition{ 183 Type: FailureConditionType, 184 }, 185 }, 186 }, 187 expectedSize: 1, 188 }, 189 { 190 name: "remove FailureCondition", 191 condType: FailureConditionType, 192 status: Status{ 193 Conditions: []Condition{ 194 Condition{ 195 Type: FailureConditionType, 196 }, 197 }, 198 }, 199 expectedSize: 0, 200 }, 201 { 202 name: "did not find FailureCondition", 203 condType: FailureConditionType, 204 status: Status{ 205 Conditions: []Condition{ 206 Condition{ 207 Type: RunningConditionType, 208 }, 209 }, 210 }, 211 expectedSize: 1, 212 }, 213 } 214 215 for _, tc := range testCases { 216 t.Run(tc.name, func(t *testing.T) { 217 RemoveCondition(&tc.status, tc.condType) 218 if tc.expectedSize != len(tc.status.Conditions) { 219 t.Fatalf("Conditions did no match expected size:\nActual: %#v\nExpected: %#v", len(tc.status.Conditions), tc.expectedSize) 220 } 221 }) 222 } 223 } 224 225 func TestSetCondition(t *testing.T) { 226 lastTransitionTime := metav1.Now() 227 keeptMessage := SuccessfulMessage 228 testCases := []struct { 229 name string 230 status *Status 231 condition *Condition 232 expectedNewSize int 233 keepLastTransitionTime bool 234 keepMessage bool 235 }{ 236 { 237 name: "add new condition", 238 status: &Status{ 239 Conditions: []Condition{}, 240 }, 241 condition: NewCondition(RunningConditionType, v1.ConditionTrue, nil, RunningReason, RunningMessage), 242 expectedNewSize: 1, 243 keepLastTransitionTime: false, 244 }, 245 { 246 name: "update running condition", 247 status: &Status{ 248 Conditions: []Condition{ 249 Condition{ 250 Type: RunningConditionType, 251 Status: v1.ConditionTrue, 252 Reason: SuccessfulReason, 253 Message: SuccessfulMessage, 254 LastTransitionTime: lastTransitionTime, 255 }, 256 }, 257 }, 258 condition: NewCondition(RunningConditionType, v1.ConditionTrue, nil, RunningReason, RunningMessage), 259 expectedNewSize: 1, 260 keepLastTransitionTime: true, 261 }, 262 { 263 name: "do not update running condition", 264 status: &Status{ 265 Conditions: []Condition{ 266 Condition{ 267 Type: RunningConditionType, 268 Status: v1.ConditionTrue, 269 Reason: RunningReason, 270 Message: SuccessfulMessage, 271 LastTransitionTime: lastTransitionTime, 272 }, 273 }, 274 }, 275 condition: NewCondition(RunningConditionType, v1.ConditionTrue, nil, RunningReason, RunningMessage), 276 expectedNewSize: 1, 277 keepLastTransitionTime: true, 278 keepMessage: true, 279 }, 280 } 281 282 for _, tc := range testCases { 283 t.Run(tc.name, func(t *testing.T) { 284 SetCondition(tc.status, *tc.condition) 285 if tc.expectedNewSize != len(tc.status.Conditions) { 286 t.Fatalf("New size of conditions did not match expected\nActual: %v\nExpected: %v", len(tc.status.Conditions), tc.expectedNewSize) 287 } 288 if tc.keepLastTransitionTime { 289 tc.condition.LastTransitionTime = lastTransitionTime 290 } 291 if tc.keepMessage { 292 tc.condition.Message = keeptMessage 293 } 294 ac := GetCondition(*tc.status, tc.condition.Type) 295 if !reflect.DeepEqual(ac, tc.condition) { 296 t.Fatalf("Condition did not match expected:\nActual: %#v\nExpected: %#v", ac, tc.condition) 297 } 298 }) 299 } 300 }