@@ -13,6 +13,7 @@ import (
1313 "github.com/armadaproject/armada/internal/common/util"
1414 "github.com/armadaproject/armada/internal/executor/configuration"
1515 "github.com/armadaproject/armada/internal/executor/domain"
16+ "github.com/armadaproject/armada/internal/scheduler/schedulerobjects"
1617 "github.com/armadaproject/armada/pkg/api"
1718 "github.com/armadaproject/armada/pkg/armadaevents"
1819 "github.com/armadaproject/armada/pkg/executorapi"
@@ -128,10 +129,25 @@ func CreatePodFromExecutorApiJob(job *executorapi.JobRunLease, defaults *configu
128129 domain .Owner : job .User ,
129130 })
130131
132+ // Add gang scheduling annotations from SchedulingMetadata if not already present
133+ // (for backward compatibility with old jobs that have annotations in the job spec)
134+ if job .SchedulingMetadata != nil && job .SchedulingMetadata .GangInfo != nil {
135+ gangInfo := job .SchedulingMetadata .GangInfo
136+ if _ , exists := annotation [serverconfiguration .GangIdAnnotation ]; ! exists && gangInfo .GangId != "" {
137+ annotation [serverconfiguration .GangIdAnnotation ] = gangInfo .GangId
138+ }
139+ if _ , exists := annotation [serverconfiguration .GangCardinalityAnnotation ]; ! exists && gangInfo .Cardinality > 0 {
140+ annotation [serverconfiguration .GangCardinalityAnnotation ] = strconv .FormatUint (uint64 (gangInfo .Cardinality ), 10 )
141+ }
142+ if _ , exists := annotation [serverconfiguration .GangNodeUniformityLabelAnnotation ]; ! exists && gangInfo .NodeUniformityLabelName != "" {
143+ annotation [serverconfiguration .GangNodeUniformityLabelAnnotation ] = gangInfo .NodeUniformityLabelName
144+ }
145+ }
146+
131147 applyDefaults (podSpec , defaults )
132148 setRestartPolicyNever (podSpec )
133149
134- injectArmadaEnvVars (podSpec , jobId , job .Queue , job .Jobset , annotation )
150+ injectArmadaEnvVars (podSpec , jobId , job .Queue , job .Jobset , job . SchedulingMetadata , annotation )
135151
136152 pod := & v1.Pod {
137153 ObjectMeta : metav1.ObjectMeta {
@@ -173,7 +189,7 @@ func CreatePod(job *api.Job, defaults *configuration.PodDefaults) *v1.Pod {
173189
174190 setRestartPolicyNever (podSpec )
175191
176- injectArmadaEnvVars (podSpec , job .Id , job .Queue , job .JobSetId , annotation )
192+ injectArmadaEnvVars (podSpec , job .Id , job .Queue , job .JobSetId , nil , annotation )
177193
178194 pod := & v1.Pod {
179195 ObjectMeta : metav1.ObjectMeta {
@@ -203,41 +219,18 @@ func setRestartPolicyNever(podSpec *v1.PodSpec) {
203219
204220// injectArmadaEnvVars injects Armada system environment variables into all containers.
205221// It injects base variables for all jobs and additional variables for gang-scheduled jobs.
206- func injectArmadaEnvVars (podSpec * v1.PodSpec , jobId string , queue string , jobsetId string , annotations map [string ]string ) {
207- // Base environment variables for all jobs
222+ func injectArmadaEnvVars (podSpec * v1.PodSpec , jobId string , queue string , jobsetId string , schedulingMetadata * armadaevents.SchedulingMetadata , annotations map [string ]string ) {
208223 baseEnvVars := []v1.EnvVar {
209224 {Name : serverconfiguration .JobIdEnvVar , Value : jobId },
210225 {Name : serverconfiguration .QueueEnvVar , Value : queue },
211226 {Name : serverconfiguration .JobSetIdEnvVar , Value : jobsetId },
212227 }
213228
214- // Gang-specific environment variables
215- var gangEnvVars []v1.EnvVar
216-
217- if gangId , ok := annotations [serverconfiguration .GangIdAnnotation ]; ok && gangId != "" {
218- gangEnvVars = append (gangEnvVars , v1.EnvVar {
219- Name : serverconfiguration .GangIdEnvVar ,
220- Value : gangId ,
221- })
222- }
223- if gangCardinality , ok := annotations [serverconfiguration .GangCardinalityAnnotation ]; ok && gangCardinality != "" {
224- gangEnvVars = append (gangEnvVars , v1.EnvVar {
225- Name : serverconfiguration .GangCardinalityEnvVar ,
226- Value : gangCardinality ,
227- })
229+ allEnvVars := baseEnvVars
230+ if schedulingMetadata != nil && schedulingMetadata .GangInfo != nil {
231+ allEnvVars = append (allEnvVars , buildGangEnvVars (schedulingMetadata .GangInfo )... )
228232 }
229233
230- labelName , hasLabelName := annotations [serverconfiguration .GangNodeUniformityLabelNameEnvVar ]
231- labelValue , hasLabelValue := annotations [serverconfiguration .GangNodeUniformityLabelValueEnvVar ]
232- if hasLabelName && hasLabelValue {
233- gangEnvVars = append (gangEnvVars ,
234- v1.EnvVar {Name : serverconfiguration .GangNodeUniformityLabelNameEnvVar , Value : labelName },
235- v1.EnvVar {Name : serverconfiguration .GangNodeUniformityLabelValueEnvVar , Value : labelValue },
236- )
237- }
238-
239- allEnvVars := append (baseEnvVars , gangEnvVars ... )
240-
241234 for i := range podSpec .InitContainers {
242235 addEnvVarsIfNotExist (& podSpec .InitContainers [i ], allEnvVars )
243236 }
@@ -246,6 +239,16 @@ func injectArmadaEnvVars(podSpec *v1.PodSpec, jobId string, queue string, jobset
246239 }
247240}
248241
242+ // buildGangEnvVars builds gang environment variables from GangPlacement.
243+ func buildGangEnvVars (gangInfo * schedulerobjects.GangPlacement ) []v1.EnvVar {
244+ return []v1.EnvVar {
245+ {Name : serverconfiguration .GangIdEnvVar , Value : gangInfo .GangId },
246+ {Name : serverconfiguration .GangCardinalityEnvVar , Value : strconv .FormatUint (uint64 (gangInfo .Cardinality ), 10 )},
247+ {Name : serverconfiguration .GangNodeUniformityLabelNameEnvVar , Value : gangInfo .NodeUniformityLabelName },
248+ {Name : serverconfiguration .GangNodeUniformityLabelValueEnvVar , Value : gangInfo .NodeUniformityLabelValue },
249+ }
250+ }
251+
249252// addEnvVarsIfNotExist adds environment variables to a container if they don't already exist.
250253func addEnvVarsIfNotExist (container * v1.Container , newEnvVars []v1.EnvVar ) {
251254 for _ , newVar := range newEnvVars {
0 commit comments