Skip to content

Commit 17f87c4

Browse files
authored
Merge pull request kubernetes-sigs#395 from danielvegamyhre/subdomain-fix
Default service name in JobSet controller
2 parents 45429d5 + 12de5fe commit 17f87c4

File tree

5 files changed

+30
-53
lines changed

5 files changed

+30
-53
lines changed

api/jobset/v1alpha2/jobset_webhook.go

-4
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,6 @@ func (js *JobSet) Default() {
6363
if js.Spec.Network.EnableDNSHostnames == nil {
6464
js.Spec.Network.EnableDNSHostnames = ptr.To(true)
6565
}
66-
// Subdomain defaults to the JobSet name
67-
if js.Spec.Network.Subdomain == "" {
68-
js.Spec.Network.Subdomain = js.Name
69-
}
7066

7167
// Default pod restart policy to OnFailure.
7268
if js.Spec.ReplicatedJobs[i].Template.Spec.Template.Spec.RestartPolicy == "" {

api/jobset/v1alpha2/jobset_webhook_test.go

-43
Original file line numberDiff line numberDiff line change
@@ -138,49 +138,6 @@ func TestJobSetDefaulting(t *testing.T) {
138138
},
139139
},
140140
},
141-
{
142-
name: "subdomain defaults to jobset name",
143-
js: &JobSet{
144-
ObjectMeta: metav1.ObjectMeta{
145-
Name: "custom-jobset",
146-
},
147-
Spec: JobSetSpec{
148-
SuccessPolicy: defaultSuccessPolicy,
149-
ReplicatedJobs: []ReplicatedJob{
150-
{
151-
Template: batchv1.JobTemplateSpec{
152-
Spec: batchv1.JobSpec{
153-
Template: TestPodTemplate,
154-
CompletionMode: completionModePtr(batchv1.IndexedCompletion),
155-
},
156-
},
157-
},
158-
},
159-
},
160-
},
161-
want: &JobSet{
162-
ObjectMeta: metav1.ObjectMeta{
163-
Name: "custom-jobset",
164-
},
165-
Spec: JobSetSpec{
166-
SuccessPolicy: defaultSuccessPolicy,
167-
Network: &Network{
168-
EnableDNSHostnames: ptr.To(true),
169-
Subdomain: "custom-jobset",
170-
},
171-
ReplicatedJobs: []ReplicatedJob{
172-
{
173-
Template: batchv1.JobTemplateSpec{
174-
Spec: batchv1.JobSpec{
175-
Template: TestPodTemplate,
176-
CompletionMode: completionModePtr(batchv1.IndexedCompletion),
177-
},
178-
},
179-
},
180-
},
181-
},
182-
},
183-
},
184141
{
185142
name: "enableDNSHostnames is false",
186143
js: &JobSet{

pkg/controllers/jobset_controller.go

+8-5
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,14 @@ func (r *JobSetReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctr
9494
ctx = ctrl.LoggerInto(ctx, log)
9595
log.V(2).Info("Reconciling JobSet")
9696

97+
// If enableDNSHostnames is set, and subdomain is unset, default the subdomain to be the JobSet name.
98+
// This must be done in the controller rather than in the request-time defaulting, since if a JobSet
99+
// uses generateName rather than setting the name explicitly, the JobSet name will still be an empty
100+
// string at that time.
101+
if dnsHostnamesEnabled(&js) && js.Spec.Network.Subdomain == "" {
102+
js.Spec.Network.Subdomain = js.Name
103+
}
104+
97105
// Get Jobs owned by JobSet.
98106
ownedJobs, err := r.getChildJobs(ctx, &js)
99107
if err != nil {
@@ -368,11 +376,6 @@ func (r *JobSetReconciler) createJobs(ctx context.Context, js *jobset.JobSet, ow
368376

369377
// If pod DNS hostnames are enabled, create a headless service for the JobSet
370378
if dnsHostnamesEnabled(js) {
371-
372-
// Don't try to create a headless service without a subdomain
373-
if js.Spec.Network.Subdomain == "" {
374-
return fmt.Errorf("a subdomain should be set if dns hostnames are enabled")
375-
}
376379
if err := r.createHeadlessSvcIfNotExist(ctx, js); err != nil {
377380
return err
378381
}

pkg/util/testing/wrappers.go

+8
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,14 @@ func (j *JobSetWrapper) SetAnnotations(annotations map[string]string) *JobSetWra
7272
return j
7373
}
7474

75+
// GenerateName sets the JobSet name.
76+
func (j *JobSetWrapper) SetGenerateName(namePrefix string) *JobSetWrapper {
77+
// Name and GenerateName are mutually exclusive, so we must unset the Name field.
78+
j.Name = ""
79+
j.GenerateName = namePrefix
80+
return j
81+
}
82+
7583
// Obj returns the inner JobSet.
7684
func (j *JobSetWrapper) Obj() *jobset.JobSet {
7785
return &j.JobSet

test/integration/controller/jobset_controller_test.go

+14-1
Original file line numberDiff line numberDiff line change
@@ -697,6 +697,20 @@ var _ = ginkgo.Describe("JobSet controller", func() {
697697
},
698698
},
699699
}),
700+
ginkgo.Entry("jobset using generateName with enableDNSHostnames should have headless service name set to the jobset name", &testCase{
701+
makeJobSet: func(ns *corev1.Namespace) *testing.JobSetWrapper {
702+
return testJobSet(ns).SetGenerateName("name-prefix").EnableDNSHostnames(true)
703+
},
704+
updates: []*update{
705+
{
706+
checkJobSetState: func(js *jobset.JobSet) {
707+
gomega.Eventually(func() error {
708+
return k8sClient.Get(ctx, types.NamespacedName{Name: js.Name, Namespace: js.Namespace}, &corev1.Service{})
709+
}, timeout, interval).Should(gomega.Succeed())
710+
},
711+
},
712+
},
713+
}),
700714
) // end of DescribeTable
701715
}) // end of Describe
702716

@@ -970,7 +984,6 @@ func testJobSet(ns *corev1.Namespace) *testing.JobSetWrapper {
970984
return testing.MakeJobSet(jobSetName, ns.Name).
971985
SuccessPolicy(&jobset.SuccessPolicy{Operator: jobset.OperatorAll, TargetReplicatedJobs: []string{}}).
972986
EnableDNSHostnames(true).
973-
NetworkSubdomain(jobSetName).
974987
ReplicatedJob(testing.MakeReplicatedJob("replicated-job-a").
975988
Job(testing.MakeJobTemplate("test-job-A", ns.Name).PodSpec(testing.TestPodSpec).Obj()).
976989
Replicas(1).

0 commit comments

Comments
 (0)