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  }