mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-09-21 01:50:55 +00:00
specify pod name and hostname in indexed job
This commit is contained in:
@@ -26,6 +26,7 @@ import (
|
||||
batch "k8s.io/api/batch/v1"
|
||||
v1 "k8s.io/api/core/v1"
|
||||
"k8s.io/apimachinery/pkg/util/sets"
|
||||
"k8s.io/apiserver/pkg/storage/names"
|
||||
"k8s.io/kubernetes/pkg/controller"
|
||||
)
|
||||
|
||||
@@ -216,6 +217,15 @@ func addCompletionIndexAnnotation(template *v1.PodTemplateSpec, index int) {
|
||||
template.Annotations[batch.JobCompletionIndexAnnotation] = strconv.Itoa(index)
|
||||
}
|
||||
|
||||
func podGenerateNameWithIndex(jobName string, index int) string {
|
||||
appendIndex := "-" + strconv.Itoa(index) + "-"
|
||||
generateNamePrefix := jobName + appendIndex
|
||||
if len(generateNamePrefix) > names.MaxGeneratedNameLength {
|
||||
generateNamePrefix = generateNamePrefix[:names.MaxGeneratedNameLength-len(appendIndex)] + appendIndex
|
||||
}
|
||||
return generateNamePrefix
|
||||
}
|
||||
|
||||
type byCompletionIndex []*v1.Pod
|
||||
|
||||
func (bci byCompletionIndex) Less(i, j int) bool {
|
||||
|
@@ -269,6 +269,38 @@ func TestAppendDuplicatedIndexPodsForRemoval(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestPodGenerateNameWithIndex(t *testing.T) {
|
||||
cases := map[string]struct {
|
||||
jobname string
|
||||
index int
|
||||
wantPodGenerateName string
|
||||
}{
|
||||
"short job name": {
|
||||
jobname: "indexed-job",
|
||||
index: 1,
|
||||
wantPodGenerateName: "indexed-job-1-",
|
||||
},
|
||||
"job name exceeds MaxGeneneratedNameLength": {
|
||||
jobname: "hhhhhooooohhhhhooooohhhhhooooohhhhhooooohhhhhooooohhhhhooooohhhhhooooo",
|
||||
index: 1,
|
||||
wantPodGenerateName: "hhhhhooooohhhhhooooohhhhhooooohhhhhooooohhhhhooooohhhhh-1-",
|
||||
},
|
||||
"job name with index suffix exceeds MaxGeneratedNameLength": {
|
||||
jobname: "hhhhhooooohhhhhooooohhhhhooooohhhhhooooohhhhhooooohhhhhoo",
|
||||
index: 1,
|
||||
wantPodGenerateName: "hhhhhooooohhhhhooooohhhhhooooohhhhhooooohhhhhooooohhhhh-1-",
|
||||
},
|
||||
}
|
||||
for name, tc := range cases {
|
||||
t.Run(name, func(t *testing.T) {
|
||||
podGenerateName := podGenerateNameWithIndex(tc.jobname, tc.index)
|
||||
if diff := cmp.Equal(tc.wantPodGenerateName, podGenerateName); !diff {
|
||||
t.Errorf("Got pod generateName %s, want %s", podGenerateName, tc.wantPodGenerateName)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func hollowPodsWithIndexPhase(descs []indexPhase) []*v1.Pod {
|
||||
pods := make([]*v1.Pod, 0, len(descs))
|
||||
for _, desc := range descs {
|
||||
|
@@ -871,9 +871,11 @@ func (jm *Controller) manageJob(job *batch.Job, activePods []*v1.Pod, succeeded
|
||||
if completionIndex != unknownCompletionIndex {
|
||||
template = podTemplate.DeepCopy()
|
||||
addCompletionIndexAnnotation(template, completionIndex)
|
||||
template.Spec.Hostname = fmt.Sprintf("%s-%d", job.Name, completionIndex)
|
||||
}
|
||||
defer wait.Done()
|
||||
err := jm.podControl.CreatePodsWithControllerRef(job.Namespace, template, job, metav1.NewControllerRef(job, controllerKind))
|
||||
generateName := podGenerateNameWithIndex(job.Name, completionIndex)
|
||||
err := jm.podControl.CreatePodsWithControllerRefAndGenerateName(job.Namespace, template, job, metav1.NewControllerRef(job, controllerKind), generateName)
|
||||
if err != nil {
|
||||
if apierrors.HasStatusCause(err, v1.NamespaceTerminatingCause) {
|
||||
// If the namespace is being torn down, we can safely ignore
|
||||
|
@@ -151,6 +151,7 @@ func setPodsStatusesWithIndexes(podIndexer cache.Indexer, job *batch.Job, status
|
||||
p.Annotations = map[string]string{
|
||||
batch.JobCompletionIndexAnnotation: s.Index,
|
||||
}
|
||||
p.Spec.Hostname = fmt.Sprintf("%s-%s", job.Name, s.Index)
|
||||
}
|
||||
podIndexer.Add(p)
|
||||
}
|
||||
@@ -735,7 +736,7 @@ func TestControllerSyncJob(t *testing.T) {
|
||||
t.Errorf("Unexpected number of creates. Expected %d, saw %d\n", tc.expectedCreations, len(fakePodControl.Templates))
|
||||
}
|
||||
if tc.completionMode == batch.IndexedCompletion {
|
||||
checkCompletionIndexesInPods(t, &fakePodControl, tc.expectedCreatedIndexes)
|
||||
checkIndexedJobPods(t, &fakePodControl, tc.expectedCreatedIndexes, job.Name)
|
||||
}
|
||||
if int32(len(fakePodControl.DeletePodName)) != tc.expectedDeletions {
|
||||
t.Errorf("Unexpected number of deletes. Expected %d, saw %d\n", tc.expectedDeletions, len(fakePodControl.DeletePodName))
|
||||
@@ -806,7 +807,7 @@ func TestControllerSyncJob(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func checkCompletionIndexesInPods(t *testing.T, control *controller.FakePodControl, wantIndexes sets.Int) {
|
||||
func checkIndexedJobPods(t *testing.T, control *controller.FakePodControl, wantIndexes sets.Int, jobName string) {
|
||||
t.Helper()
|
||||
gotIndexes := sets.NewInt()
|
||||
for _, p := range control.Templates {
|
||||
@@ -817,6 +818,10 @@ func checkCompletionIndexesInPods(t *testing.T, control *controller.FakePodContr
|
||||
} else {
|
||||
gotIndexes.Insert(ix)
|
||||
}
|
||||
expectedName := fmt.Sprintf("%s-%d", jobName, ix)
|
||||
if diff := cmp.Equal(expectedName, p.Spec.Hostname); !diff {
|
||||
t.Errorf("Got pod hostname %s, want %s", p.Spec.Hostname, expectedName)
|
||||
}
|
||||
}
|
||||
if diff := cmp.Diff(wantIndexes.List(), gotIndexes.List()); diff != "" {
|
||||
t.Errorf("Unexpected created completion indexes (-want,+got):\n%s", diff)
|
||||
|
Reference in New Issue
Block a user