github.com/kubeflow/training-operator@v1.7.0/pkg/apis/kubeflow.org/v1/paddlepaddle_validation_test.go (about) 1 // Copyright 2022 The Kubeflow 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 v1 16 17 import ( 18 "testing" 19 20 corev1 "k8s.io/api/core/v1" 21 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 22 "k8s.io/utils/pointer" 23 ) 24 25 func TestValidateV1PaddleJob(t *testing.T) { 26 validPaddleReplicaSpecs := map[ReplicaType]*ReplicaSpec{ 27 PaddleJobReplicaTypeWorker: { 28 Replicas: pointer.Int32(2), 29 RestartPolicy: RestartPolicyNever, 30 Template: corev1.PodTemplateSpec{ 31 Spec: corev1.PodSpec{ 32 Containers: []corev1.Container{{ 33 Name: "paddle", 34 Image: "registry.baidubce.com/paddlepaddle/paddle:2.4.0rc0-cpu", 35 Command: []string{"python"}, 36 Args: []string{ 37 "-m", 38 "paddle.distributed.launch", 39 "run_check", 40 }, 41 Ports: []corev1.ContainerPort{{ 42 Name: "master", 43 ContainerPort: int32(37777), 44 }}, 45 ImagePullPolicy: corev1.PullAlways, 46 }}, 47 }, 48 }, 49 }, 50 } 51 52 testCases := map[string]struct { 53 paddleJob *PaddleJob 54 wantErr bool 55 }{ 56 "valid paddleJob": { 57 paddleJob: &PaddleJob{ 58 ObjectMeta: metav1.ObjectMeta{ 59 Name: "test", 60 }, 61 Spec: PaddleJobSpec{ 62 PaddleReplicaSpecs: validPaddleReplicaSpecs, 63 }, 64 }, 65 wantErr: false, 66 }, 67 "paddleJob name does not meet DNS1035": { 68 paddleJob: &PaddleJob{ 69 ObjectMeta: metav1.ObjectMeta{ 70 Name: "__test", 71 }, 72 Spec: PaddleJobSpec{ 73 PaddleReplicaSpecs: validPaddleReplicaSpecs, 74 }, 75 }, 76 wantErr: true, 77 }, 78 "no containers": { 79 paddleJob: &PaddleJob{ 80 ObjectMeta: metav1.ObjectMeta{ 81 Name: "test", 82 }, 83 Spec: PaddleJobSpec{ 84 PaddleReplicaSpecs: map[ReplicaType]*ReplicaSpec{ 85 PaddleJobReplicaTypeWorker: { 86 Template: corev1.PodTemplateSpec{ 87 Spec: corev1.PodSpec{ 88 Containers: []corev1.Container{}, 89 }, 90 }, 91 }, 92 }, 93 }, 94 }, 95 wantErr: true, 96 }, 97 "image is empty": { 98 paddleJob: &PaddleJob{ 99 ObjectMeta: metav1.ObjectMeta{ 100 Name: "test", 101 }, 102 Spec: PaddleJobSpec{ 103 PaddleReplicaSpecs: map[ReplicaType]*ReplicaSpec{ 104 PaddleJobReplicaTypeWorker: { 105 Template: corev1.PodTemplateSpec{ 106 Spec: corev1.PodSpec{ 107 Containers: []corev1.Container{ 108 { 109 Name: "paddle", 110 Image: "", 111 }, 112 }, 113 }, 114 }, 115 }, 116 }, 117 }, 118 }, 119 wantErr: true, 120 }, 121 "paddle default container name doesn't find": { 122 paddleJob: &PaddleJob{ 123 ObjectMeta: metav1.ObjectMeta{ 124 Name: "test", 125 }, 126 Spec: PaddleJobSpec{ 127 PaddleReplicaSpecs: map[ReplicaType]*ReplicaSpec{ 128 PaddleJobReplicaTypeWorker: { 129 Template: corev1.PodTemplateSpec{ 130 Spec: corev1.PodSpec{ 131 Containers: []corev1.Container{ 132 { 133 Name: "", 134 Image: "gcr.io/kubeflow-ci/paddle-dist-mnist_test:1.0", 135 }, 136 }, 137 }, 138 }, 139 }, 140 }, 141 }, 142 }, 143 wantErr: true, 144 }, 145 "replicaSpec is nil": { 146 paddleJob: &PaddleJob{ 147 ObjectMeta: metav1.ObjectMeta{ 148 Name: "test", 149 }, 150 Spec: PaddleJobSpec{ 151 PaddleReplicaSpecs: nil, 152 }, 153 }, 154 wantErr: true, 155 }, 156 } 157 158 for name, tc := range testCases { 159 t.Run(name, func(t *testing.T) { 160 got := ValidateV1PaddleJob(tc.paddleJob) 161 if (got != nil) != tc.wantErr { 162 t.Fatalf("ValidateV1PaddleJob() error = %v, wantErr %v", got, tc.wantErr) 163 } 164 }) 165 } 166 }