k8s.io/kubernetes@v1.29.3/pkg/controller/volume/protectionutil/utils_test.go (about) 1 /* 2 Copyright 2019 The Kubernetes Authors. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package protectionutil 18 19 import ( 20 "testing" 21 22 "k8s.io/api/core/v1" 23 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 24 "k8s.io/kubernetes/pkg/volume/util" 25 ) 26 27 const ( 28 defaultNS = "default" 29 defaultPVCName = "pvc1" 30 defaultPVName = "pv1" 31 ) 32 33 type TestCase struct { 34 name string 35 obj metav1.Object 36 finalizer string 37 result bool 38 } 39 40 func pvc() *v1.PersistentVolumeClaim { 41 return &v1.PersistentVolumeClaim{ 42 ObjectMeta: metav1.ObjectMeta{ 43 Name: defaultPVCName, 44 Namespace: defaultNS, 45 }, 46 } 47 } 48 49 func pv() *v1.PersistentVolume { 50 return &v1.PersistentVolume{ 51 ObjectMeta: metav1.ObjectMeta{ 52 Name: defaultPVName, 53 }, 54 } 55 } 56 57 func TestIsDeletionCandidateLackDeleteTimeAndFinalizer(t *testing.T) { 58 59 tests := []TestCase{ 60 { 61 name: "pv lacks delete time and finalizer", 62 obj: pv(), 63 finalizer: util.PVProtectionFinalizer, 64 result: false, 65 }, 66 { 67 name: "pvc lacks delete time and finalizer", 68 obj: pvc(), 69 finalizer: util.PVCProtectionFinalizer, 70 71 result: false, 72 }, 73 } 74 for _, test := range tests { 75 if test.result != IsDeletionCandidate(test.obj, test.finalizer) { 76 t.Error(test.name) 77 } 78 } 79 } 80 81 func TestIsDeletionCandidateLackDeleteTime(t *testing.T) { 82 pv := pv() 83 pv.SetFinalizers([]string{util.PVProtectionFinalizer}) 84 pvc := pvc() 85 pvc.SetFinalizers([]string{util.PVCProtectionFinalizer}) 86 tests := []TestCase{ 87 { 88 name: "pv lacks delete time", 89 obj: pv, 90 finalizer: util.PVProtectionFinalizer, 91 result: false, 92 }, 93 { 94 name: "pvc lacks delete time", 95 obj: pvc, 96 finalizer: util.PVCProtectionFinalizer, 97 98 result: false, 99 }, 100 } 101 for _, test := range tests { 102 if test.result != IsDeletionCandidate(test.obj, test.finalizer) { 103 t.Error(test.name) 104 } 105 } 106 } 107 108 func TestIsDeletionCandidateLackFinalizer(t *testing.T) { 109 110 pv := pv() 111 pv.SetDeletionTimestamp(&metav1.Time{}) 112 pvc := pvc() 113 pvc.SetDeletionTimestamp(&metav1.Time{}) 114 tests := []TestCase{ 115 { 116 name: "pv lacks finalizer", 117 obj: pv, 118 finalizer: util.PVProtectionFinalizer, 119 result: false, 120 }, 121 { 122 name: "pvc lacks finalizer", 123 obj: pvc, 124 finalizer: util.PVCProtectionFinalizer, 125 result: false, 126 }, 127 } 128 for _, test := range tests { 129 if test.result != IsDeletionCandidate(test.obj, test.finalizer) { 130 t.Error(test.name) 131 } 132 } 133 } 134 135 func TestIsDeletionCandidateSuccess(t *testing.T) { 136 137 pv := pv() 138 pv.SetDeletionTimestamp(&metav1.Time{}) 139 pv.SetFinalizers([]string{util.PVProtectionFinalizer}) 140 pvc := pvc() 141 pvc.SetDeletionTimestamp(&metav1.Time{}) 142 pvc.SetFinalizers([]string{util.PVCProtectionFinalizer}) 143 144 tests := []TestCase{ 145 { 146 name: "pv is to delete", 147 obj: pv, 148 finalizer: util.PVProtectionFinalizer, 149 result: true, 150 }, 151 { 152 name: "pvc is to delete", 153 obj: pvc, 154 finalizer: util.PVCProtectionFinalizer, 155 result: true, 156 }, 157 } 158 for _, test := range tests { 159 if test.result != IsDeletionCandidate(test.obj, test.finalizer) { 160 t.Error(test.name) 161 } 162 } 163 } 164 165 func TestNeedToAddFinalizerHasDeleteTimeAndFinalizer(t *testing.T) { 166 pv := pv() 167 pv.SetDeletionTimestamp(&metav1.Time{}) 168 pv.SetFinalizers([]string{util.PVProtectionFinalizer}) 169 pvc := pvc() 170 pvc.SetDeletionTimestamp(&metav1.Time{}) 171 pvc.SetFinalizers([]string{util.PVCProtectionFinalizer}) 172 173 tests := []TestCase{ 174 { 175 name: "pv has delete time and finalizer", 176 obj: pv, 177 finalizer: util.PVProtectionFinalizer, 178 result: false, 179 }, 180 { 181 name: "pvc has delete time and finalizer", 182 obj: pvc, 183 finalizer: util.PVCProtectionFinalizer, 184 result: false, 185 }, 186 } 187 for _, test := range tests { 188 if test.result != NeedToAddFinalizer(test.obj, test.finalizer) { 189 t.Error(test.name) 190 } 191 } 192 } 193 194 func TestNeedToAddFinalizerHasDeleteTime(t *testing.T) { 195 pv := pv() 196 pv.SetDeletionTimestamp(&metav1.Time{}) 197 pvc := pvc() 198 pvc.SetDeletionTimestamp(&metav1.Time{}) 199 tests := []TestCase{ 200 { 201 name: "pv has delete", 202 obj: pv, 203 finalizer: util.PVProtectionFinalizer, 204 result: false, 205 }, 206 { 207 name: "pvc has delete", 208 obj: pvc, 209 finalizer: util.PVCProtectionFinalizer, 210 result: false, 211 }, 212 } 213 for _, test := range tests { 214 if test.result != NeedToAddFinalizer(test.obj, test.finalizer) { 215 t.Error(test.name) 216 } 217 } 218 } 219 220 func TestNeedToAddFinalizerHasFinalizer(t *testing.T) { 221 pv := pv() 222 pv.SetFinalizers([]string{util.PVProtectionFinalizer}) 223 pvc := pvc() 224 pvc.SetFinalizers([]string{util.PVCProtectionFinalizer}) 225 226 tests := []TestCase{ 227 { 228 name: "pv has finalizer", 229 obj: pv, 230 finalizer: util.PVProtectionFinalizer, 231 result: false, 232 }, 233 { 234 name: "pvc has finalizer", 235 obj: pvc, 236 finalizer: util.PVCProtectionFinalizer, 237 result: false, 238 }, 239 } 240 for _, test := range tests { 241 if test.result != NeedToAddFinalizer(test.obj, test.finalizer) { 242 t.Error(test.name) 243 } 244 } 245 } 246 247 func TestNeedToAddFinalizerSuccess(t *testing.T) { 248 tests := []TestCase{ 249 { 250 name: "pv needs add finalizer", 251 obj: pv(), 252 finalizer: util.PVProtectionFinalizer, 253 result: true, 254 }, 255 { 256 name: "pvc needs add finalizer", 257 obj: pvc(), 258 finalizer: util.PVCProtectionFinalizer, 259 result: true, 260 }, 261 } 262 for _, test := range tests { 263 if test.result != NeedToAddFinalizer(test.obj, test.finalizer) { 264 t.Error(test.name) 265 } 266 } 267 }