@@ -252,13 +252,13 @@ func (c *StashController) ensureRestoreJob(restoreSession *api_v1beta1.RestoreSe
252252
253253 if restoreSession .Spec .Task .Name != "" {
254254 // Restore process follows Function-Task model. So, resolve Function and Task to get desired job definition.
255- jobTemplate , err = c .resolveRestoreTask (restoreSession , repository , jobMeta , ref , serviceAccountName )
255+ jobTemplate , err = c .resolveRestoreTask (restoreSession , repository , ref , serviceAccountName )
256256 if err != nil {
257257 return err
258258 }
259259 } else {
260260 // Restore process does not follow Function-Task model. So, generate simple volume restorer job definition.
261- jobTemplate , err = util .NewPVCRestorerJob (restoreSession , repository , image , jobMeta )
261+ jobTemplate , err = util .NewPVCRestorerJob (restoreSession , repository , image )
262262 if err != nil {
263263 return err
264264 }
@@ -267,7 +267,7 @@ func (c *StashController) ensureRestoreJob(restoreSession *api_v1beta1.RestoreSe
267267 // If volumeClaimTemplate is not specified then we don't need any further processing. Just, create the job
268268 if restoreSession .Spec .Target == nil ||
269269 (restoreSession .Spec .Target != nil && len (restoreSession .Spec .Target .VolumeClaimTemplates ) == 0 ) {
270- return c .createRestoreJob (jobTemplate , jobTemplate . ObjectMeta , ref , serviceAccountName )
270+ return c .createRestoreJob (jobTemplate , jobMeta , ref , serviceAccountName )
271271 }
272272
273273 // volumeClaimTemplate has been specified. Now, we have to do the following for each replica:
@@ -295,13 +295,27 @@ func (c *StashController) ensureRestoreJob(restoreSession *api_v1beta1.RestoreSe
295295
296296 // add PVCs as volume to the job
297297 volumes := util .PVCListToVolumes (pvcList , ordinal )
298- jobTemplate .Spec .Volumes = core_util .UpsertVolume (jobTemplate .Spec .Volumes , volumes ... )
299298
299+ // use copy of the original job template. otherwise, each iteration will append volumes in the same template
300+ restoreJobTemplate := jobTemplate .DeepCopy ()
301+ restoreJobMeta := jobMeta .DeepCopy ()
300302 // add ordinal suffix to the job name so that multiple restore job can run concurrently
301- jobTemplate .Name = fmt .Sprintf ("%s-%d" , jobMeta .Name , ordinal )
303+ restoreJobMeta .Name = fmt .Sprintf ("%s-%d" , jobMeta .Name , ordinal )
304+
305+ restoreJobTemplate .Spec .Volumes = core_util .UpsertVolume (restoreJobTemplate .Spec .Volumes , volumes ... )
306+
307+ ordinalEnv := core.EnvVar {
308+ Name : util .KeyPodOrdinal ,
309+ Value : fmt .Sprintf ("%d" , ordinal ),
310+ }
311+
312+ // insert POD_ORDINAL env in all containers.
313+ for i , c := range restoreJobTemplate .Spec .Containers {
314+ restoreJobTemplate .Spec .Containers [i ].Env = core_util .UpsertEnvVars (c .Env , ordinalEnv )
315+ }
302316
303317 // create restore job
304- err = c .createRestoreJob (jobTemplate , jobTemplate . ObjectMeta , ref , serviceAccountName )
318+ err = c .createRestoreJob (restoreJobTemplate , * restoreJobMeta , ref , serviceAccountName )
305319 if err != nil {
306320 return err
307321 }
@@ -329,7 +343,7 @@ func (c *StashController) createRestoreJob(jobTemplate *core.PodTemplateSpec, me
329343
330344// resolveRestoreTask resolves Functions and Tasks then returns a job definition to restore the target.
331345func (c * StashController ) resolveRestoreTask (restoreSession * api_v1beta1.RestoreSession ,
332- repository * api_v1alpha1.Repository , meta metav1. ObjectMeta , ref * core.ObjectReference , serviceAccountName string ) (* core.PodTemplateSpec , error ) {
346+ repository * api_v1alpha1.Repository , ref * core.ObjectReference , serviceAccountName string ) (* core.PodTemplateSpec , error ) {
333347
334348 // resolve task template
335349 explicitInputs := make (map [string ]string )
@@ -384,8 +398,7 @@ func (c *StashController) resolveRestoreTask(restoreSession *api_v1beta1.Restore
384398 }
385399
386400 podTemplate := & core.PodTemplateSpec {
387- ObjectMeta : meta ,
388- Spec : podSpec ,
401+ Spec : podSpec ,
389402 }
390403 return podTemplate , nil
391404}
@@ -602,7 +615,7 @@ func getPVCFromVolumeClaimTemplates(ordinal int32, claimTemplates []core.Persist
602615 pvcList := make ([]core.PersistentVolumeClaim , 0 )
603616 for _ , claim := range claimTemplates {
604617 inputs := make (map [string ]string )
605- inputs ["POD_ORDINAL" ] = strconv .Itoa (int (ordinal ))
618+ inputs [util . KeyPodOrdinal ] = strconv .Itoa (int (ordinal ))
606619 err := resolve .ResolvePVCSpec (& claim , inputs )
607620 if err != nil {
608621 return pvcList , err
0 commit comments