@@ -31,6 +31,7 @@ import (
3131 "github.com/onsi/gomega"
3232 v1 "k8s.io/api/core/v1"
3333 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
34+ "k8s.io/apimachinery/pkg/types"
3435 "k8s.io/apimachinery/pkg/util/intstr"
3536 "k8s.io/apimachinery/pkg/util/rand"
3637 clientset "k8s.io/client-go/kubernetes"
@@ -78,6 +79,7 @@ var _ = ginkgo.Describe("BroadcastJob", ginkgo.Label("BroadcastJob", "job", "wor
7879 }
7980 },
8081 }
82+
8183 ginkgo .Context ("BroadcastJob dispatching" , func () {
8284 ginkgo .It ("succeeds for parallelism < number of node" , func () {
8385 ginkgo .By ("Create Fake Node " + randStr )
@@ -153,4 +155,85 @@ var _ = ginkgo.Describe("BroadcastJob", ginkgo.Label("BroadcastJob", "job", "wor
153155 }, 60 * time .Second , time .Second ).Should (gomega .Equal (int32 (len (nodes ))))
154156 })
155157 })
158+
159+ ginkgo .Context ("BroadcastJob uncordon handling" , func () {
160+ ginkgo .It ("creates missing pod after node uncordon" , func () {
161+ // Create fake node
162+ fakeNode , err := nodeTester .CreateFakeNode (randStr )
163+ gomega .Expect (err ).NotTo (gomega .HaveOccurred ())
164+
165+ // Cordon the fake node
166+ ginkgo .By ("Cordoning fake node " + fakeNode .Name )
167+ _ , err = c .CoreV1 ().Nodes ().Patch (context .TODO (), fakeNode .Name ,
168+ types .StrategicMergePatchType ,
169+ []byte (`{"spec":{"unschedulable":true}}` ),
170+ metav1.PatchOptions {})
171+ gomega .Expect (err ).NotTo (gomega .HaveOccurred ())
172+
173+ // Create BroadcastJob job-" + randStr
174+ job := & appsv1alpha1.BroadcastJob {
175+ ObjectMeta : metav1.ObjectMeta {Namespace : ns , Name : "job-" + randStr },
176+ Spec : appsv1alpha1.BroadcastJobSpec {
177+ Template : v1.PodTemplateSpec {
178+ Spec : v1.PodSpec {
179+ Tolerations : []v1.Toleration {{Key : framework .E2eFakeKey , Operator : v1 .TolerationOpEqual , Value : randStr , Effect : v1 .TaintEffectNoSchedule }},
180+ Containers : []v1.Container {{
181+ Name : "box" ,
182+ Image : BusyboxImage ,
183+ Command : []string {"/bin/sh" , "-c" , "sleep 30" },
184+ }},
185+ RestartPolicy : v1 .RestartPolicyNever ,
186+ },
187+ },
188+ CompletionPolicy : appsv1alpha1.CompletionPolicy {Type : appsv1alpha1 .Always },
189+ },
190+ }
191+
192+ nodes , err := nodeTester .ListRealNodesWithFake (job .Spec .Template .Spec .Tolerations )
193+ gomega .Expect (err ).NotTo (gomega .HaveOccurred ())
194+ totalNodes := int32 (len (nodes ))
195+ parallelism := intstr .FromInt (len (nodes ))
196+ job .Spec .Parallelism = & parallelism
197+
198+ ginkgo .By ("Creating BroadcastJob " + job .Name )
199+ job , err = tester .CreateBroadcastJob (job )
200+ gomega .Expect (err ).NotTo (gomega .HaveOccurred ())
201+
202+ ginkgo .By ("Verify desired count equals total nodes - 1 (due to cordoned node)" )
203+ gomega .Eventually (func () int32 {
204+ job , err = tester .GetBroadcastJob (job .Name )
205+ gomega .Expect (err ).NotTo (gomega .HaveOccurred ())
206+ return job .Status .Desired
207+ }, 30 * time .Second , time .Second ).Should (gomega .Equal (totalNodes - 1 ))
208+
209+ ginkgo .By ("Verify active pods equals total nodes - 1 (as pod is not created on cordoned node)" )
210+ gomega .Eventually (func () int32 {
211+ job , err = tester .GetBroadcastJob (job .Name )
212+ gomega .Expect (err ).NotTo (gomega .HaveOccurred ())
213+ return job .Status .Active
214+ }, 60 * time .Second , 3 * time .Second ).Should (gomega .Equal (totalNodes - 1 ))
215+
216+ // Uncordon the fake node
217+ ginkgo .By ("Uncordoning fake node " + fakeNode .Name )
218+ _ , err = c .CoreV1 ().Nodes ().Patch (context .TODO (), fakeNode .Name ,
219+ types .StrategicMergePatchType ,
220+ []byte (`{"spec":{"unschedulable":false}}` ),
221+ metav1.PatchOptions {})
222+ gomega .Expect (err ).NotTo (gomega .HaveOccurred ())
223+
224+ ginkgo .By ("Verify desired count becomes total nodes after uncordon" )
225+ gomega .Eventually (func () int32 {
226+ job , err = tester .GetBroadcastJob (job .Name )
227+ gomega .Expect (err ).NotTo (gomega .HaveOccurred ())
228+ return job .Status .Desired
229+ }, 30 * time .Second , time .Second ).Should (gomega .Equal (totalNodes ))
230+
231+ ginkgo .By ("Verify active pods becomes total nodes after uncordon (missing pod now created)" )
232+ gomega .Eventually (func () int32 {
233+ job , err = tester .GetBroadcastJob (job .Name )
234+ gomega .Expect (err ).NotTo (gomega .HaveOccurred ())
235+ return job .Status .Active
236+ }, 60 * time .Second , 3 * time .Second ).Should (gomega .Equal (totalNodes ))
237+ })
238+ })
156239})
0 commit comments