@@ -18,72 +18,176 @@ import (
18
18
"testing"
19
19
20
20
commonv1 "github.com/kubeflow/common/pkg/apis/common/v1"
21
- v1 "k8s.io/api/core/v1"
21
+ corev1 "k8s.io/api/core/v1"
22
+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
23
+ "k8s.io/utils/pointer"
22
24
)
23
25
24
- func TestValidateV1MXJobSpec (t * testing.T ) {
25
- testCases := []MXJobSpec {
26
- {
27
- MXReplicaSpecs : nil ,
26
+ func TestValidateV1MXJob (t * testing.T ) {
27
+ validMXReplicaSpecs := map [commonv1.ReplicaType ]* commonv1.ReplicaSpec {
28
+ MXJobReplicaTypeScheduler : {
29
+ Replicas : pointer .Int32 (1 ),
30
+ RestartPolicy : commonv1 .RestartPolicyNever ,
31
+ Template : corev1.PodTemplateSpec {
32
+ Spec : corev1.PodSpec {
33
+ Containers : []corev1.Container {{
34
+ Name : "mxnet" ,
35
+ Image : "mxjob/mxnet" ,
36
+ }},
37
+ },
38
+ },
39
+ },
40
+ MXJobReplicaTypeServer : {
41
+ Replicas : pointer .Int32 (1 ),
42
+ RestartPolicy : commonv1 .RestartPolicyNever ,
43
+ Template : corev1.PodTemplateSpec {
44
+ Spec : corev1.PodSpec {
45
+ Containers : []corev1.Container {{
46
+ Name : "mxnet" ,
47
+ Image : "mxjob/mxnet" ,
48
+ }},
49
+ },
50
+ },
28
51
},
29
- {
30
- MXReplicaSpecs : map [commonv1.ReplicaType ]* commonv1.ReplicaSpec {
31
- MXJobReplicaTypeWorker : & commonv1.ReplicaSpec {
32
- Template : v1.PodTemplateSpec {
33
- Spec : v1.PodSpec {
34
- Containers : []v1.Container {},
52
+ MXJobReplicaTypeWorker : {
53
+ Replicas : pointer .Int32 (1 ),
54
+ RestartPolicy : commonv1 .RestartPolicyNever ,
55
+ Template : corev1.PodTemplateSpec {
56
+ Spec : corev1.PodSpec {
57
+ Containers : []corev1.Container {{
58
+ Name : "mxnet" ,
59
+ Image : "mxjob/mxnet" ,
60
+ Command : []string {"python" },
61
+ Args : []string {
62
+ "/incubator-mxnet/example/image-classification/train_mnist.py" ,
63
+ "--num-epochs=10" ,
64
+ "--num-layers=2" ,
65
+ "--kv-store=dist_device_sync" ,
35
66
},
36
- },
67
+ }},
68
+ },
69
+ },
70
+ },
71
+ }
72
+
73
+ testCases := map [string ]struct {
74
+ MXJob * MXJob
75
+ wantErr bool
76
+ }{
77
+ "valid mxJob" : {
78
+ MXJob : & MXJob {
79
+ ObjectMeta : metav1.ObjectMeta {
80
+ Name : "test" ,
81
+ },
82
+ Spec : MXJobSpec {
83
+ MXReplicaSpecs : validMXReplicaSpecs ,
84
+ },
85
+ },
86
+ wantErr : false ,
87
+ },
88
+ "mxReplicaSpecs is nil" : {
89
+ MXJob : & MXJob {
90
+ ObjectMeta : metav1.ObjectMeta {
91
+ Name : "test" ,
37
92
},
38
93
},
94
+ wantErr : true ,
39
95
},
40
- {
41
- MXReplicaSpecs : map [commonv1.ReplicaType ]* commonv1.ReplicaSpec {
42
- MXJobReplicaTypeWorker : & commonv1.ReplicaSpec {
43
- Template : v1.PodTemplateSpec {
44
- Spec : v1.PodSpec {
45
- Containers : []v1.Container {
46
- v1.Container {
47
- Image : "" ,
96
+ "mxJob name does not meet DNS1035" : {
97
+ MXJob : & MXJob {
98
+ ObjectMeta : metav1.ObjectMeta {
99
+ Name : "10test" ,
100
+ },
101
+ Spec : MXJobSpec {
102
+ MXReplicaSpecs : validMXReplicaSpecs ,
103
+ },
104
+ },
105
+ wantErr : true ,
106
+ },
107
+ "no containers" : {
108
+ MXJob : & MXJob {
109
+ ObjectMeta : metav1.ObjectMeta {
110
+ Name : "test" ,
111
+ },
112
+ Spec : MXJobSpec {
113
+ MXReplicaSpecs : map [commonv1.ReplicaType ]* commonv1.ReplicaSpec {
114
+ MXJobReplicaTypeWorker : {
115
+ Template : corev1.PodTemplateSpec {
116
+ Spec : corev1.PodSpec {
117
+ Containers : []corev1.Container {},
48
118
},
49
119
},
50
120
},
51
121
},
52
122
},
53
123
},
124
+ wantErr : true ,
54
125
},
55
- {
56
- MXReplicaSpecs : map [commonv1.ReplicaType ]* commonv1.ReplicaSpec {
57
- MXJobReplicaTypeWorker : & commonv1.ReplicaSpec {
58
- Template : v1.PodTemplateSpec {
59
- Spec : v1.PodSpec {
60
- Containers : []v1.Container {
61
- v1.Container {
62
- Name : "" ,
63
- Image : "mxjob/mxnet:gpu" ,
126
+ "image is empty" : {
127
+ MXJob : & MXJob {
128
+ ObjectMeta : metav1.ObjectMeta {
129
+ Name : "test" ,
130
+ },
131
+ Spec : MXJobSpec {
132
+ MXReplicaSpecs : map [commonv1.ReplicaType ]* commonv1.ReplicaSpec {
133
+ MXJobReplicaTypeWorker : {
134
+ Template : corev1.PodTemplateSpec {
135
+ Spec : corev1.PodSpec {
136
+ Containers : []corev1.Container {{
137
+ Name : "mxnet" ,
138
+ Image : "" ,
139
+ }},
64
140
},
65
141
},
66
142
},
67
143
},
68
144
},
69
145
},
146
+ wantErr : true ,
70
147
},
71
- {
72
- MXReplicaSpecs : map [commonv1.ReplicaType ]* commonv1.ReplicaSpec {
73
- MXJobReplicaTypeScheduler : & commonv1.ReplicaSpec {
74
- Template : v1.PodTemplateSpec {
75
- Spec : v1.PodSpec {
76
- Containers : []v1.Container {},
148
+ "mxnet default container name doesn't find" : {
149
+ MXJob : & MXJob {
150
+ ObjectMeta : metav1.ObjectMeta {
151
+ Name : "test" ,
152
+ },
153
+ Spec : MXJobSpec {
154
+ MXReplicaSpecs : map [commonv1.ReplicaType ]* commonv1.ReplicaSpec {
155
+ MXJobReplicaTypeWorker : {
156
+ Template : corev1.PodTemplateSpec {
157
+ Spec : corev1.PodSpec {
158
+ Containers : []corev1.Container {{
159
+ Name : "" ,
160
+ Image : "mxjob/mxnet:gpu" ,
161
+ }},
162
+ },
163
+ },
77
164
},
78
165
},
79
166
},
80
167
},
168
+ wantErr : true ,
169
+ },
170
+ "replicaSpec is nil" : {
171
+ MXJob : & MXJob {
172
+ ObjectMeta : metav1.ObjectMeta {
173
+ Name : "test" ,
174
+ },
175
+ Spec : MXJobSpec {
176
+ MXReplicaSpecs : map [commonv1.ReplicaType ]* commonv1.ReplicaSpec {
177
+ MXJobReplicaTypeScheduler : nil ,
178
+ },
179
+ },
180
+ },
181
+ wantErr : true ,
81
182
},
82
183
}
83
- for _ , c := range testCases {
84
- err := ValidateV1MXJobSpec (& c )
85
- if err .Error () != "MXJobSpec is not valid" {
86
- t .Error ("Failed validate the alpha2.MXJobSpec" )
87
- }
184
+
185
+ for name , tc := range testCases {
186
+ t .Run (name , func (t * testing.T ) {
187
+ got := ValidateV1MXJob (tc .MXJob )
188
+ if (got != nil ) != tc .wantErr {
189
+ t .Fatalf ("ValidateV1MXJob() error = %v, wantErr %v" , got , tc .wantErr )
190
+ }
191
+ })
88
192
}
89
193
}
0 commit comments