volcano.sh/volcano@v1.9.0/pkg/controllers/job/helpers/helpers_test.go (about) 1 /* 2 Copyright 2021 The Volcano 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 helpers 18 19 import ( 20 "testing" 21 "time" 22 23 v1 "k8s.io/api/core/v1" 24 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 25 26 batch "volcano.sh/apis/pkg/apis/batch/v1alpha1" 27 "volcano.sh/volcano/pkg/scheduler/api" 28 ) 29 30 func TestCompareTask(t *testing.T) { 31 createTime := time.Now() 32 items := []struct { 33 lv *api.TaskInfo 34 rv *api.TaskInfo 35 expect bool 36 }{ 37 { 38 generateTaskInfo("prod-worker-21", createTime), 39 generateTaskInfo("prod-worker-1", createTime), 40 false, 41 }, 42 { 43 generateTaskInfo("prod-worker-0", createTime), 44 generateTaskInfo("prod-worker-3", createTime), 45 true, 46 }, 47 { 48 generateTaskInfo("prod-worker", createTime), 49 generateTaskInfo("prod-worker-3", createTime.Add(time.Hour)), 50 true, 51 }, 52 { 53 generateTaskInfo("prod-worker", createTime), 54 generateTaskInfo("prod-worker-3", createTime.Add(-time.Hour)), 55 false, 56 }, 57 } 58 59 for i, item := range items { 60 if value := CompareTask(item.lv, item.rv); value != item.expect { 61 t.Errorf("case %d: expected: %v, got %v", i, item.expect, value) 62 } 63 } 64 } 65 66 func generateTaskInfo(name string, createTime time.Time) *api.TaskInfo { 67 pod := &v1.Pod{ 68 ObjectMeta: metav1.ObjectMeta{ 69 Name: name, 70 CreationTimestamp: metav1.Time{Time: createTime}, 71 }, 72 } 73 return &api.TaskInfo{ 74 Name: name, 75 Pod: pod, 76 } 77 } 78 79 func TestGetTasklndexUnderJobFunc(t *testing.T) { 80 namespace := "test" 81 testCases := []struct { 82 Name string 83 TaskName string 84 Job *batch.Job 85 Expect int 86 }{ 87 { 88 Name: "GetTasklndexUnderJob1", 89 TaskName: "task1", 90 Job: &batch.Job{ 91 ObjectMeta: metav1.ObjectMeta{ 92 Name: "job1", 93 Namespace: namespace, 94 }, 95 Spec: batch.JobSpec{ 96 Tasks: []batch.TaskSpec{ 97 { 98 Name: "task1", 99 Replicas: 2, 100 Template: v1.PodTemplateSpec{ 101 ObjectMeta: metav1.ObjectMeta{ 102 Name: "pods", 103 Namespace: namespace, 104 }, 105 Spec: v1.PodSpec{ 106 Containers: []v1.Container{ 107 { 108 Name: "Containers", 109 }, 110 }, 111 }, 112 }, 113 }, 114 { 115 Name: "task2", 116 Replicas: 2, 117 Template: v1.PodTemplateSpec{ 118 ObjectMeta: metav1.ObjectMeta{ 119 Name: "pods", 120 Namespace: namespace, 121 }, 122 Spec: v1.PodSpec{ 123 Containers: []v1.Container{ 124 { 125 Name: "Containers", 126 }, 127 }, 128 }, 129 }, 130 }, 131 }, 132 }, 133 }, 134 Expect: 0, 135 }, 136 { 137 Name: "GetTasklndexUnderJob2", 138 TaskName: "task2", 139 Job: &batch.Job{ 140 ObjectMeta: metav1.ObjectMeta{ 141 Name: "job1", 142 Namespace: namespace, 143 }, 144 Spec: batch.JobSpec{ 145 Tasks: []batch.TaskSpec{ 146 { 147 Name: "task1", 148 Replicas: 2, 149 Template: v1.PodTemplateSpec{ 150 ObjectMeta: metav1.ObjectMeta{ 151 Name: "pods", 152 Namespace: namespace, 153 }, 154 Spec: v1.PodSpec{ 155 Containers: []v1.Container{ 156 { 157 Name: "Containers", 158 }, 159 }, 160 }, 161 }, 162 }, 163 { 164 Name: "task2", 165 Replicas: 2, 166 Template: v1.PodTemplateSpec{ 167 ObjectMeta: metav1.ObjectMeta{ 168 Name: "pods", 169 Namespace: namespace, 170 }, 171 Spec: v1.PodSpec{ 172 Containers: []v1.Container{ 173 { 174 Name: "Containers", 175 }, 176 }, 177 }, 178 }, 179 }, 180 }, 181 }, 182 }, 183 Expect: 1, 184 }, 185 } 186 187 for _, testCase := range testCases { 188 t.Run(testCase.Name, func(t *testing.T) { 189 index := GetTaskIndexUnderJob(testCase.TaskName, testCase.Job) 190 if index != testCase.Expect { 191 t.Errorf("GetTasklndexUnderJobFunc(%s) = %d, expect %d", testCase.TaskName, index, testCase.Expect) 192 } 193 }) 194 } 195 } 196 197 func TestGetPodsNameUnderTaskFunc(t *testing.T) { 198 namespace := "test" 199 testCases := []struct { 200 Name string 201 TaskName string 202 Job *batch.Job 203 Expect []string 204 }{ 205 { 206 Name: "GetTasklndexUnderJob1", 207 TaskName: "task1", 208 Job: &batch.Job{ 209 ObjectMeta: metav1.ObjectMeta{ 210 Name: "job1", 211 Namespace: namespace, 212 }, 213 Spec: batch.JobSpec{ 214 Tasks: []batch.TaskSpec{ 215 { 216 Name: "task1", 217 Replicas: 2, 218 Template: v1.PodTemplateSpec{ 219 ObjectMeta: metav1.ObjectMeta{ 220 Name: "pods1", 221 Namespace: namespace, 222 }, 223 Spec: v1.PodSpec{ 224 Containers: []v1.Container{ 225 { 226 Name: "Containers", 227 }, 228 }, 229 }, 230 }, 231 }, 232 { 233 Name: "task2", 234 Replicas: 2, 235 Template: v1.PodTemplateSpec{ 236 ObjectMeta: metav1.ObjectMeta{ 237 Name: "pods2", 238 Namespace: namespace, 239 }, 240 Spec: v1.PodSpec{ 241 Containers: []v1.Container{ 242 { 243 Name: "Containers", 244 }, 245 }, 246 }, 247 }, 248 }, 249 }, 250 }, 251 }, 252 Expect: []string{"job1-task1-0", "job1-task1-1"}, 253 }, 254 { 255 Name: "GetTasklndexUnderJob2", 256 TaskName: "task2", 257 Job: &batch.Job{ 258 ObjectMeta: metav1.ObjectMeta{ 259 Name: "job1", 260 Namespace: namespace, 261 }, 262 Spec: batch.JobSpec{ 263 Tasks: []batch.TaskSpec{ 264 { 265 Name: "task1", 266 Replicas: 2, 267 Template: v1.PodTemplateSpec{ 268 ObjectMeta: metav1.ObjectMeta{ 269 Name: "pods1", 270 Namespace: namespace, 271 }, 272 Spec: v1.PodSpec{ 273 Containers: []v1.Container{ 274 { 275 Name: "Containers", 276 }, 277 }, 278 }, 279 }, 280 }, 281 { 282 Name: "task2", 283 Replicas: 2, 284 Template: v1.PodTemplateSpec{ 285 ObjectMeta: metav1.ObjectMeta{ 286 Name: "pods2", 287 Namespace: namespace, 288 }, 289 Spec: v1.PodSpec{ 290 Containers: []v1.Container{ 291 { 292 Name: "Containers", 293 }, 294 }, 295 }, 296 }, 297 }, 298 }, 299 }, 300 }, 301 Expect: []string{"job1-task2-0", "job1-task2-1"}, 302 }, 303 } 304 305 for _, testCase := range testCases { 306 t.Run(testCase.Name, func(t *testing.T) { 307 pods := GetPodsNameUnderTask(testCase.TaskName, testCase.Job) 308 for _, pod := range pods { 309 if !contains(testCase.Expect, pod) { 310 t.Errorf("Test case failed: %s, expect: %v, got: %v", testCase.Name, testCase.Expect, pods) 311 } 312 } 313 }) 314 } 315 } 316 317 func contains(s []string, e string) bool { 318 for _, a := range s { 319 if a == e { 320 return true 321 } 322 } 323 return false 324 }