@@ -76,6 +76,11 @@ func (g *General) DesiredDeployment(s *suggestionsv1beta1.Suggestion) (*appsv1.D
76
76
if err != nil {
77
77
return nil , err
78
78
}
79
+ if containsContainerPortWithName (suggestionConfigData .Ports , consts .DefaultSuggestionPortName ) ||
80
+ containsContainerPort (suggestionConfigData .Ports , consts .DefaultSuggestionPort ) {
81
+ return nil , fmt .Errorf ("invalid suggestion config: a port with name %q or number %d must not be specified" ,
82
+ consts .DefaultSuggestionPortName , consts .DefaultSuggestionPort )
83
+ }
79
84
80
85
// If early stopping is used, get the config data.
81
86
earlyStoppingConfigData := katibconfig.EarlyStoppingConfig {}
@@ -181,21 +186,27 @@ func (g *General) desiredContainers(s *suggestionsv1beta1.Suggestion,
181
186
suggestionConfigData katibconfig.SuggestionConfig ,
182
187
earlyStoppingConfigData katibconfig.EarlyStoppingConfig ) []corev1.Container {
183
188
184
- containers := []corev1. Container {}
185
- suggestionContainer := corev1.Container {
186
- Name : consts . ContainerSuggestion ,
187
- Image : suggestionConfigData . Image ,
188
- ImagePullPolicy : suggestionConfigData . ImagePullPolicy ,
189
- Ports : []corev1. ContainerPort {
190
- {
191
- Name : consts . DefaultSuggestionPortName ,
192
- ContainerPort : consts . DefaultSuggestionPort ,
193
- },
194
- },
195
- Resources : suggestionConfigData . Resource ,
189
+ var (
190
+ containers [] corev1.Container
191
+ suggestionContainer corev1. Container
192
+ )
193
+
194
+ suggestionConfigData . Container . DeepCopyInto ( & suggestionContainer )
195
+
196
+ // Assign default values for suggestionContainer fields that are not set via
197
+ // the suggestion config.
198
+
199
+ if suggestionContainer . Name == "" {
200
+ suggestionContainer . Name = consts . ContainerSuggestion
196
201
}
197
202
198
- if viper .GetBool (consts .ConfigEnableGRPCProbeInSuggestion ) {
203
+ suggestionPort := corev1.ContainerPort {
204
+ Name : consts .DefaultSuggestionPortName ,
205
+ ContainerPort : consts .DefaultSuggestionPort ,
206
+ }
207
+ suggestionContainer .Ports = append (suggestionContainer .Ports , suggestionPort )
208
+
209
+ if viper .GetBool (consts .ConfigEnableGRPCProbeInSuggestion ) && suggestionContainer .ReadinessProbe == nil {
199
210
suggestionContainer .ReadinessProbe = & corev1.Probe {
200
211
ProbeHandler : corev1.ProbeHandler {
201
212
Exec : & corev1.ExecAction {
@@ -209,6 +220,8 @@ func (g *General) desiredContainers(s *suggestionsv1beta1.Suggestion,
209
220
InitialDelaySeconds : defaultInitialDelaySeconds ,
210
221
PeriodSeconds : defaultPeriodForReady ,
211
222
}
223
+ }
224
+ if viper .GetBool (consts .ConfigEnableGRPCProbeInSuggestion ) && suggestionContainer .LivenessProbe == nil {
212
225
suggestionContainer .LivenessProbe = & corev1.Probe {
213
226
ProbeHandler : corev1.ProbeHandler {
214
227
Exec : & corev1.ExecAction {
@@ -226,15 +239,14 @@ func (g *General) desiredContainers(s *suggestionsv1beta1.Suggestion,
226
239
}
227
240
}
228
241
229
- // Attach volume mounts to the suggestion container if ResumePolicy = FromVolume
230
- if s .Spec .ResumePolicy == experimentsv1beta1 .FromVolume {
231
- suggestionContainer .VolumeMounts = []corev1.VolumeMount {
232
- {
233
- Name : consts .ContainerSuggestionVolumeName ,
234
- MountPath : suggestionConfigData .VolumeMountPath ,
235
- },
242
+ if s .Spec .ResumePolicy == experimentsv1beta1 .FromVolume && ! containsVolumeMountWithName (suggestionContainer .VolumeMounts , consts .ContainerSuggestionVolumeName ) {
243
+ suggestionVolume := corev1.VolumeMount {
244
+ Name : consts .ContainerSuggestionVolumeName ,
245
+ MountPath : suggestionConfigData .VolumeMountPath ,
236
246
}
247
+ suggestionContainer .VolumeMounts = append (suggestionContainer .VolumeMounts , suggestionVolume )
237
248
}
249
+
238
250
containers = append (containers , suggestionContainer )
239
251
240
252
if s .Spec .EarlyStopping != nil && s .Spec .EarlyStopping .AlgorithmName != "" {
@@ -256,6 +268,36 @@ func (g *General) desiredContainers(s *suggestionsv1beta1.Suggestion,
256
268
return containers
257
269
}
258
270
271
+ func containsVolumeMountWithName (volumeMounts []corev1.VolumeMount , name string ) bool {
272
+ for i := range volumeMounts {
273
+ if volumeMounts [i ].Name == name {
274
+ return true
275
+ }
276
+ }
277
+
278
+ return false
279
+ }
280
+
281
+ func containsContainerPortWithName (ports []corev1.ContainerPort , name string ) bool {
282
+ for i := range ports {
283
+ if ports [i ].Name == name {
284
+ return true
285
+ }
286
+ }
287
+
288
+ return false
289
+ }
290
+
291
+ func containsContainerPort (ports []corev1.ContainerPort , port int32 ) bool {
292
+ for i := range ports {
293
+ if ports [i ].ContainerPort == port {
294
+ return true
295
+ }
296
+ }
297
+
298
+ return false
299
+ }
300
+
259
301
// DesiredVolume returns desired PVC and PV for Suggestion.
260
302
// If PV doesn't exist in Katib config return nil for PV.
261
303
func (g * General ) DesiredVolume (s * suggestionsv1beta1.Suggestion ) (* corev1.PersistentVolumeClaim , * corev1.PersistentVolume , error ) {
0 commit comments