github.com/kubeflow/training-operator@v1.7.0/pkg/apis/kubeflow.org/v1/mxnet_defaults_test.go (about) 1 // Copyright 2018 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 "reflect" 19 "testing" 20 21 corev1 "k8s.io/api/core/v1" 22 "k8s.io/utils/pointer" 23 ) 24 25 func expectedMXNetJob(cleanPodPolicy CleanPodPolicy, restartPolicy RestartPolicy, replicas int32, portName string, port int32) *MXJob { 26 ports := []corev1.ContainerPort{} 27 28 // port not set 29 if portName != "" { 30 ports = append(ports, 31 corev1.ContainerPort{ 32 Name: portName, 33 ContainerPort: port, 34 }, 35 ) 36 } 37 38 // port set with custom name 39 if portName != MXJobDefaultPortName { 40 ports = append(ports, 41 corev1.ContainerPort{ 42 Name: MXJobDefaultPortName, 43 ContainerPort: MXJobDefaultPort, 44 }, 45 ) 46 } 47 48 return &MXJob{ 49 Spec: MXJobSpec{ 50 RunPolicy: RunPolicy{ 51 CleanPodPolicy: &cleanPodPolicy, 52 }, 53 MXReplicaSpecs: map[ReplicaType]*ReplicaSpec{ 54 MXJobReplicaTypeWorker: &ReplicaSpec{ 55 Replicas: pointer.Int32(replicas), 56 RestartPolicy: restartPolicy, 57 Template: corev1.PodTemplateSpec{ 58 Spec: corev1.PodSpec{ 59 Containers: []corev1.Container{ 60 corev1.Container{ 61 Name: MXJobDefaultContainerName, 62 Image: testImage, 63 Ports: ports, 64 }, 65 }, 66 }, 67 }, 68 }, 69 }, 70 }, 71 } 72 } 73 74 func TestSetDefaults_MXJob(t *testing.T) { 75 testCases := map[string]struct { 76 original *MXJob 77 expected *MXJob 78 }{ 79 "set spec with minimum setting": { 80 original: &MXJob{ 81 Spec: MXJobSpec{ 82 MXReplicaSpecs: map[ReplicaType]*ReplicaSpec{ 83 MXJobReplicaTypeWorker: &ReplicaSpec{ 84 Template: corev1.PodTemplateSpec{ 85 Spec: corev1.PodSpec{ 86 Containers: []corev1.Container{ 87 corev1.Container{ 88 Name: MXJobDefaultContainerName, 89 Image: testImage, 90 }, 91 }, 92 }, 93 }, 94 }, 95 }, 96 }, 97 }, 98 expected: expectedMXNetJob(CleanPodPolicyNone, MXJobDefaultRestartPolicy, 1, MXJobDefaultPortName, MXJobDefaultPort), 99 }, 100 "Set spec with restart policy": { 101 original: &MXJob{ 102 Spec: MXJobSpec{ 103 MXReplicaSpecs: map[ReplicaType]*ReplicaSpec{ 104 MXJobReplicaTypeWorker: &ReplicaSpec{ 105 RestartPolicy: RestartPolicyOnFailure, 106 Template: corev1.PodTemplateSpec{ 107 Spec: corev1.PodSpec{ 108 Containers: []corev1.Container{ 109 corev1.Container{ 110 Name: MXJobDefaultContainerName, 111 Image: testImage, 112 }, 113 }, 114 }, 115 }, 116 }, 117 }, 118 }, 119 }, 120 expected: expectedMXNetJob(CleanPodPolicyNone, RestartPolicyOnFailure, 1, MXJobDefaultPortName, MXJobDefaultPort), 121 }, 122 "Set spec with replicas": { 123 original: &MXJob{ 124 Spec: MXJobSpec{ 125 MXReplicaSpecs: map[ReplicaType]*ReplicaSpec{ 126 MXJobReplicaTypeWorker: &ReplicaSpec{ 127 Replicas: pointer.Int32(3), 128 Template: corev1.PodTemplateSpec{ 129 Spec: corev1.PodSpec{ 130 Containers: []corev1.Container{ 131 corev1.Container{ 132 Name: MXJobDefaultContainerName, 133 Image: testImage, 134 }, 135 }, 136 }, 137 }, 138 }, 139 }, 140 }, 141 }, 142 expected: expectedMXNetJob(CleanPodPolicyNone, MXJobDefaultRestartPolicy, 3, MXJobDefaultPortName, MXJobDefaultPort), 143 }, 144 145 "Set spec with default node port name and port": { 146 original: &MXJob{ 147 Spec: MXJobSpec{ 148 MXReplicaSpecs: map[ReplicaType]*ReplicaSpec{ 149 MXJobReplicaTypeWorker: &ReplicaSpec{ 150 Template: corev1.PodTemplateSpec{ 151 Spec: corev1.PodSpec{ 152 Containers: []corev1.Container{ 153 corev1.Container{ 154 Name: MXJobDefaultContainerName, 155 Image: testImage, 156 Ports: []corev1.ContainerPort{ 157 corev1.ContainerPort{ 158 Name: MXJobDefaultPortName, 159 ContainerPort: MXJobDefaultPort, 160 }, 161 }, 162 }, 163 }, 164 }, 165 }, 166 }, 167 }, 168 }, 169 }, 170 expected: expectedMXNetJob(CleanPodPolicyNone, MXJobDefaultRestartPolicy, 1, MXJobDefaultPortName, MXJobDefaultPort), 171 }, 172 173 "Set spec with node port": { 174 original: &MXJob{ 175 Spec: MXJobSpec{ 176 MXReplicaSpecs: map[ReplicaType]*ReplicaSpec{ 177 MXJobReplicaTypeWorker: &ReplicaSpec{ 178 Template: corev1.PodTemplateSpec{ 179 Spec: corev1.PodSpec{ 180 Containers: []corev1.Container{ 181 corev1.Container{ 182 Name: MXJobDefaultContainerName, 183 Image: testImage, 184 Ports: []corev1.ContainerPort{ 185 corev1.ContainerPort{ 186 Name: MXJobDefaultPortName, 187 ContainerPort: 9999, 188 }, 189 }, 190 }, 191 }, 192 }, 193 }, 194 }, 195 }, 196 }, 197 }, 198 expected: expectedMXNetJob(CleanPodPolicyNone, MXJobDefaultRestartPolicy, 1, MXJobDefaultPortName, 9999), 199 }, 200 201 "set spec with cleanpod policy": { 202 original: &MXJob{ 203 Spec: MXJobSpec{ 204 RunPolicy: RunPolicy{ 205 CleanPodPolicy: CleanPodPolicyPointer(CleanPodPolicyAll), 206 }, 207 MXReplicaSpecs: map[ReplicaType]*ReplicaSpec{ 208 MXJobReplicaTypeWorker: &ReplicaSpec{ 209 Template: corev1.PodTemplateSpec{ 210 Spec: corev1.PodSpec{ 211 Containers: []corev1.Container{ 212 corev1.Container{ 213 Name: MXJobDefaultContainerName, 214 Image: testImage, 215 }, 216 }, 217 }, 218 }, 219 }, 220 }, 221 }, 222 }, 223 expected: expectedMXNetJob(CleanPodPolicyAll, MXJobDefaultRestartPolicy, 1, MXJobDefaultPortName, MXJobDefaultPort), 224 }, 225 } 226 227 for name, tc := range testCases { 228 SetDefaults_MXJob(tc.original) 229 if !reflect.DeepEqual(tc.original, tc.expected) { 230 t.Errorf("%s: Want\n%v; Got\n %v", name, pformat(tc.expected), pformat(tc.original)) 231 } 232 } 233 234 }