daemon_controller_test.go 81 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550
  1. /*
  2. Copyright 2015 The Kubernetes Authors.
  3. Licensed under the Apache License, Version 2.0 (the "License");
  4. you may not use this file except in compliance with the License.
  5. You may obtain a copy of the License at
  6. http://www.apache.org/licenses/LICENSE-2.0
  7. Unless required by applicable law or agreed to in writing, software
  8. distributed under the License is distributed on an "AS IS" BASIS,
  9. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  10. See the License for the specific language governing permissions and
  11. limitations under the License.
  12. */
  13. package daemon
  14. import (
  15. "fmt"
  16. "reflect"
  17. "sort"
  18. "strconv"
  19. "sync"
  20. "testing"
  21. "time"
  22. apps "k8s.io/api/apps/v1"
  23. v1 "k8s.io/api/core/v1"
  24. "k8s.io/apimachinery/pkg/api/resource"
  25. metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
  26. "k8s.io/apimachinery/pkg/runtime"
  27. "k8s.io/apimachinery/pkg/util/clock"
  28. "k8s.io/apimachinery/pkg/util/intstr"
  29. "k8s.io/apimachinery/pkg/util/uuid"
  30. "k8s.io/apiserver/pkg/storage/names"
  31. "k8s.io/client-go/informers"
  32. "k8s.io/client-go/kubernetes/fake"
  33. core "k8s.io/client-go/testing"
  34. "k8s.io/client-go/tools/cache"
  35. "k8s.io/client-go/tools/record"
  36. "k8s.io/client-go/util/flowcontrol"
  37. "k8s.io/client-go/util/workqueue"
  38. "k8s.io/kubernetes/pkg/api/legacyscheme"
  39. podutil "k8s.io/kubernetes/pkg/api/v1/pod"
  40. api "k8s.io/kubernetes/pkg/apis/core"
  41. "k8s.io/kubernetes/pkg/apis/scheduling"
  42. "k8s.io/kubernetes/pkg/controller"
  43. "k8s.io/kubernetes/pkg/securitycontext"
  44. labelsutil "k8s.io/kubernetes/pkg/util/labels"
  45. )
  46. var (
  47. simpleDaemonSetLabel = map[string]string{"name": "simple-daemon", "type": "production"}
  48. simpleDaemonSetLabel2 = map[string]string{"name": "simple-daemon", "type": "test"}
  49. simpleNodeLabel = map[string]string{"color": "blue", "speed": "fast"}
  50. simpleNodeLabel2 = map[string]string{"color": "red", "speed": "fast"}
  51. alwaysReady = func() bool { return true }
  52. )
  53. var (
  54. noScheduleTolerations = []v1.Toleration{{Key: "dedicated", Value: "user1", Effect: "NoSchedule"}}
  55. noScheduleTaints = []v1.Taint{{Key: "dedicated", Value: "user1", Effect: "NoSchedule"}}
  56. noExecuteTaints = []v1.Taint{{Key: "dedicated", Value: "user1", Effect: "NoExecute"}}
  57. )
  58. func nowPointer() *metav1.Time {
  59. now := metav1.Now()
  60. return &now
  61. }
  62. var (
  63. nodeNotReady = []v1.Taint{{
  64. Key: v1.TaintNodeNotReady,
  65. Effect: v1.TaintEffectNoExecute,
  66. TimeAdded: nowPointer(),
  67. }}
  68. nodeUnreachable = []v1.Taint{{
  69. Key: v1.TaintNodeUnreachable,
  70. Effect: v1.TaintEffectNoExecute,
  71. TimeAdded: nowPointer(),
  72. }}
  73. )
  74. func newDaemonSet(name string) *apps.DaemonSet {
  75. two := int32(2)
  76. return &apps.DaemonSet{
  77. ObjectMeta: metav1.ObjectMeta{
  78. UID: uuid.NewUUID(),
  79. Name: name,
  80. Namespace: metav1.NamespaceDefault,
  81. },
  82. Spec: apps.DaemonSetSpec{
  83. RevisionHistoryLimit: &two,
  84. UpdateStrategy: apps.DaemonSetUpdateStrategy{
  85. Type: apps.OnDeleteDaemonSetStrategyType,
  86. },
  87. Selector: &metav1.LabelSelector{MatchLabels: simpleDaemonSetLabel},
  88. Template: v1.PodTemplateSpec{
  89. ObjectMeta: metav1.ObjectMeta{
  90. Labels: simpleDaemonSetLabel,
  91. },
  92. Spec: v1.PodSpec{
  93. Containers: []v1.Container{
  94. {
  95. Image: "foo/bar",
  96. TerminationMessagePath: v1.TerminationMessagePathDefault,
  97. ImagePullPolicy: v1.PullIfNotPresent,
  98. SecurityContext: securitycontext.ValidSecurityContextWithContainerDefaults(),
  99. },
  100. },
  101. DNSPolicy: v1.DNSDefault,
  102. },
  103. },
  104. },
  105. }
  106. }
  107. func newRollbackStrategy() *apps.DaemonSetUpdateStrategy {
  108. one := intstr.FromInt(1)
  109. return &apps.DaemonSetUpdateStrategy{
  110. Type: apps.RollingUpdateDaemonSetStrategyType,
  111. RollingUpdate: &apps.RollingUpdateDaemonSet{MaxUnavailable: &one},
  112. }
  113. }
  114. func newOnDeleteStrategy() *apps.DaemonSetUpdateStrategy {
  115. return &apps.DaemonSetUpdateStrategy{
  116. Type: apps.OnDeleteDaemonSetStrategyType,
  117. }
  118. }
  119. func updateStrategies() []*apps.DaemonSetUpdateStrategy {
  120. return []*apps.DaemonSetUpdateStrategy{newOnDeleteStrategy(), newRollbackStrategy()}
  121. }
  122. func newNode(name string, label map[string]string) *v1.Node {
  123. return &v1.Node{
  124. TypeMeta: metav1.TypeMeta{APIVersion: "v1"},
  125. ObjectMeta: metav1.ObjectMeta{
  126. Name: name,
  127. Labels: label,
  128. Namespace: metav1.NamespaceNone,
  129. },
  130. Status: v1.NodeStatus{
  131. Conditions: []v1.NodeCondition{
  132. {Type: v1.NodeReady, Status: v1.ConditionTrue},
  133. },
  134. Allocatable: v1.ResourceList{
  135. v1.ResourcePods: resource.MustParse("100"),
  136. },
  137. },
  138. }
  139. }
  140. func addNodes(nodeStore cache.Store, startIndex, numNodes int, label map[string]string) {
  141. for i := startIndex; i < startIndex+numNodes; i++ {
  142. nodeStore.Add(newNode(fmt.Sprintf("node-%d", i), label))
  143. }
  144. }
  145. func newPod(podName string, nodeName string, label map[string]string, ds *apps.DaemonSet) *v1.Pod {
  146. // Add hash unique label to the pod
  147. newLabels := label
  148. var podSpec v1.PodSpec
  149. // Copy pod spec from DaemonSet template, or use a default one if DaemonSet is nil
  150. if ds != nil {
  151. hash := controller.ComputeHash(&ds.Spec.Template, ds.Status.CollisionCount)
  152. newLabels = labelsutil.CloneAndAddLabel(label, apps.DefaultDaemonSetUniqueLabelKey, hash)
  153. podSpec = ds.Spec.Template.Spec
  154. } else {
  155. podSpec = v1.PodSpec{
  156. Containers: []v1.Container{
  157. {
  158. Image: "foo/bar",
  159. TerminationMessagePath: v1.TerminationMessagePathDefault,
  160. ImagePullPolicy: v1.PullIfNotPresent,
  161. SecurityContext: securitycontext.ValidSecurityContextWithContainerDefaults(),
  162. },
  163. },
  164. }
  165. }
  166. // Add node name to the pod
  167. if len(nodeName) > 0 {
  168. podSpec.NodeName = nodeName
  169. }
  170. pod := &v1.Pod{
  171. TypeMeta: metav1.TypeMeta{APIVersion: "v1"},
  172. ObjectMeta: metav1.ObjectMeta{
  173. GenerateName: podName,
  174. Labels: newLabels,
  175. Namespace: metav1.NamespaceDefault,
  176. },
  177. Spec: podSpec,
  178. }
  179. pod.Name = names.SimpleNameGenerator.GenerateName(podName)
  180. if ds != nil {
  181. pod.OwnerReferences = []metav1.OwnerReference{*metav1.NewControllerRef(ds, controllerKind)}
  182. }
  183. return pod
  184. }
  185. func addPods(podStore cache.Store, nodeName string, label map[string]string, ds *apps.DaemonSet, number int) {
  186. for i := 0; i < number; i++ {
  187. pod := newPod(fmt.Sprintf("%s-", nodeName), nodeName, label, ds)
  188. podStore.Add(pod)
  189. }
  190. }
  191. func addFailedPods(podStore cache.Store, nodeName string, label map[string]string, ds *apps.DaemonSet, number int) {
  192. for i := 0; i < number; i++ {
  193. pod := newPod(fmt.Sprintf("%s-", nodeName), nodeName, label, ds)
  194. pod.Status = v1.PodStatus{Phase: v1.PodFailed}
  195. podStore.Add(pod)
  196. }
  197. }
  198. type fakePodControl struct {
  199. sync.Mutex
  200. *controller.FakePodControl
  201. podStore cache.Store
  202. podIDMap map[string]*v1.Pod
  203. expectations controller.ControllerExpectationsInterface
  204. dsc *daemonSetsController
  205. }
  206. func newFakePodControl() *fakePodControl {
  207. podIDMap := make(map[string]*v1.Pod)
  208. return &fakePodControl{
  209. FakePodControl: &controller.FakePodControl{},
  210. podIDMap: podIDMap,
  211. }
  212. }
  213. func (f *fakePodControl) CreatePodsOnNode(nodeName, namespace string, template *v1.PodTemplateSpec, object runtime.Object, controllerRef *metav1.OwnerReference) error {
  214. f.Lock()
  215. defer f.Unlock()
  216. if err := f.FakePodControl.CreatePodsOnNode(nodeName, namespace, template, object, controllerRef); err != nil {
  217. return fmt.Errorf("failed to create pod on node %q", nodeName)
  218. }
  219. pod := &v1.Pod{
  220. ObjectMeta: metav1.ObjectMeta{
  221. Labels: template.Labels,
  222. Namespace: namespace,
  223. GenerateName: fmt.Sprintf("%s-", nodeName),
  224. },
  225. }
  226. if err := legacyscheme.Scheme.Convert(&template.Spec, &pod.Spec, nil); err != nil {
  227. return fmt.Errorf("unable to convert pod template: %v", err)
  228. }
  229. if len(nodeName) != 0 {
  230. pod.Spec.NodeName = nodeName
  231. }
  232. pod.Name = names.SimpleNameGenerator.GenerateName(fmt.Sprintf("%s-", nodeName))
  233. f.podStore.Update(pod)
  234. f.podIDMap[pod.Name] = pod
  235. ds := object.(*apps.DaemonSet)
  236. dsKey, _ := controller.KeyFunc(ds)
  237. f.expectations.CreationObserved(dsKey)
  238. return nil
  239. }
  240. func (f *fakePodControl) CreatePodsWithControllerRef(namespace string, template *v1.PodTemplateSpec, object runtime.Object, controllerRef *metav1.OwnerReference) error {
  241. f.Lock()
  242. defer f.Unlock()
  243. if err := f.FakePodControl.CreatePodsWithControllerRef(namespace, template, object, controllerRef); err != nil {
  244. return fmt.Errorf("failed to create pod for DaemonSet")
  245. }
  246. pod := &v1.Pod{
  247. ObjectMeta: metav1.ObjectMeta{
  248. Labels: template.Labels,
  249. Namespace: namespace,
  250. },
  251. }
  252. pod.Name = names.SimpleNameGenerator.GenerateName(fmt.Sprintf("%p-", pod))
  253. if err := legacyscheme.Scheme.Convert(&template.Spec, &pod.Spec, nil); err != nil {
  254. return fmt.Errorf("unable to convert pod template: %v", err)
  255. }
  256. f.podStore.Update(pod)
  257. f.podIDMap[pod.Name] = pod
  258. ds := object.(*apps.DaemonSet)
  259. dsKey, _ := controller.KeyFunc(ds)
  260. f.expectations.CreationObserved(dsKey)
  261. return nil
  262. }
  263. func (f *fakePodControl) DeletePod(namespace string, podID string, object runtime.Object) error {
  264. f.Lock()
  265. defer f.Unlock()
  266. if err := f.FakePodControl.DeletePod(namespace, podID, object); err != nil {
  267. return fmt.Errorf("failed to delete pod %q", podID)
  268. }
  269. pod, ok := f.podIDMap[podID]
  270. if !ok {
  271. return fmt.Errorf("pod %q does not exist", podID)
  272. }
  273. f.podStore.Delete(pod)
  274. delete(f.podIDMap, podID)
  275. ds := object.(*apps.DaemonSet)
  276. dsKey, _ := controller.KeyFunc(ds)
  277. f.expectations.DeletionObserved(dsKey)
  278. return nil
  279. }
  280. type daemonSetsController struct {
  281. *DaemonSetsController
  282. dsStore cache.Store
  283. historyStore cache.Store
  284. podStore cache.Store
  285. nodeStore cache.Store
  286. fakeRecorder *record.FakeRecorder
  287. }
  288. func newTestController(initialObjects ...runtime.Object) (*daemonSetsController, *fakePodControl, *fake.Clientset, error) {
  289. clientset := fake.NewSimpleClientset(initialObjects...)
  290. informerFactory := informers.NewSharedInformerFactory(clientset, controller.NoResyncPeriodFunc())
  291. dsc, err := NewDaemonSetsController(
  292. informerFactory.Apps().V1().DaemonSets(),
  293. informerFactory.Apps().V1().ControllerRevisions(),
  294. informerFactory.Core().V1().Pods(),
  295. informerFactory.Core().V1().Nodes(),
  296. clientset,
  297. flowcontrol.NewFakeBackOff(50*time.Millisecond, 500*time.Millisecond, clock.NewFakeClock(time.Now())),
  298. )
  299. if err != nil {
  300. return nil, nil, nil, err
  301. }
  302. fakeRecorder := record.NewFakeRecorder(100)
  303. dsc.eventRecorder = fakeRecorder
  304. dsc.podStoreSynced = alwaysReady
  305. dsc.nodeStoreSynced = alwaysReady
  306. dsc.dsStoreSynced = alwaysReady
  307. dsc.historyStoreSynced = alwaysReady
  308. podControl := newFakePodControl()
  309. dsc.podControl = podControl
  310. podControl.podStore = informerFactory.Core().V1().Pods().Informer().GetStore()
  311. newDsc := &daemonSetsController{
  312. dsc,
  313. informerFactory.Apps().V1().DaemonSets().Informer().GetStore(),
  314. informerFactory.Apps().V1().ControllerRevisions().Informer().GetStore(),
  315. informerFactory.Core().V1().Pods().Informer().GetStore(),
  316. informerFactory.Core().V1().Nodes().Informer().GetStore(),
  317. fakeRecorder,
  318. }
  319. podControl.expectations = newDsc.expectations
  320. return newDsc, podControl, clientset, nil
  321. }
  322. func resetCounters(manager *daemonSetsController) {
  323. manager.podControl.(*fakePodControl).Clear()
  324. fakeRecorder := record.NewFakeRecorder(100)
  325. manager.eventRecorder = fakeRecorder
  326. manager.fakeRecorder = fakeRecorder
  327. }
  328. func validateSyncDaemonSets(t *testing.T, manager *daemonSetsController, fakePodControl *fakePodControl, expectedCreates, expectedDeletes int, expectedEvents int) {
  329. if len(fakePodControl.Templates) != expectedCreates {
  330. t.Errorf("Unexpected number of creates. Expected %d, saw %d\n", expectedCreates, len(fakePodControl.Templates))
  331. }
  332. if len(fakePodControl.DeletePodName) != expectedDeletes {
  333. t.Errorf("Unexpected number of deletes. Expected %d, saw %d\n", expectedDeletes, len(fakePodControl.DeletePodName))
  334. }
  335. if len(manager.fakeRecorder.Events) != expectedEvents {
  336. t.Errorf("Unexpected number of events. Expected %d, saw %d\n", expectedEvents, len(manager.fakeRecorder.Events))
  337. }
  338. // Every Pod created should have a ControllerRef.
  339. if got, want := len(fakePodControl.ControllerRefs), expectedCreates; got != want {
  340. t.Errorf("len(ControllerRefs) = %v, want %v", got, want)
  341. }
  342. // Make sure the ControllerRefs are correct.
  343. for _, controllerRef := range fakePodControl.ControllerRefs {
  344. if got, want := controllerRef.APIVersion, "apps/v1"; got != want {
  345. t.Errorf("controllerRef.APIVersion = %q, want %q", got, want)
  346. }
  347. if got, want := controllerRef.Kind, "DaemonSet"; got != want {
  348. t.Errorf("controllerRef.Kind = %q, want %q", got, want)
  349. }
  350. if controllerRef.Controller == nil || *controllerRef.Controller != true {
  351. t.Errorf("controllerRef.Controller is not set to true")
  352. }
  353. }
  354. }
  355. func syncAndValidateDaemonSets(t *testing.T, manager *daemonSetsController, ds *apps.DaemonSet, podControl *fakePodControl, expectedCreates, expectedDeletes int, expectedEvents int) {
  356. key, err := controller.KeyFunc(ds)
  357. if err != nil {
  358. t.Errorf("Could not get key for daemon.")
  359. }
  360. manager.syncHandler(key)
  361. validateSyncDaemonSets(t, manager, podControl, expectedCreates, expectedDeletes, expectedEvents)
  362. }
  363. // clearExpectations copies the FakePodControl to PodStore and clears the create and delete expectations.
  364. func clearExpectations(t *testing.T, manager *daemonSetsController, ds *apps.DaemonSet, fakePodControl *fakePodControl) {
  365. fakePodControl.Clear()
  366. key, err := controller.KeyFunc(ds)
  367. if err != nil {
  368. t.Errorf("Could not get key for daemon.")
  369. return
  370. }
  371. manager.expectations.DeleteExpectations(key)
  372. }
  373. func TestDeleteFinalStateUnknown(t *testing.T) {
  374. for _, strategy := range updateStrategies() {
  375. manager, _, _, err := newTestController()
  376. if err != nil {
  377. t.Fatalf("error creating DaemonSets controller: %v", err)
  378. }
  379. addNodes(manager.nodeStore, 0, 1, nil)
  380. ds := newDaemonSet("foo")
  381. ds.Spec.UpdateStrategy = *strategy
  382. // DeletedFinalStateUnknown should queue the embedded DS if found.
  383. manager.deleteDaemonset(cache.DeletedFinalStateUnknown{Key: "foo", Obj: ds})
  384. enqueuedKey, _ := manager.queue.Get()
  385. if enqueuedKey.(string) != "default/foo" {
  386. t.Errorf("expected delete of DeletedFinalStateUnknown to enqueue the daemonset but found: %#v", enqueuedKey)
  387. }
  388. }
  389. }
  390. func markPodsReady(store cache.Store) {
  391. // mark pods as ready
  392. for _, obj := range store.List() {
  393. pod := obj.(*v1.Pod)
  394. markPodReady(pod)
  395. }
  396. }
  397. func markPodReady(pod *v1.Pod) {
  398. condition := v1.PodCondition{Type: v1.PodReady, Status: v1.ConditionTrue}
  399. podutil.UpdatePodCondition(&pod.Status, &condition)
  400. }
  401. // DaemonSets without node selectors should launch pods on every node.
  402. func TestSimpleDaemonSetLaunchesPods(t *testing.T) {
  403. for _, strategy := range updateStrategies() {
  404. ds := newDaemonSet("foo")
  405. ds.Spec.UpdateStrategy = *strategy
  406. manager, podControl, _, err := newTestController(ds)
  407. if err != nil {
  408. t.Fatalf("error creating DaemonSets controller: %v", err)
  409. }
  410. addNodes(manager.nodeStore, 0, 5, nil)
  411. manager.dsStore.Add(ds)
  412. syncAndValidateDaemonSets(t, manager, ds, podControl, 5, 0, 0)
  413. }
  414. }
  415. // DaemonSets without node selectors should launch pods on every node by NodeAffinity.
  416. func TestSimpleDaemonSetScheduleDaemonSetPodsLaunchesPods(t *testing.T) {
  417. nodeNum := 5
  418. for _, strategy := range updateStrategies() {
  419. ds := newDaemonSet("foo")
  420. ds.Spec.UpdateStrategy = *strategy
  421. manager, podControl, _, err := newTestController(ds)
  422. if err != nil {
  423. t.Fatalf("error creating DaemonSets controller: %v", err)
  424. }
  425. addNodes(manager.nodeStore, 0, nodeNum, nil)
  426. manager.dsStore.Add(ds)
  427. syncAndValidateDaemonSets(t, manager, ds, podControl, nodeNum, 0, 0)
  428. if len(podControl.podIDMap) != nodeNum {
  429. t.Fatalf("failed to create pods for DaemonSet")
  430. }
  431. nodeMap := make(map[string]*v1.Node)
  432. for _, node := range manager.nodeStore.List() {
  433. n := node.(*v1.Node)
  434. nodeMap[n.Name] = n
  435. }
  436. if len(nodeMap) != nodeNum {
  437. t.Fatalf("not enough nodes in the store, expected: %v, got: %v",
  438. nodeNum, len(nodeMap))
  439. }
  440. for _, pod := range podControl.podIDMap {
  441. if len(pod.Spec.NodeName) != 0 {
  442. t.Fatalf("the hostname of pod %v should be empty, but got %s",
  443. pod.Name, pod.Spec.NodeName)
  444. }
  445. if pod.Spec.Affinity == nil {
  446. t.Fatalf("the Affinity of pod %s is nil.", pod.Name)
  447. }
  448. if pod.Spec.Affinity.NodeAffinity == nil {
  449. t.Fatalf("the NodeAffinity of pod %s is nil.", pod.Name)
  450. }
  451. nodeSelector := pod.Spec.Affinity.NodeAffinity.RequiredDuringSchedulingIgnoredDuringExecution
  452. if nodeSelector == nil {
  453. t.Fatalf("the node selector of pod %s is nil.", pod.Name)
  454. }
  455. if len(nodeSelector.NodeSelectorTerms) != 1 {
  456. t.Fatalf("incorrect number of node selector terms in pod %s, expected: 1, got: %d.",
  457. pod.Name, len(nodeSelector.NodeSelectorTerms))
  458. }
  459. if len(nodeSelector.NodeSelectorTerms[0].MatchFields) != 1 {
  460. t.Fatalf("incorrect number of fields in node selector term for pod %s, expected: 1, got: %d.",
  461. pod.Name, len(nodeSelector.NodeSelectorTerms[0].MatchFields))
  462. }
  463. field := nodeSelector.NodeSelectorTerms[0].MatchFields[0]
  464. if field.Key == api.ObjectNameField {
  465. if field.Operator != v1.NodeSelectorOpIn {
  466. t.Fatalf("the operation of hostname NodeAffinity is not %v", v1.NodeSelectorOpIn)
  467. }
  468. if len(field.Values) != 1 {
  469. t.Fatalf("incorrect hostname in node affinity: expected 1, got %v", len(field.Values))
  470. }
  471. delete(nodeMap, field.Values[0])
  472. }
  473. }
  474. if len(nodeMap) != 0 {
  475. t.Fatalf("did not foud pods on nodes %+v", nodeMap)
  476. }
  477. }
  478. }
  479. // Simulate a cluster with 100 nodes, but simulate a limit (like a quota limit)
  480. // of 10 pods, and verify that the ds doesn't make 100 create calls per sync pass
  481. func TestSimpleDaemonSetPodCreateErrors(t *testing.T) {
  482. for _, strategy := range updateStrategies() {
  483. ds := newDaemonSet("foo")
  484. ds.Spec.UpdateStrategy = *strategy
  485. manager, podControl, _, err := newTestController(ds)
  486. if err != nil {
  487. t.Fatalf("error creating DaemonSets controller: %v", err)
  488. }
  489. podControl.FakePodControl.CreateLimit = 10
  490. addNodes(manager.nodeStore, 0, podControl.FakePodControl.CreateLimit*10, nil)
  491. manager.dsStore.Add(ds)
  492. syncAndValidateDaemonSets(t, manager, ds, podControl, podControl.FakePodControl.CreateLimit, 0, 0)
  493. expectedLimit := 0
  494. for pass := uint8(0); expectedLimit <= podControl.FakePodControl.CreateLimit; pass++ {
  495. expectedLimit += controller.SlowStartInitialBatchSize << pass
  496. }
  497. if podControl.FakePodControl.CreateCallCount > expectedLimit {
  498. t.Errorf("Unexpected number of create calls. Expected <= %d, saw %d\n", podControl.FakePodControl.CreateLimit*2, podControl.FakePodControl.CreateCallCount)
  499. }
  500. }
  501. }
  502. func TestDaemonSetPodCreateExpectationsError(t *testing.T) {
  503. strategies := updateStrategies()
  504. for _, strategy := range strategies {
  505. ds := newDaemonSet("foo")
  506. ds.Spec.UpdateStrategy = *strategy
  507. manager, podControl, _, err := newTestController(ds)
  508. if err != nil {
  509. t.Fatalf("error creating DaemonSets controller: %v", err)
  510. }
  511. podControl.FakePodControl.CreateLimit = 10
  512. creationExpectations := 100
  513. addNodes(manager.nodeStore, 0, 100, nil)
  514. manager.dsStore.Add(ds)
  515. syncAndValidateDaemonSets(t, manager, ds, podControl, podControl.FakePodControl.CreateLimit, 0, 0)
  516. dsKey, err := controller.KeyFunc(ds)
  517. if err != nil {
  518. t.Fatalf("error get DaemonSets controller key: %v", err)
  519. }
  520. if !manager.expectations.SatisfiedExpectations(dsKey) {
  521. t.Errorf("Unsatisfied pod creation expectatitons. Expected %d", creationExpectations)
  522. }
  523. }
  524. }
  525. func TestSimpleDaemonSetUpdatesStatusAfterLaunchingPods(t *testing.T) {
  526. for _, strategy := range updateStrategies() {
  527. ds := newDaemonSet("foo")
  528. ds.Spec.UpdateStrategy = *strategy
  529. manager, podControl, clientset, err := newTestController(ds)
  530. if err != nil {
  531. t.Fatalf("error creating DaemonSets controller: %v", err)
  532. }
  533. var updated *apps.DaemonSet
  534. clientset.PrependReactor("update", "daemonsets", func(action core.Action) (handled bool, ret runtime.Object, err error) {
  535. if action.GetSubresource() != "status" {
  536. return false, nil, nil
  537. }
  538. if u, ok := action.(core.UpdateAction); ok {
  539. updated = u.GetObject().(*apps.DaemonSet)
  540. }
  541. return false, nil, nil
  542. })
  543. manager.dsStore.Add(ds)
  544. addNodes(manager.nodeStore, 0, 5, nil)
  545. syncAndValidateDaemonSets(t, manager, ds, podControl, 5, 0, 0)
  546. // Make sure the single sync() updated Status already for the change made
  547. // during the manage() phase.
  548. if got, want := updated.Status.CurrentNumberScheduled, int32(5); got != want {
  549. t.Errorf("Status.CurrentNumberScheduled = %v, want %v", got, want)
  550. }
  551. }
  552. }
  553. // DaemonSets should do nothing if there aren't any nodes
  554. func TestNoNodesDoesNothing(t *testing.T) {
  555. for _, strategy := range updateStrategies() {
  556. manager, podControl, _, err := newTestController()
  557. if err != nil {
  558. t.Fatalf("error creating DaemonSets controller: %v", err)
  559. }
  560. ds := newDaemonSet("foo")
  561. ds.Spec.UpdateStrategy = *strategy
  562. manager.dsStore.Add(ds)
  563. syncAndValidateDaemonSets(t, manager, ds, podControl, 0, 0, 0)
  564. }
  565. }
  566. // DaemonSets without node selectors should launch on a single node in a
  567. // single node cluster.
  568. func TestOneNodeDaemonLaunchesPod(t *testing.T) {
  569. for _, strategy := range updateStrategies() {
  570. ds := newDaemonSet("foo")
  571. ds.Spec.UpdateStrategy = *strategy
  572. manager, podControl, _, err := newTestController(ds)
  573. if err != nil {
  574. t.Fatalf("error creating DaemonSets controller: %v", err)
  575. }
  576. manager.nodeStore.Add(newNode("only-node", nil))
  577. manager.dsStore.Add(ds)
  578. syncAndValidateDaemonSets(t, manager, ds, podControl, 1, 0, 0)
  579. }
  580. }
  581. // DaemonSets should place onto NotReady nodes
  582. func TestNotReadyNodeDaemonDoesLaunchPod(t *testing.T) {
  583. for _, strategy := range updateStrategies() {
  584. ds := newDaemonSet("foo")
  585. ds.Spec.UpdateStrategy = *strategy
  586. manager, podControl, _, err := newTestController(ds)
  587. if err != nil {
  588. t.Fatalf("error creating DaemonSets controller: %v", err)
  589. }
  590. node := newNode("not-ready", nil)
  591. node.Status.Conditions = []v1.NodeCondition{
  592. {Type: v1.NodeReady, Status: v1.ConditionFalse},
  593. }
  594. manager.nodeStore.Add(node)
  595. manager.dsStore.Add(ds)
  596. syncAndValidateDaemonSets(t, manager, ds, podControl, 1, 0, 0)
  597. }
  598. }
  599. func resourcePodSpec(nodeName, memory, cpu string) v1.PodSpec {
  600. return v1.PodSpec{
  601. NodeName: nodeName,
  602. Containers: []v1.Container{{
  603. Resources: v1.ResourceRequirements{
  604. Requests: allocatableResources(memory, cpu),
  605. },
  606. }},
  607. }
  608. }
  609. func resourceContainerSpec(memory, cpu string) v1.ResourceRequirements {
  610. return v1.ResourceRequirements{
  611. Requests: allocatableResources(memory, cpu),
  612. }
  613. }
  614. func resourcePodSpecWithoutNodeName(memory, cpu string) v1.PodSpec {
  615. return v1.PodSpec{
  616. Containers: []v1.Container{{
  617. Resources: v1.ResourceRequirements{
  618. Requests: allocatableResources(memory, cpu),
  619. },
  620. }},
  621. }
  622. }
  623. func allocatableResources(memory, cpu string) v1.ResourceList {
  624. return v1.ResourceList{
  625. v1.ResourceMemory: resource.MustParse(memory),
  626. v1.ResourceCPU: resource.MustParse(cpu),
  627. v1.ResourcePods: resource.MustParse("100"),
  628. }
  629. }
  630. // DaemonSets should not unschedule a daemonset pod from a node with insufficient free resource
  631. func TestInsufficientCapacityNodeDaemonDoesNotUnscheduleRunningPod(t *testing.T) {
  632. for _, strategy := range updateStrategies() {
  633. podSpec := resourcePodSpec("too-much-mem", "75M", "75m")
  634. podSpec.NodeName = "too-much-mem"
  635. ds := newDaemonSet("foo")
  636. ds.Spec.UpdateStrategy = *strategy
  637. ds.Spec.Template.Spec = podSpec
  638. manager, podControl, _, err := newTestController(ds)
  639. if err != nil {
  640. t.Fatalf("error creating DaemonSets controller: %v", err)
  641. }
  642. node := newNode("too-much-mem", nil)
  643. node.Status.Allocatable = allocatableResources("100M", "200m")
  644. manager.nodeStore.Add(node)
  645. manager.podStore.Add(&v1.Pod{
  646. Spec: podSpec,
  647. })
  648. manager.dsStore.Add(ds)
  649. switch strategy.Type {
  650. case apps.OnDeleteDaemonSetStrategyType:
  651. syncAndValidateDaemonSets(t, manager, ds, podControl, 1, 0, 0)
  652. case apps.RollingUpdateDaemonSetStrategyType:
  653. syncAndValidateDaemonSets(t, manager, ds, podControl, 1, 0, 0)
  654. default:
  655. t.Fatalf("unexpected UpdateStrategy %+v", strategy)
  656. }
  657. }
  658. }
  659. // DaemonSets should only place onto nodes with sufficient free resource and matched node selector
  660. func TestInsufficientCapacityNodeSufficientCapacityWithNodeLabelDaemonLaunchPod(t *testing.T) {
  661. podSpec := resourcePodSpecWithoutNodeName("50M", "75m")
  662. ds := newDaemonSet("foo")
  663. ds.Spec.Template.Spec = podSpec
  664. ds.Spec.Template.Spec.NodeSelector = simpleNodeLabel
  665. manager, podControl, _, err := newTestController(ds)
  666. if err != nil {
  667. t.Fatalf("error creating DaemonSets controller: %v", err)
  668. }
  669. node1 := newNode("not-enough-resource", nil)
  670. node1.Status.Allocatable = allocatableResources("10M", "20m")
  671. node2 := newNode("enough-resource", simpleNodeLabel)
  672. node2.Status.Allocatable = allocatableResources("100M", "200m")
  673. manager.nodeStore.Add(node1)
  674. manager.nodeStore.Add(node2)
  675. manager.dsStore.Add(ds)
  676. syncAndValidateDaemonSets(t, manager, ds, podControl, 1, 0, 0)
  677. // we do not expect any event for insufficient free resource
  678. if len(manager.fakeRecorder.Events) != 0 {
  679. t.Fatalf("unexpected events, got %v, expected %v: %+v", len(manager.fakeRecorder.Events), 0, manager.fakeRecorder.Events)
  680. }
  681. }
  682. // DaemonSet should launch a pod on a node with taint NetworkUnavailable condition.
  683. func TestNetworkUnavailableNodeDaemonLaunchesPod(t *testing.T) {
  684. for _, strategy := range updateStrategies() {
  685. ds := newDaemonSet("simple")
  686. ds.Spec.UpdateStrategy = *strategy
  687. manager, podControl, _, err := newTestController(ds)
  688. if err != nil {
  689. t.Fatalf("error creating DaemonSets controller: %v", err)
  690. }
  691. node := newNode("network-unavailable", nil)
  692. node.Status.Conditions = []v1.NodeCondition{
  693. {Type: v1.NodeNetworkUnavailable, Status: v1.ConditionTrue},
  694. }
  695. manager.nodeStore.Add(node)
  696. manager.dsStore.Add(ds)
  697. syncAndValidateDaemonSets(t, manager, ds, podControl, 1, 0, 0)
  698. }
  699. }
  700. // DaemonSets not take any actions when being deleted
  701. func TestDontDoAnythingIfBeingDeleted(t *testing.T) {
  702. for _, strategy := range updateStrategies() {
  703. podSpec := resourcePodSpec("not-too-much-mem", "75M", "75m")
  704. ds := newDaemonSet("foo")
  705. ds.Spec.UpdateStrategy = *strategy
  706. ds.Spec.Template.Spec = podSpec
  707. now := metav1.Now()
  708. ds.DeletionTimestamp = &now
  709. manager, podControl, _, err := newTestController(ds)
  710. if err != nil {
  711. t.Fatalf("error creating DaemonSets controller: %v", err)
  712. }
  713. node := newNode("not-too-much-mem", nil)
  714. node.Status.Allocatable = allocatableResources("200M", "200m")
  715. manager.nodeStore.Add(node)
  716. manager.podStore.Add(&v1.Pod{
  717. Spec: podSpec,
  718. })
  719. manager.dsStore.Add(ds)
  720. syncAndValidateDaemonSets(t, manager, ds, podControl, 0, 0, 0)
  721. }
  722. }
  723. func TestDontDoAnythingIfBeingDeletedRace(t *testing.T) {
  724. for _, strategy := range updateStrategies() {
  725. // Bare client says it IS deleted.
  726. ds := newDaemonSet("foo")
  727. ds.Spec.UpdateStrategy = *strategy
  728. now := metav1.Now()
  729. ds.DeletionTimestamp = &now
  730. manager, podControl, _, err := newTestController(ds)
  731. if err != nil {
  732. t.Fatalf("error creating DaemonSets controller: %v", err)
  733. }
  734. addNodes(manager.nodeStore, 0, 5, nil)
  735. // Lister (cache) says it's NOT deleted.
  736. ds2 := *ds
  737. ds2.DeletionTimestamp = nil
  738. manager.dsStore.Add(&ds2)
  739. // The existence of a matching orphan should block all actions in this state.
  740. pod := newPod("pod1-", "node-0", simpleDaemonSetLabel, nil)
  741. manager.podStore.Add(pod)
  742. syncAndValidateDaemonSets(t, manager, ds, podControl, 0, 0, 0)
  743. }
  744. }
  745. // Test that if the node is already scheduled with a pod using a host port
  746. // but belonging to the same daemonset, we don't delete that pod
  747. //
  748. // Issue: https://github.com/kubernetes/kubernetes/issues/22309
  749. func TestPortConflictWithSameDaemonPodDoesNotDeletePod(t *testing.T) {
  750. for _, strategy := range updateStrategies() {
  751. podSpec := v1.PodSpec{
  752. NodeName: "port-conflict",
  753. Containers: []v1.Container{{
  754. Ports: []v1.ContainerPort{{
  755. HostPort: 666,
  756. }},
  757. }},
  758. }
  759. manager, podControl, _, err := newTestController()
  760. if err != nil {
  761. t.Fatalf("error creating DaemonSets controller: %v", err)
  762. }
  763. node := newNode("port-conflict", nil)
  764. manager.nodeStore.Add(node)
  765. ds := newDaemonSet("foo")
  766. ds.Spec.UpdateStrategy = *strategy
  767. ds.Spec.Template.Spec = podSpec
  768. manager.dsStore.Add(ds)
  769. pod := newPod(ds.Name+"-", node.Name, simpleDaemonSetLabel, ds)
  770. manager.podStore.Add(pod)
  771. syncAndValidateDaemonSets(t, manager, ds, podControl, 0, 0, 0)
  772. }
  773. }
  774. // DaemonSets should place onto nodes that would not cause port conflicts
  775. func TestNoPortConflictNodeDaemonLaunchesPod(t *testing.T) {
  776. for _, strategy := range updateStrategies() {
  777. podSpec1 := v1.PodSpec{
  778. NodeName: "no-port-conflict",
  779. Containers: []v1.Container{{
  780. Ports: []v1.ContainerPort{{
  781. HostPort: 6661,
  782. }},
  783. }},
  784. }
  785. podSpec2 := v1.PodSpec{
  786. NodeName: "no-port-conflict",
  787. Containers: []v1.Container{{
  788. Ports: []v1.ContainerPort{{
  789. HostPort: 6662,
  790. }},
  791. }},
  792. }
  793. ds := newDaemonSet("foo")
  794. ds.Spec.UpdateStrategy = *strategy
  795. ds.Spec.Template.Spec = podSpec2
  796. manager, podControl, _, err := newTestController(ds)
  797. if err != nil {
  798. t.Fatalf("error creating DaemonSets controller: %v", err)
  799. }
  800. node := newNode("no-port-conflict", nil)
  801. manager.nodeStore.Add(node)
  802. manager.podStore.Add(&v1.Pod{
  803. Spec: podSpec1,
  804. })
  805. manager.dsStore.Add(ds)
  806. syncAndValidateDaemonSets(t, manager, ds, podControl, 1, 0, 0)
  807. }
  808. }
  809. // DaemonSetController should not sync DaemonSets with empty pod selectors.
  810. //
  811. // issue https://github.com/kubernetes/kubernetes/pull/23223
  812. func TestPodIsNotDeletedByDaemonsetWithEmptyLabelSelector(t *testing.T) {
  813. // Create a misconfigured DaemonSet. An empty pod selector is invalid but could happen
  814. // if we upgrade and make a backwards incompatible change.
  815. //
  816. // The node selector matches no nodes which mimics the behavior of kubectl delete.
  817. //
  818. // The DaemonSet should not schedule pods and should not delete scheduled pods in
  819. // this case even though it's empty pod selector matches all pods. The DaemonSetController
  820. // should detect this misconfiguration and choose not to sync the DaemonSet. We should
  821. // not observe a deletion of the pod on node1.
  822. for _, strategy := range updateStrategies() {
  823. ds := newDaemonSet("foo")
  824. ds.Spec.UpdateStrategy = *strategy
  825. ls := metav1.LabelSelector{}
  826. ds.Spec.Selector = &ls
  827. ds.Spec.Template.Spec.NodeSelector = map[string]string{"foo": "bar"}
  828. manager, podControl, _, err := newTestController(ds)
  829. if err != nil {
  830. t.Fatalf("error creating DaemonSets controller: %v", err)
  831. }
  832. manager.nodeStore.Add(newNode("node1", nil))
  833. // Create pod not controlled by a daemonset.
  834. manager.podStore.Add(&v1.Pod{
  835. ObjectMeta: metav1.ObjectMeta{
  836. Labels: map[string]string{"bang": "boom"},
  837. Namespace: metav1.NamespaceDefault,
  838. },
  839. Spec: v1.PodSpec{
  840. NodeName: "node1",
  841. },
  842. })
  843. manager.dsStore.Add(ds)
  844. syncAndValidateDaemonSets(t, manager, ds, podControl, 0, 0, 1)
  845. }
  846. }
  847. // Controller should not create pods on nodes which have daemon pods, and should remove excess pods from nodes that have extra pods.
  848. func TestDealsWithExistingPods(t *testing.T) {
  849. for _, strategy := range updateStrategies() {
  850. ds := newDaemonSet("foo")
  851. ds.Spec.UpdateStrategy = *strategy
  852. manager, podControl, _, err := newTestController(ds)
  853. if err != nil {
  854. t.Fatalf("error creating DaemonSets controller: %v", err)
  855. }
  856. manager.dsStore.Add(ds)
  857. addNodes(manager.nodeStore, 0, 5, nil)
  858. addPods(manager.podStore, "node-1", simpleDaemonSetLabel, ds, 1)
  859. addPods(manager.podStore, "node-2", simpleDaemonSetLabel, ds, 2)
  860. addPods(manager.podStore, "node-3", simpleDaemonSetLabel, ds, 5)
  861. addPods(manager.podStore, "node-4", simpleDaemonSetLabel2, ds, 2)
  862. syncAndValidateDaemonSets(t, manager, ds, podControl, 2, 5, 0)
  863. }
  864. }
  865. // Daemon with node selector should launch pods on nodes matching selector.
  866. func TestSelectorDaemonLaunchesPods(t *testing.T) {
  867. for _, strategy := range updateStrategies() {
  868. daemon := newDaemonSet("foo")
  869. daemon.Spec.UpdateStrategy = *strategy
  870. daemon.Spec.Template.Spec.NodeSelector = simpleNodeLabel
  871. manager, podControl, _, err := newTestController(daemon)
  872. if err != nil {
  873. t.Fatalf("error creating DaemonSets controller: %v", err)
  874. }
  875. addNodes(manager.nodeStore, 0, 4, nil)
  876. addNodes(manager.nodeStore, 4, 3, simpleNodeLabel)
  877. manager.dsStore.Add(daemon)
  878. syncAndValidateDaemonSets(t, manager, daemon, podControl, 3, 0, 0)
  879. }
  880. }
  881. // Daemon with node selector should delete pods from nodes that do not satisfy selector.
  882. func TestSelectorDaemonDeletesUnselectedPods(t *testing.T) {
  883. for _, strategy := range updateStrategies() {
  884. ds := newDaemonSet("foo")
  885. ds.Spec.UpdateStrategy = *strategy
  886. ds.Spec.Template.Spec.NodeSelector = simpleNodeLabel
  887. manager, podControl, _, err := newTestController(ds)
  888. if err != nil {
  889. t.Fatalf("error creating DaemonSets controller: %v", err)
  890. }
  891. manager.dsStore.Add(ds)
  892. addNodes(manager.nodeStore, 0, 5, nil)
  893. addNodes(manager.nodeStore, 5, 5, simpleNodeLabel)
  894. addPods(manager.podStore, "node-0", simpleDaemonSetLabel2, ds, 2)
  895. addPods(manager.podStore, "node-1", simpleDaemonSetLabel, ds, 3)
  896. addPods(manager.podStore, "node-1", simpleDaemonSetLabel2, ds, 1)
  897. addPods(manager.podStore, "node-4", simpleDaemonSetLabel, ds, 1)
  898. syncAndValidateDaemonSets(t, manager, ds, podControl, 5, 4, 0)
  899. }
  900. }
  901. // DaemonSet with node selector should launch pods on nodes matching selector, but also deal with existing pods on nodes.
  902. func TestSelectorDaemonDealsWithExistingPods(t *testing.T) {
  903. for _, strategy := range updateStrategies() {
  904. ds := newDaemonSet("foo")
  905. ds.Spec.UpdateStrategy = *strategy
  906. ds.Spec.Template.Spec.NodeSelector = simpleNodeLabel
  907. manager, podControl, _, err := newTestController(ds)
  908. if err != nil {
  909. t.Fatalf("error creating DaemonSets controller: %v", err)
  910. }
  911. manager.dsStore.Add(ds)
  912. addNodes(manager.nodeStore, 0, 5, nil)
  913. addNodes(manager.nodeStore, 5, 5, simpleNodeLabel)
  914. addPods(manager.podStore, "node-0", simpleDaemonSetLabel, ds, 1)
  915. addPods(manager.podStore, "node-1", simpleDaemonSetLabel, ds, 3)
  916. addPods(manager.podStore, "node-1", simpleDaemonSetLabel2, ds, 2)
  917. addPods(manager.podStore, "node-2", simpleDaemonSetLabel, ds, 4)
  918. addPods(manager.podStore, "node-6", simpleDaemonSetLabel, ds, 13)
  919. addPods(manager.podStore, "node-7", simpleDaemonSetLabel2, ds, 4)
  920. addPods(manager.podStore, "node-9", simpleDaemonSetLabel, ds, 1)
  921. addPods(manager.podStore, "node-9", simpleDaemonSetLabel2, ds, 1)
  922. syncAndValidateDaemonSets(t, manager, ds, podControl, 3, 20, 0)
  923. }
  924. }
  925. // DaemonSet with node selector which does not match any node labels should not launch pods.
  926. func TestBadSelectorDaemonDoesNothing(t *testing.T) {
  927. for _, strategy := range updateStrategies() {
  928. manager, podControl, _, err := newTestController()
  929. if err != nil {
  930. t.Fatalf("error creating DaemonSets controller: %v", err)
  931. }
  932. addNodes(manager.nodeStore, 0, 4, nil)
  933. addNodes(manager.nodeStore, 4, 3, simpleNodeLabel)
  934. ds := newDaemonSet("foo")
  935. ds.Spec.UpdateStrategy = *strategy
  936. ds.Spec.Template.Spec.NodeSelector = simpleNodeLabel2
  937. manager.dsStore.Add(ds)
  938. syncAndValidateDaemonSets(t, manager, ds, podControl, 0, 0, 0)
  939. }
  940. }
  941. // DaemonSet with node name should launch pod on node with corresponding name.
  942. func TestNameDaemonSetLaunchesPods(t *testing.T) {
  943. for _, strategy := range updateStrategies() {
  944. ds := newDaemonSet("foo")
  945. ds.Spec.UpdateStrategy = *strategy
  946. ds.Spec.Template.Spec.NodeName = "node-0"
  947. manager, podControl, _, err := newTestController(ds)
  948. if err != nil {
  949. t.Fatalf("error creating DaemonSets controller: %v", err)
  950. }
  951. addNodes(manager.nodeStore, 0, 5, nil)
  952. manager.dsStore.Add(ds)
  953. syncAndValidateDaemonSets(t, manager, ds, podControl, 1, 0, 0)
  954. }
  955. }
  956. // DaemonSet with node name that does not exist should not launch pods.
  957. func TestBadNameDaemonSetDoesNothing(t *testing.T) {
  958. for _, strategy := range updateStrategies() {
  959. ds := newDaemonSet("foo")
  960. ds.Spec.UpdateStrategy = *strategy
  961. ds.Spec.Template.Spec.NodeName = "node-10"
  962. manager, podControl, _, err := newTestController(ds)
  963. if err != nil {
  964. t.Fatalf("error creating DaemonSets controller: %v", err)
  965. }
  966. addNodes(manager.nodeStore, 0, 5, nil)
  967. manager.dsStore.Add(ds)
  968. syncAndValidateDaemonSets(t, manager, ds, podControl, 0, 0, 0)
  969. }
  970. }
  971. // DaemonSet with node selector, and node name, matching a node, should launch a pod on the node.
  972. func TestNameAndSelectorDaemonSetLaunchesPods(t *testing.T) {
  973. for _, strategy := range updateStrategies() {
  974. ds := newDaemonSet("foo")
  975. ds.Spec.UpdateStrategy = *strategy
  976. ds.Spec.Template.Spec.NodeSelector = simpleNodeLabel
  977. ds.Spec.Template.Spec.NodeName = "node-6"
  978. manager, podControl, _, err := newTestController(ds)
  979. if err != nil {
  980. t.Fatalf("error creating DaemonSets controller: %v", err)
  981. }
  982. addNodes(manager.nodeStore, 0, 4, nil)
  983. addNodes(manager.nodeStore, 4, 3, simpleNodeLabel)
  984. manager.dsStore.Add(ds)
  985. syncAndValidateDaemonSets(t, manager, ds, podControl, 1, 0, 0)
  986. }
  987. }
  988. // DaemonSet with node selector that matches some nodes, and node name that matches a different node, should do nothing.
  989. func TestInconsistentNameSelectorDaemonSetDoesNothing(t *testing.T) {
  990. for _, strategy := range updateStrategies() {
  991. ds := newDaemonSet("foo")
  992. ds.Spec.UpdateStrategy = *strategy
  993. ds.Spec.Template.Spec.NodeSelector = simpleNodeLabel
  994. ds.Spec.Template.Spec.NodeName = "node-0"
  995. manager, podControl, _, err := newTestController(ds)
  996. if err != nil {
  997. t.Fatalf("error creating DaemonSets controller: %v", err)
  998. }
  999. addNodes(manager.nodeStore, 0, 4, nil)
  1000. addNodes(manager.nodeStore, 4, 3, simpleNodeLabel)
  1001. manager.dsStore.Add(ds)
  1002. syncAndValidateDaemonSets(t, manager, ds, podControl, 0, 0, 0)
  1003. }
  1004. }
  1005. // DaemonSet with node selector, matching some nodes, should launch pods on all the nodes.
  1006. func TestSelectorDaemonSetLaunchesPods(t *testing.T) {
  1007. ds := newDaemonSet("foo")
  1008. ds.Spec.Template.Spec.NodeSelector = simpleNodeLabel
  1009. manager, podControl, _, err := newTestController(ds)
  1010. if err != nil {
  1011. t.Fatalf("error creating DaemonSets controller: %v", err)
  1012. }
  1013. addNodes(manager.nodeStore, 0, 4, nil)
  1014. addNodes(manager.nodeStore, 4, 3, simpleNodeLabel)
  1015. manager.dsStore.Add(ds)
  1016. syncAndValidateDaemonSets(t, manager, ds, podControl, 3, 0, 0)
  1017. }
  1018. // Daemon with node affinity should launch pods on nodes matching affinity.
  1019. func TestNodeAffinityDaemonLaunchesPods(t *testing.T) {
  1020. for _, strategy := range updateStrategies() {
  1021. daemon := newDaemonSet("foo")
  1022. daemon.Spec.UpdateStrategy = *strategy
  1023. daemon.Spec.Template.Spec.Affinity = &v1.Affinity{
  1024. NodeAffinity: &v1.NodeAffinity{
  1025. RequiredDuringSchedulingIgnoredDuringExecution: &v1.NodeSelector{
  1026. NodeSelectorTerms: []v1.NodeSelectorTerm{
  1027. {
  1028. MatchExpressions: []v1.NodeSelectorRequirement{
  1029. {
  1030. Key: "color",
  1031. Operator: v1.NodeSelectorOpIn,
  1032. Values: []string{simpleNodeLabel["color"]},
  1033. },
  1034. },
  1035. },
  1036. },
  1037. },
  1038. },
  1039. }
  1040. manager, podControl, _, err := newTestController(daemon)
  1041. if err != nil {
  1042. t.Fatalf("rrror creating DaemonSetsController: %v", err)
  1043. }
  1044. addNodes(manager.nodeStore, 0, 4, nil)
  1045. addNodes(manager.nodeStore, 4, 3, simpleNodeLabel)
  1046. manager.dsStore.Add(daemon)
  1047. syncAndValidateDaemonSets(t, manager, daemon, podControl, 3, 0, 0)
  1048. }
  1049. }
  1050. func TestNumberReadyStatus(t *testing.T) {
  1051. for _, strategy := range updateStrategies() {
  1052. ds := newDaemonSet("foo")
  1053. ds.Spec.UpdateStrategy = *strategy
  1054. manager, podControl, clientset, err := newTestController(ds)
  1055. if err != nil {
  1056. t.Fatalf("error creating DaemonSets controller: %v", err)
  1057. }
  1058. var updated *apps.DaemonSet
  1059. clientset.PrependReactor("update", "daemonsets", func(action core.Action) (handled bool, ret runtime.Object, err error) {
  1060. if action.GetSubresource() != "status" {
  1061. return false, nil, nil
  1062. }
  1063. if u, ok := action.(core.UpdateAction); ok {
  1064. updated = u.GetObject().(*apps.DaemonSet)
  1065. }
  1066. return false, nil, nil
  1067. })
  1068. addNodes(manager.nodeStore, 0, 2, simpleNodeLabel)
  1069. addPods(manager.podStore, "node-0", simpleDaemonSetLabel, ds, 1)
  1070. addPods(manager.podStore, "node-1", simpleDaemonSetLabel, ds, 1)
  1071. manager.dsStore.Add(ds)
  1072. syncAndValidateDaemonSets(t, manager, ds, podControl, 0, 0, 0)
  1073. if updated.Status.NumberReady != 0 {
  1074. t.Errorf("Wrong daemon %s status: %v", updated.Name, updated.Status)
  1075. }
  1076. selector, _ := metav1.LabelSelectorAsSelector(ds.Spec.Selector)
  1077. daemonPods, _ := manager.podLister.Pods(ds.Namespace).List(selector)
  1078. for _, pod := range daemonPods {
  1079. condition := v1.PodCondition{Type: v1.PodReady, Status: v1.ConditionTrue}
  1080. pod.Status.Conditions = append(pod.Status.Conditions, condition)
  1081. }
  1082. syncAndValidateDaemonSets(t, manager, ds, podControl, 0, 0, 0)
  1083. if updated.Status.NumberReady != 2 {
  1084. t.Errorf("Wrong daemon %s status: %v", updated.Name, updated.Status)
  1085. }
  1086. }
  1087. }
  1088. func TestObservedGeneration(t *testing.T) {
  1089. for _, strategy := range updateStrategies() {
  1090. ds := newDaemonSet("foo")
  1091. ds.Spec.UpdateStrategy = *strategy
  1092. ds.Generation = 1
  1093. manager, podControl, clientset, err := newTestController(ds)
  1094. if err != nil {
  1095. t.Fatalf("error creating DaemonSets controller: %v", err)
  1096. }
  1097. var updated *apps.DaemonSet
  1098. clientset.PrependReactor("update", "daemonsets", func(action core.Action) (handled bool, ret runtime.Object, err error) {
  1099. if action.GetSubresource() != "status" {
  1100. return false, nil, nil
  1101. }
  1102. if u, ok := action.(core.UpdateAction); ok {
  1103. updated = u.GetObject().(*apps.DaemonSet)
  1104. }
  1105. return false, nil, nil
  1106. })
  1107. addNodes(manager.nodeStore, 0, 1, simpleNodeLabel)
  1108. addPods(manager.podStore, "node-0", simpleDaemonSetLabel, ds, 1)
  1109. manager.dsStore.Add(ds)
  1110. syncAndValidateDaemonSets(t, manager, ds, podControl, 0, 0, 0)
  1111. if updated.Status.ObservedGeneration != ds.Generation {
  1112. t.Errorf("Wrong ObservedGeneration for daemon %s in status. Expected %d, got %d", updated.Name, ds.Generation, updated.Status.ObservedGeneration)
  1113. }
  1114. }
  1115. }
  1116. // DaemonSet controller should kill all failed pods and create at most 1 pod on every node.
  1117. func TestDaemonKillFailedPods(t *testing.T) {
  1118. tests := []struct {
  1119. numFailedPods, numNormalPods, expectedCreates, expectedDeletes, expectedEvents int
  1120. test string
  1121. }{
  1122. {numFailedPods: 0, numNormalPods: 1, expectedCreates: 0, expectedDeletes: 0, expectedEvents: 0, test: "normal (do nothing)"},
  1123. {numFailedPods: 0, numNormalPods: 0, expectedCreates: 1, expectedDeletes: 0, expectedEvents: 0, test: "no pods (create 1)"},
  1124. {numFailedPods: 1, numNormalPods: 0, expectedCreates: 0, expectedDeletes: 1, expectedEvents: 1, test: "1 failed pod (kill 1), 0 normal pod (create 0; will create in the next sync)"},
  1125. {numFailedPods: 1, numNormalPods: 3, expectedCreates: 0, expectedDeletes: 3, expectedEvents: 1, test: "1 failed pod (kill 1), 3 normal pods (kill 2)"},
  1126. }
  1127. for _, test := range tests {
  1128. t.Run(test.test, func(t *testing.T) {
  1129. for _, strategy := range updateStrategies() {
  1130. ds := newDaemonSet("foo")
  1131. ds.Spec.UpdateStrategy = *strategy
  1132. manager, podControl, _, err := newTestController(ds)
  1133. if err != nil {
  1134. t.Fatalf("error creating DaemonSets controller: %v", err)
  1135. }
  1136. manager.dsStore.Add(ds)
  1137. addNodes(manager.nodeStore, 0, 1, nil)
  1138. addFailedPods(manager.podStore, "node-0", simpleDaemonSetLabel, ds, test.numFailedPods)
  1139. addPods(manager.podStore, "node-0", simpleDaemonSetLabel, ds, test.numNormalPods)
  1140. syncAndValidateDaemonSets(t, manager, ds, podControl, test.expectedCreates, test.expectedDeletes, test.expectedEvents)
  1141. }
  1142. })
  1143. }
  1144. }
  1145. // DaemonSet controller needs to backoff when killing failed pods to avoid hot looping and fighting with kubelet.
  1146. func TestDaemonKillFailedPodsBackoff(t *testing.T) {
  1147. for _, strategy := range updateStrategies() {
  1148. t.Run(string(strategy.Type), func(t *testing.T) {
  1149. ds := newDaemonSet("foo")
  1150. ds.Spec.UpdateStrategy = *strategy
  1151. manager, podControl, _, err := newTestController(ds)
  1152. if err != nil {
  1153. t.Fatalf("error creating DaemonSets controller: %v", err)
  1154. }
  1155. manager.dsStore.Add(ds)
  1156. addNodes(manager.nodeStore, 0, 1, nil)
  1157. nodeName := "node-0"
  1158. pod := newPod(fmt.Sprintf("%s-", nodeName), nodeName, simpleDaemonSetLabel, ds)
  1159. // Add a failed Pod
  1160. pod.Status.Phase = v1.PodFailed
  1161. err = manager.podStore.Add(pod)
  1162. if err != nil {
  1163. t.Fatal(err)
  1164. }
  1165. backoffKey := failedPodsBackoffKey(ds, nodeName)
  1166. // First sync will delete the pod, initializing backoff
  1167. syncAndValidateDaemonSets(t, manager, ds, podControl, 0, 1, 1)
  1168. initialDelay := manager.failedPodsBackoff.Get(backoffKey)
  1169. if initialDelay <= 0 {
  1170. t.Fatal("Initial delay is expected to be set.")
  1171. }
  1172. resetCounters(manager)
  1173. // Immediate (second) sync gets limited by the backoff
  1174. syncAndValidateDaemonSets(t, manager, ds, podControl, 0, 0, 0)
  1175. delay := manager.failedPodsBackoff.Get(backoffKey)
  1176. if delay != initialDelay {
  1177. t.Fatal("Backoff delay shouldn't be raised while waiting.")
  1178. }
  1179. resetCounters(manager)
  1180. // Sleep to wait out backoff
  1181. fakeClock := manager.failedPodsBackoff.Clock
  1182. // Move just before the backoff end time
  1183. fakeClock.Sleep(delay - 1*time.Nanosecond)
  1184. if !manager.failedPodsBackoff.IsInBackOffSinceUpdate(backoffKey, fakeClock.Now()) {
  1185. t.Errorf("Backoff delay didn't last the whole waitout period.")
  1186. }
  1187. // Move to the backoff end time
  1188. fakeClock.Sleep(1 * time.Nanosecond)
  1189. if manager.failedPodsBackoff.IsInBackOffSinceUpdate(backoffKey, fakeClock.Now()) {
  1190. t.Fatal("Backoff delay hasn't been reset after the period has passed.")
  1191. }
  1192. // After backoff time, it will delete the failed pod
  1193. syncAndValidateDaemonSets(t, manager, ds, podControl, 0, 1, 1)
  1194. })
  1195. }
  1196. }
  1197. // Daemonset should not remove a running pod from a node if the pod doesn't
  1198. // tolerate the nodes NoSchedule taint
  1199. func TestNoScheduleTaintedDoesntEvicitRunningIntolerantPod(t *testing.T) {
  1200. for _, strategy := range updateStrategies() {
  1201. ds := newDaemonSet("intolerant")
  1202. ds.Spec.UpdateStrategy = *strategy
  1203. manager, podControl, _, err := newTestController(ds)
  1204. if err != nil {
  1205. t.Fatalf("error creating DaemonSets controller: %v", err)
  1206. }
  1207. node := newNode("tainted", nil)
  1208. manager.nodeStore.Add(node)
  1209. setNodeTaint(node, noScheduleTaints)
  1210. manager.podStore.Add(newPod("keep-running-me", "tainted", simpleDaemonSetLabel, ds))
  1211. manager.dsStore.Add(ds)
  1212. syncAndValidateDaemonSets(t, manager, ds, podControl, 0, 0, 0)
  1213. }
  1214. }
  1215. // Daemonset should remove a running pod from a node if the pod doesn't
  1216. // tolerate the nodes NoExecute taint
  1217. func TestNoExecuteTaintedDoesEvicitRunningIntolerantPod(t *testing.T) {
  1218. for _, strategy := range updateStrategies() {
  1219. ds := newDaemonSet("intolerant")
  1220. ds.Spec.UpdateStrategy = *strategy
  1221. manager, podControl, _, err := newTestController(ds)
  1222. if err != nil {
  1223. t.Fatalf("error creating DaemonSets controller: %v", err)
  1224. }
  1225. node := newNode("tainted", nil)
  1226. manager.nodeStore.Add(node)
  1227. setNodeTaint(node, noExecuteTaints)
  1228. manager.podStore.Add(newPod("stop-running-me", "tainted", simpleDaemonSetLabel, ds))
  1229. manager.dsStore.Add(ds)
  1230. syncAndValidateDaemonSets(t, manager, ds, podControl, 0, 1, 0)
  1231. }
  1232. }
  1233. // DaemonSet should not launch a pod on a tainted node when the pod doesn't tolerate that taint.
  1234. func TestTaintedNodeDaemonDoesNotLaunchIntolerantPod(t *testing.T) {
  1235. for _, strategy := range updateStrategies() {
  1236. ds := newDaemonSet("intolerant")
  1237. ds.Spec.UpdateStrategy = *strategy
  1238. manager, podControl, _, err := newTestController(ds)
  1239. if err != nil {
  1240. t.Fatalf("error creating DaemonSets controller: %v", err)
  1241. }
  1242. node := newNode("tainted", nil)
  1243. setNodeTaint(node, noScheduleTaints)
  1244. manager.nodeStore.Add(node)
  1245. manager.dsStore.Add(ds)
  1246. syncAndValidateDaemonSets(t, manager, ds, podControl, 0, 0, 0)
  1247. }
  1248. }
  1249. // DaemonSet should launch a pod on a tainted node when the pod can tolerate that taint.
  1250. func TestTaintedNodeDaemonLaunchesToleratePod(t *testing.T) {
  1251. for _, strategy := range updateStrategies() {
  1252. ds := newDaemonSet("tolerate")
  1253. ds.Spec.UpdateStrategy = *strategy
  1254. setDaemonSetToleration(ds, noScheduleTolerations)
  1255. manager, podControl, _, err := newTestController(ds)
  1256. if err != nil {
  1257. t.Fatalf("error creating DaemonSets controller: %v", err)
  1258. }
  1259. node := newNode("tainted", nil)
  1260. setNodeTaint(node, noScheduleTaints)
  1261. manager.nodeStore.Add(node)
  1262. manager.dsStore.Add(ds)
  1263. syncAndValidateDaemonSets(t, manager, ds, podControl, 1, 0, 0)
  1264. }
  1265. }
  1266. // DaemonSet should launch a pod on a not ready node with taint notReady:NoExecute.
  1267. func TestNotReadyNodeDaemonLaunchesPod(t *testing.T) {
  1268. for _, strategy := range updateStrategies() {
  1269. ds := newDaemonSet("simple")
  1270. ds.Spec.UpdateStrategy = *strategy
  1271. manager, podControl, _, err := newTestController(ds)
  1272. if err != nil {
  1273. t.Fatalf("error creating DaemonSets controller: %v", err)
  1274. }
  1275. node := newNode("tainted", nil)
  1276. setNodeTaint(node, nodeNotReady)
  1277. node.Status.Conditions = []v1.NodeCondition{
  1278. {Type: v1.NodeReady, Status: v1.ConditionFalse},
  1279. }
  1280. manager.nodeStore.Add(node)
  1281. manager.dsStore.Add(ds)
  1282. syncAndValidateDaemonSets(t, manager, ds, podControl, 1, 0, 0)
  1283. }
  1284. }
  1285. // DaemonSet should launch a pod on an unreachable node with taint unreachable:NoExecute.
  1286. func TestUnreachableNodeDaemonLaunchesPod(t *testing.T) {
  1287. for _, strategy := range updateStrategies() {
  1288. ds := newDaemonSet("simple")
  1289. ds.Spec.UpdateStrategy = *strategy
  1290. manager, podControl, _, err := newTestController(ds)
  1291. if err != nil {
  1292. t.Fatalf("error creating DaemonSets controller: %v", err)
  1293. }
  1294. node := newNode("tainted", nil)
  1295. setNodeTaint(node, nodeUnreachable)
  1296. node.Status.Conditions = []v1.NodeCondition{
  1297. {Type: v1.NodeReady, Status: v1.ConditionUnknown},
  1298. }
  1299. manager.nodeStore.Add(node)
  1300. manager.dsStore.Add(ds)
  1301. syncAndValidateDaemonSets(t, manager, ds, podControl, 1, 0, 0)
  1302. }
  1303. }
  1304. // DaemonSet should launch a pod on an untainted node when the pod has tolerations.
  1305. func TestNodeDaemonLaunchesToleratePod(t *testing.T) {
  1306. for _, strategy := range updateStrategies() {
  1307. ds := newDaemonSet("tolerate")
  1308. ds.Spec.UpdateStrategy = *strategy
  1309. setDaemonSetToleration(ds, noScheduleTolerations)
  1310. manager, podControl, _, err := newTestController(ds)
  1311. if err != nil {
  1312. t.Fatalf("error creating DaemonSets controller: %v", err)
  1313. }
  1314. addNodes(manager.nodeStore, 0, 1, nil)
  1315. manager.dsStore.Add(ds)
  1316. syncAndValidateDaemonSets(t, manager, ds, podControl, 1, 0, 0)
  1317. }
  1318. }
  1319. // DaemonSet should launch a pod on a not ready node with taint notReady:NoExecute.
  1320. func TestDaemonSetRespectsTermination(t *testing.T) {
  1321. for _, strategy := range updateStrategies() {
  1322. ds := newDaemonSet("foo")
  1323. ds.Spec.UpdateStrategy = *strategy
  1324. manager, podControl, _, err := newTestController(ds)
  1325. if err != nil {
  1326. t.Fatalf("error creating DaemonSets controller: %v", err)
  1327. }
  1328. addNodes(manager.nodeStore, 0, 1, simpleNodeLabel)
  1329. pod := newPod(fmt.Sprintf("%s-", "node-0"), "node-0", simpleDaemonSetLabel, ds)
  1330. dt := metav1.Now()
  1331. pod.DeletionTimestamp = &dt
  1332. manager.podStore.Add(pod)
  1333. manager.dsStore.Add(ds)
  1334. syncAndValidateDaemonSets(t, manager, ds, podControl, 0, 0, 0)
  1335. }
  1336. }
  1337. func setNodeTaint(node *v1.Node, taints []v1.Taint) {
  1338. node.Spec.Taints = taints
  1339. }
  1340. func setDaemonSetToleration(ds *apps.DaemonSet, tolerations []v1.Toleration) {
  1341. ds.Spec.Template.Spec.Tolerations = tolerations
  1342. }
  1343. // DaemonSet should launch a pod even when the node with MemoryPressure/DiskPressure/PIDPressure taints.
  1344. func TestTaintPressureNodeDaemonLaunchesPod(t *testing.T) {
  1345. for _, strategy := range updateStrategies() {
  1346. ds := newDaemonSet("critical")
  1347. ds.Spec.UpdateStrategy = *strategy
  1348. setDaemonSetCritical(ds)
  1349. manager, podControl, _, err := newTestController(ds)
  1350. if err != nil {
  1351. t.Fatalf("error creating DaemonSets controller: %v", err)
  1352. }
  1353. node := newNode("resources-pressure", nil)
  1354. node.Status.Conditions = []v1.NodeCondition{
  1355. {Type: v1.NodeDiskPressure, Status: v1.ConditionTrue},
  1356. {Type: v1.NodeMemoryPressure, Status: v1.ConditionTrue},
  1357. {Type: v1.NodePIDPressure, Status: v1.ConditionTrue},
  1358. }
  1359. node.Spec.Taints = []v1.Taint{
  1360. {Key: v1.TaintNodeDiskPressure, Effect: v1.TaintEffectNoSchedule},
  1361. {Key: v1.TaintNodeMemoryPressure, Effect: v1.TaintEffectNoSchedule},
  1362. {Key: v1.TaintNodePIDPressure, Effect: v1.TaintEffectNoSchedule},
  1363. }
  1364. manager.nodeStore.Add(node)
  1365. manager.dsStore.Add(ds)
  1366. syncAndValidateDaemonSets(t, manager, ds, podControl, 1, 0, 0)
  1367. }
  1368. }
  1369. func setDaemonSetCritical(ds *apps.DaemonSet) {
  1370. ds.Namespace = api.NamespaceSystem
  1371. if ds.Spec.Template.ObjectMeta.Annotations == nil {
  1372. ds.Spec.Template.ObjectMeta.Annotations = make(map[string]string)
  1373. }
  1374. podPriority := scheduling.SystemCriticalPriority
  1375. ds.Spec.Template.Spec.Priority = &podPriority
  1376. }
  1377. func TestNodeShouldRunDaemonPod(t *testing.T) {
  1378. shouldRun := true
  1379. shouldContinueRunning := true
  1380. cases := []struct {
  1381. predicateName string
  1382. podsOnNode []*v1.Pod
  1383. nodeCondition []v1.NodeCondition
  1384. nodeUnschedulable bool
  1385. ds *apps.DaemonSet
  1386. shouldRun, shouldContinueRunning bool
  1387. err error
  1388. }{
  1389. {
  1390. predicateName: "ShouldRunDaemonPod",
  1391. ds: &apps.DaemonSet{
  1392. Spec: apps.DaemonSetSpec{
  1393. Selector: &metav1.LabelSelector{MatchLabels: simpleDaemonSetLabel},
  1394. Template: v1.PodTemplateSpec{
  1395. ObjectMeta: metav1.ObjectMeta{
  1396. Labels: simpleDaemonSetLabel,
  1397. },
  1398. Spec: resourcePodSpec("", "50M", "0.5"),
  1399. },
  1400. },
  1401. },
  1402. shouldRun: true,
  1403. shouldContinueRunning: true,
  1404. },
  1405. {
  1406. predicateName: "InsufficientResourceError",
  1407. ds: &apps.DaemonSet{
  1408. Spec: apps.DaemonSetSpec{
  1409. Selector: &metav1.LabelSelector{MatchLabels: simpleDaemonSetLabel},
  1410. Template: v1.PodTemplateSpec{
  1411. ObjectMeta: metav1.ObjectMeta{
  1412. Labels: simpleDaemonSetLabel,
  1413. },
  1414. Spec: resourcePodSpec("", "200M", "0.5"),
  1415. },
  1416. },
  1417. },
  1418. shouldRun: shouldRun,
  1419. shouldContinueRunning: true,
  1420. },
  1421. {
  1422. predicateName: "ErrPodNotMatchHostName",
  1423. ds: &apps.DaemonSet{
  1424. Spec: apps.DaemonSetSpec{
  1425. Selector: &metav1.LabelSelector{MatchLabels: simpleDaemonSetLabel},
  1426. Template: v1.PodTemplateSpec{
  1427. ObjectMeta: metav1.ObjectMeta{
  1428. Labels: simpleDaemonSetLabel,
  1429. },
  1430. Spec: resourcePodSpec("other-node", "50M", "0.5"),
  1431. },
  1432. },
  1433. },
  1434. shouldRun: false,
  1435. shouldContinueRunning: false,
  1436. },
  1437. {
  1438. predicateName: "ErrPodNotFitsHostPorts",
  1439. podsOnNode: []*v1.Pod{
  1440. {
  1441. Spec: v1.PodSpec{
  1442. Containers: []v1.Container{{
  1443. Ports: []v1.ContainerPort{{
  1444. HostPort: 666,
  1445. }},
  1446. }},
  1447. },
  1448. },
  1449. },
  1450. ds: &apps.DaemonSet{
  1451. Spec: apps.DaemonSetSpec{
  1452. Selector: &metav1.LabelSelector{MatchLabels: simpleDaemonSetLabel},
  1453. Template: v1.PodTemplateSpec{
  1454. ObjectMeta: metav1.ObjectMeta{
  1455. Labels: simpleDaemonSetLabel,
  1456. },
  1457. Spec: v1.PodSpec{
  1458. Containers: []v1.Container{{
  1459. Ports: []v1.ContainerPort{{
  1460. HostPort: 666,
  1461. }},
  1462. }},
  1463. },
  1464. },
  1465. },
  1466. },
  1467. shouldRun: shouldRun,
  1468. shouldContinueRunning: shouldContinueRunning,
  1469. },
  1470. {
  1471. predicateName: "InsufficientResourceError",
  1472. podsOnNode: []*v1.Pod{
  1473. {
  1474. Spec: v1.PodSpec{
  1475. Containers: []v1.Container{{
  1476. Ports: []v1.ContainerPort{{
  1477. HostPort: 666,
  1478. }},
  1479. Resources: resourceContainerSpec("50M", "0.5"),
  1480. }},
  1481. },
  1482. },
  1483. },
  1484. ds: &apps.DaemonSet{
  1485. Spec: apps.DaemonSetSpec{
  1486. Selector: &metav1.LabelSelector{MatchLabels: simpleDaemonSetLabel},
  1487. Template: v1.PodTemplateSpec{
  1488. ObjectMeta: metav1.ObjectMeta{
  1489. Labels: simpleDaemonSetLabel,
  1490. },
  1491. Spec: resourcePodSpec("", "100M", "0.5"),
  1492. },
  1493. },
  1494. },
  1495. shouldRun: shouldRun, // This is because we don't care about the resource constraints any more and let default scheduler handle it.
  1496. shouldContinueRunning: true,
  1497. },
  1498. {
  1499. predicateName: "ShouldRunDaemonPod",
  1500. podsOnNode: []*v1.Pod{
  1501. {
  1502. Spec: v1.PodSpec{
  1503. Containers: []v1.Container{{
  1504. Ports: []v1.ContainerPort{{
  1505. HostPort: 666,
  1506. }},
  1507. Resources: resourceContainerSpec("50M", "0.5"),
  1508. }},
  1509. },
  1510. },
  1511. },
  1512. ds: &apps.DaemonSet{
  1513. Spec: apps.DaemonSetSpec{
  1514. Selector: &metav1.LabelSelector{MatchLabels: simpleDaemonSetLabel},
  1515. Template: v1.PodTemplateSpec{
  1516. ObjectMeta: metav1.ObjectMeta{
  1517. Labels: simpleDaemonSetLabel,
  1518. },
  1519. Spec: resourcePodSpec("", "50M", "0.5"),
  1520. },
  1521. },
  1522. },
  1523. shouldRun: true,
  1524. shouldContinueRunning: true,
  1525. },
  1526. {
  1527. predicateName: "ErrNodeSelectorNotMatch",
  1528. ds: &apps.DaemonSet{
  1529. Spec: apps.DaemonSetSpec{
  1530. Selector: &metav1.LabelSelector{MatchLabels: simpleDaemonSetLabel},
  1531. Template: v1.PodTemplateSpec{
  1532. ObjectMeta: metav1.ObjectMeta{
  1533. Labels: simpleDaemonSetLabel,
  1534. },
  1535. Spec: v1.PodSpec{
  1536. NodeSelector: simpleDaemonSetLabel2,
  1537. },
  1538. },
  1539. },
  1540. },
  1541. shouldRun: false,
  1542. shouldContinueRunning: false,
  1543. },
  1544. {
  1545. predicateName: "ShouldRunDaemonPod",
  1546. ds: &apps.DaemonSet{
  1547. Spec: apps.DaemonSetSpec{
  1548. Selector: &metav1.LabelSelector{MatchLabels: simpleDaemonSetLabel},
  1549. Template: v1.PodTemplateSpec{
  1550. ObjectMeta: metav1.ObjectMeta{
  1551. Labels: simpleDaemonSetLabel,
  1552. },
  1553. Spec: v1.PodSpec{
  1554. NodeSelector: simpleDaemonSetLabel,
  1555. },
  1556. },
  1557. },
  1558. },
  1559. shouldRun: true,
  1560. shouldContinueRunning: true,
  1561. },
  1562. {
  1563. predicateName: "ErrPodAffinityNotMatch",
  1564. ds: &apps.DaemonSet{
  1565. Spec: apps.DaemonSetSpec{
  1566. Selector: &metav1.LabelSelector{MatchLabels: simpleDaemonSetLabel},
  1567. Template: v1.PodTemplateSpec{
  1568. ObjectMeta: metav1.ObjectMeta{
  1569. Labels: simpleDaemonSetLabel,
  1570. },
  1571. Spec: v1.PodSpec{
  1572. Affinity: &v1.Affinity{
  1573. NodeAffinity: &v1.NodeAffinity{
  1574. RequiredDuringSchedulingIgnoredDuringExecution: &v1.NodeSelector{
  1575. NodeSelectorTerms: []v1.NodeSelectorTerm{
  1576. {
  1577. MatchExpressions: []v1.NodeSelectorRequirement{
  1578. {
  1579. Key: "type",
  1580. Operator: v1.NodeSelectorOpIn,
  1581. Values: []string{"test"},
  1582. },
  1583. },
  1584. },
  1585. },
  1586. },
  1587. },
  1588. },
  1589. },
  1590. },
  1591. },
  1592. },
  1593. shouldRun: false,
  1594. shouldContinueRunning: false,
  1595. },
  1596. {
  1597. predicateName: "ShouldRunDaemonPod",
  1598. ds: &apps.DaemonSet{
  1599. Spec: apps.DaemonSetSpec{
  1600. Selector: &metav1.LabelSelector{MatchLabels: simpleDaemonSetLabel},
  1601. Template: v1.PodTemplateSpec{
  1602. ObjectMeta: metav1.ObjectMeta{
  1603. Labels: simpleDaemonSetLabel,
  1604. },
  1605. Spec: v1.PodSpec{
  1606. Affinity: &v1.Affinity{
  1607. NodeAffinity: &v1.NodeAffinity{
  1608. RequiredDuringSchedulingIgnoredDuringExecution: &v1.NodeSelector{
  1609. NodeSelectorTerms: []v1.NodeSelectorTerm{
  1610. {
  1611. MatchExpressions: []v1.NodeSelectorRequirement{
  1612. {
  1613. Key: "type",
  1614. Operator: v1.NodeSelectorOpIn,
  1615. Values: []string{"production"},
  1616. },
  1617. },
  1618. },
  1619. },
  1620. },
  1621. },
  1622. },
  1623. },
  1624. },
  1625. },
  1626. },
  1627. shouldRun: true,
  1628. shouldContinueRunning: true,
  1629. },
  1630. {
  1631. predicateName: "ShouldRunDaemonPodOnUnscheduableNode",
  1632. ds: &apps.DaemonSet{
  1633. Spec: apps.DaemonSetSpec{
  1634. Selector: &metav1.LabelSelector{MatchLabels: simpleDaemonSetLabel},
  1635. Template: v1.PodTemplateSpec{
  1636. ObjectMeta: metav1.ObjectMeta{
  1637. Labels: simpleDaemonSetLabel,
  1638. },
  1639. Spec: resourcePodSpec("", "50M", "0.5"),
  1640. },
  1641. },
  1642. },
  1643. nodeUnschedulable: true,
  1644. shouldRun: true,
  1645. shouldContinueRunning: true,
  1646. },
  1647. }
  1648. for i, c := range cases {
  1649. for _, strategy := range updateStrategies() {
  1650. node := newNode("test-node", simpleDaemonSetLabel)
  1651. node.Status.Conditions = append(node.Status.Conditions, c.nodeCondition...)
  1652. node.Status.Allocatable = allocatableResources("100M", "1")
  1653. node.Spec.Unschedulable = c.nodeUnschedulable
  1654. manager, _, _, err := newTestController()
  1655. if err != nil {
  1656. t.Fatalf("error creating DaemonSets controller: %v", err)
  1657. }
  1658. manager.nodeStore.Add(node)
  1659. for _, p := range c.podsOnNode {
  1660. manager.podStore.Add(p)
  1661. p.Spec.NodeName = "test-node"
  1662. manager.podNodeIndex.Add(p)
  1663. }
  1664. c.ds.Spec.UpdateStrategy = *strategy
  1665. shouldRun, shouldContinueRunning, err := manager.nodeShouldRunDaemonPod(node, c.ds)
  1666. if shouldRun != c.shouldRun {
  1667. t.Errorf("[%v] strategy: %v, predicateName: %v expected shouldRun: %v, got: %v", i, c.ds.Spec.UpdateStrategy.Type, c.predicateName, c.shouldRun, shouldRun)
  1668. }
  1669. if shouldContinueRunning != c.shouldContinueRunning {
  1670. t.Errorf("[%v] strategy: %v, predicateName: %v expected shouldContinueRunning: %v, got: %v", i, c.ds.Spec.UpdateStrategy.Type, c.predicateName, c.shouldContinueRunning, shouldContinueRunning)
  1671. }
  1672. if err != c.err {
  1673. t.Errorf("[%v] strategy: %v, predicateName: %v expected err: %v, got: %v", i, c.predicateName, c.ds.Spec.UpdateStrategy.Type, c.err, err)
  1674. }
  1675. }
  1676. }
  1677. }
  1678. // DaemonSets should be resynced when node labels or taints changed
  1679. func TestUpdateNode(t *testing.T) {
  1680. var enqueued bool
  1681. cases := []struct {
  1682. test string
  1683. newNode *v1.Node
  1684. oldNode *v1.Node
  1685. ds *apps.DaemonSet
  1686. expectedEventsFunc func(strategyType apps.DaemonSetUpdateStrategyType) int
  1687. shouldEnqueue bool
  1688. expectedCreates func() int
  1689. }{
  1690. {
  1691. test: "Nothing changed, should not enqueue",
  1692. oldNode: newNode("node1", nil),
  1693. newNode: newNode("node1", nil),
  1694. ds: func() *apps.DaemonSet {
  1695. ds := newDaemonSet("ds")
  1696. ds.Spec.Template.Spec.NodeSelector = simpleNodeLabel
  1697. return ds
  1698. }(),
  1699. shouldEnqueue: false,
  1700. expectedCreates: func() int { return 0 },
  1701. },
  1702. {
  1703. test: "Node labels changed",
  1704. oldNode: newNode("node1", nil),
  1705. newNode: newNode("node1", simpleNodeLabel),
  1706. ds: func() *apps.DaemonSet {
  1707. ds := newDaemonSet("ds")
  1708. ds.Spec.Template.Spec.NodeSelector = simpleNodeLabel
  1709. return ds
  1710. }(),
  1711. shouldEnqueue: true,
  1712. expectedCreates: func() int { return 0 },
  1713. },
  1714. {
  1715. test: "Node taints changed",
  1716. oldNode: func() *v1.Node {
  1717. node := newNode("node1", nil)
  1718. setNodeTaint(node, noScheduleTaints)
  1719. return node
  1720. }(),
  1721. newNode: newNode("node1", nil),
  1722. ds: newDaemonSet("ds"),
  1723. shouldEnqueue: true,
  1724. expectedCreates: func() int { return 0 },
  1725. },
  1726. {
  1727. test: "Node Allocatable changed",
  1728. oldNode: newNode("node1", nil),
  1729. newNode: func() *v1.Node {
  1730. node := newNode("node1", nil)
  1731. node.Status.Allocatable = allocatableResources("200M", "200m")
  1732. return node
  1733. }(),
  1734. ds: func() *apps.DaemonSet {
  1735. ds := newDaemonSet("ds")
  1736. ds.Spec.Template.Spec = resourcePodSpecWithoutNodeName("200M", "200m")
  1737. return ds
  1738. }(),
  1739. expectedEventsFunc: func(strategyType apps.DaemonSetUpdateStrategyType) int {
  1740. switch strategyType {
  1741. case apps.OnDeleteDaemonSetStrategyType:
  1742. return 0
  1743. case apps.RollingUpdateDaemonSetStrategyType:
  1744. return 0
  1745. default:
  1746. t.Fatalf("unexpected UpdateStrategy %+v", strategyType)
  1747. }
  1748. return 0
  1749. },
  1750. shouldEnqueue: false,
  1751. expectedCreates: func() int {
  1752. return 1
  1753. },
  1754. },
  1755. }
  1756. for _, c := range cases {
  1757. for _, strategy := range updateStrategies() {
  1758. manager, podControl, _, err := newTestController()
  1759. if err != nil {
  1760. t.Fatalf("error creating DaemonSets controller: %v", err)
  1761. }
  1762. manager.nodeStore.Add(c.oldNode)
  1763. c.ds.Spec.UpdateStrategy = *strategy
  1764. manager.dsStore.Add(c.ds)
  1765. expectedEvents := 0
  1766. if c.expectedEventsFunc != nil {
  1767. expectedEvents = c.expectedEventsFunc(strategy.Type)
  1768. }
  1769. expectedCreates := 0
  1770. if c.expectedCreates != nil {
  1771. expectedCreates = c.expectedCreates()
  1772. }
  1773. syncAndValidateDaemonSets(t, manager, c.ds, podControl, expectedCreates, 0, expectedEvents)
  1774. manager.enqueueDaemonSet = func(ds *apps.DaemonSet) {
  1775. if ds.Name == "ds" {
  1776. enqueued = true
  1777. }
  1778. }
  1779. enqueued = false
  1780. manager.updateNode(c.oldNode, c.newNode)
  1781. if enqueued != c.shouldEnqueue {
  1782. t.Errorf("Test case: '%s', expected: %t, got: %t", c.test, c.shouldEnqueue, enqueued)
  1783. }
  1784. }
  1785. }
  1786. }
  1787. // DaemonSets should be resynced when non-daemon pods was deleted.
  1788. func TestDeleteNoDaemonPod(t *testing.T) {
  1789. var enqueued bool
  1790. cases := []struct {
  1791. test string
  1792. node *v1.Node
  1793. existPods []*v1.Pod
  1794. deletedPod *v1.Pod
  1795. ds *apps.DaemonSet
  1796. shouldEnqueue bool
  1797. }{
  1798. {
  1799. test: "Deleted non-daemon pods to release resources",
  1800. node: func() *v1.Node {
  1801. node := newNode("node1", nil)
  1802. node.Status.Conditions = []v1.NodeCondition{
  1803. {Type: v1.NodeReady, Status: v1.ConditionTrue},
  1804. }
  1805. node.Status.Allocatable = allocatableResources("200M", "200m")
  1806. return node
  1807. }(),
  1808. existPods: func() []*v1.Pod {
  1809. pods := []*v1.Pod{}
  1810. for i := 0; i < 4; i++ {
  1811. podSpec := resourcePodSpec("node1", "50M", "50m")
  1812. pods = append(pods, &v1.Pod{
  1813. ObjectMeta: metav1.ObjectMeta{
  1814. Name: fmt.Sprintf("pod_%d", i),
  1815. },
  1816. Spec: podSpec,
  1817. })
  1818. }
  1819. return pods
  1820. }(),
  1821. deletedPod: func() *v1.Pod {
  1822. podSpec := resourcePodSpec("node1", "50M", "50m")
  1823. return &v1.Pod{
  1824. ObjectMeta: metav1.ObjectMeta{
  1825. Name: "pod_0",
  1826. },
  1827. Spec: podSpec,
  1828. }
  1829. }(),
  1830. ds: func() *apps.DaemonSet {
  1831. ds := newDaemonSet("ds")
  1832. ds.Spec.Template.Spec = resourcePodSpec("", "50M", "50m")
  1833. return ds
  1834. }(),
  1835. shouldEnqueue: false,
  1836. },
  1837. {
  1838. test: "Deleted non-daemon pods (with controller) to release resources",
  1839. node: func() *v1.Node {
  1840. node := newNode("node1", nil)
  1841. node.Status.Conditions = []v1.NodeCondition{
  1842. {Type: v1.NodeReady, Status: v1.ConditionTrue},
  1843. }
  1844. node.Status.Allocatable = allocatableResources("200M", "200m")
  1845. return node
  1846. }(),
  1847. existPods: func() []*v1.Pod {
  1848. pods := []*v1.Pod{}
  1849. for i := 0; i < 4; i++ {
  1850. podSpec := resourcePodSpec("node1", "50M", "50m")
  1851. pods = append(pods, &v1.Pod{
  1852. ObjectMeta: metav1.ObjectMeta{
  1853. Name: fmt.Sprintf("pod_%d", i),
  1854. OwnerReferences: []metav1.OwnerReference{
  1855. {Controller: func() *bool { res := true; return &res }()},
  1856. },
  1857. },
  1858. Spec: podSpec,
  1859. })
  1860. }
  1861. return pods
  1862. }(),
  1863. deletedPod: func() *v1.Pod {
  1864. podSpec := resourcePodSpec("node1", "50M", "50m")
  1865. return &v1.Pod{
  1866. ObjectMeta: metav1.ObjectMeta{
  1867. Name: "pod_0",
  1868. OwnerReferences: []metav1.OwnerReference{
  1869. {Controller: func() *bool { res := true; return &res }()},
  1870. },
  1871. },
  1872. Spec: podSpec,
  1873. }
  1874. }(),
  1875. ds: func() *apps.DaemonSet {
  1876. ds := newDaemonSet("ds")
  1877. ds.Spec.Template.Spec = resourcePodSpec("", "50M", "50m")
  1878. return ds
  1879. }(),
  1880. shouldEnqueue: false,
  1881. },
  1882. {
  1883. test: "Deleted no scheduled pods",
  1884. node: func() *v1.Node {
  1885. node := newNode("node1", nil)
  1886. node.Status.Conditions = []v1.NodeCondition{
  1887. {Type: v1.NodeReady, Status: v1.ConditionTrue},
  1888. }
  1889. node.Status.Allocatable = allocatableResources("200M", "200m")
  1890. return node
  1891. }(),
  1892. existPods: func() []*v1.Pod {
  1893. pods := []*v1.Pod{}
  1894. for i := 0; i < 4; i++ {
  1895. podSpec := resourcePodSpec("node1", "50M", "50m")
  1896. pods = append(pods, &v1.Pod{
  1897. ObjectMeta: metav1.ObjectMeta{
  1898. Name: fmt.Sprintf("pod_%d", i),
  1899. OwnerReferences: []metav1.OwnerReference{
  1900. {Controller: func() *bool { res := true; return &res }()},
  1901. },
  1902. },
  1903. Spec: podSpec,
  1904. })
  1905. }
  1906. return pods
  1907. }(),
  1908. deletedPod: func() *v1.Pod {
  1909. podSpec := resourcePodSpec("", "50M", "50m")
  1910. return &v1.Pod{
  1911. ObjectMeta: metav1.ObjectMeta{
  1912. Name: "pod_5",
  1913. },
  1914. Spec: podSpec,
  1915. }
  1916. }(),
  1917. ds: func() *apps.DaemonSet {
  1918. ds := newDaemonSet("ds")
  1919. ds.Spec.Template.Spec = resourcePodSpec("", "50M", "50m")
  1920. return ds
  1921. }(),
  1922. shouldEnqueue: false,
  1923. },
  1924. }
  1925. for _, c := range cases {
  1926. for _, strategy := range updateStrategies() {
  1927. manager, podControl, _, err := newTestController()
  1928. if err != nil {
  1929. t.Fatalf("error creating DaemonSets controller: %v", err)
  1930. }
  1931. manager.nodeStore.Add(c.node)
  1932. c.ds.Spec.UpdateStrategy = *strategy
  1933. manager.dsStore.Add(c.ds)
  1934. for _, pod := range c.existPods {
  1935. manager.podStore.Add(pod)
  1936. }
  1937. switch strategy.Type {
  1938. case apps.OnDeleteDaemonSetStrategyType, apps.RollingUpdateDaemonSetStrategyType:
  1939. syncAndValidateDaemonSets(t, manager, c.ds, podControl, 1, 0, 0)
  1940. default:
  1941. t.Fatalf("unexpected UpdateStrategy %+v", strategy)
  1942. }
  1943. enqueued = false
  1944. manager.deletePod(c.deletedPod)
  1945. if enqueued != c.shouldEnqueue {
  1946. t.Errorf("Test case: '%s', expected: %t, got: %t", c.test, c.shouldEnqueue, enqueued)
  1947. }
  1948. }
  1949. }
  1950. }
  1951. func TestDeleteUnscheduledPodForNotExistingNode(t *testing.T) {
  1952. for _, strategy := range updateStrategies() {
  1953. ds := newDaemonSet("foo")
  1954. ds.Spec.UpdateStrategy = *strategy
  1955. manager, podControl, _, err := newTestController(ds)
  1956. if err != nil {
  1957. t.Fatalf("error creating DaemonSets controller: %v", err)
  1958. }
  1959. manager.dsStore.Add(ds)
  1960. addNodes(manager.nodeStore, 0, 1, nil)
  1961. addPods(manager.podStore, "node-0", simpleDaemonSetLabel, ds, 1)
  1962. addPods(manager.podStore, "node-1", simpleDaemonSetLabel, ds, 1)
  1963. podScheduledUsingAffinity := newPod("pod1-node-3", "", simpleDaemonSetLabel, ds)
  1964. podScheduledUsingAffinity.Spec.Affinity = &v1.Affinity{
  1965. NodeAffinity: &v1.NodeAffinity{
  1966. RequiredDuringSchedulingIgnoredDuringExecution: &v1.NodeSelector{
  1967. NodeSelectorTerms: []v1.NodeSelectorTerm{
  1968. {
  1969. MatchFields: []v1.NodeSelectorRequirement{
  1970. {
  1971. Key: api.ObjectNameField,
  1972. Operator: v1.NodeSelectorOpIn,
  1973. Values: []string{"node-2"},
  1974. },
  1975. },
  1976. },
  1977. },
  1978. },
  1979. },
  1980. }
  1981. manager.podStore.Add(podScheduledUsingAffinity)
  1982. syncAndValidateDaemonSets(t, manager, ds, podControl, 0, 1, 0)
  1983. }
  1984. }
  1985. func TestGetNodesToDaemonPods(t *testing.T) {
  1986. for _, strategy := range updateStrategies() {
  1987. ds := newDaemonSet("foo")
  1988. ds.Spec.UpdateStrategy = *strategy
  1989. ds2 := newDaemonSet("foo2")
  1990. ds2.Spec.UpdateStrategy = *strategy
  1991. manager, _, _, err := newTestController(ds, ds2)
  1992. if err != nil {
  1993. t.Fatalf("error creating DaemonSets controller: %v", err)
  1994. }
  1995. manager.dsStore.Add(ds)
  1996. manager.dsStore.Add(ds2)
  1997. addNodes(manager.nodeStore, 0, 2, nil)
  1998. // These pods should be returned.
  1999. wantedPods := []*v1.Pod{
  2000. newPod("matching-owned-0-", "node-0", simpleDaemonSetLabel, ds),
  2001. newPod("matching-orphan-0-", "node-0", simpleDaemonSetLabel, nil),
  2002. newPod("matching-owned-1-", "node-1", simpleDaemonSetLabel, ds),
  2003. newPod("matching-orphan-1-", "node-1", simpleDaemonSetLabel, nil),
  2004. }
  2005. failedPod := newPod("matching-owned-failed-pod-1-", "node-1", simpleDaemonSetLabel, ds)
  2006. failedPod.Status = v1.PodStatus{Phase: v1.PodFailed}
  2007. wantedPods = append(wantedPods, failedPod)
  2008. for _, pod := range wantedPods {
  2009. manager.podStore.Add(pod)
  2010. }
  2011. // These pods should be ignored.
  2012. ignoredPods := []*v1.Pod{
  2013. newPod("non-matching-owned-0-", "node-0", simpleDaemonSetLabel2, ds),
  2014. newPod("non-matching-orphan-1-", "node-1", simpleDaemonSetLabel2, nil),
  2015. newPod("matching-owned-by-other-0-", "node-0", simpleDaemonSetLabel, ds2),
  2016. }
  2017. for _, pod := range ignoredPods {
  2018. manager.podStore.Add(pod)
  2019. }
  2020. nodesToDaemonPods, err := manager.getNodesToDaemonPods(ds)
  2021. if err != nil {
  2022. t.Fatalf("getNodesToDaemonPods() error: %v", err)
  2023. }
  2024. gotPods := map[string]bool{}
  2025. for node, pods := range nodesToDaemonPods {
  2026. for _, pod := range pods {
  2027. if pod.Spec.NodeName != node {
  2028. t.Errorf("pod %v grouped into %v but belongs in %v", pod.Name, node, pod.Spec.NodeName)
  2029. }
  2030. gotPods[pod.Name] = true
  2031. }
  2032. }
  2033. for _, pod := range wantedPods {
  2034. if !gotPods[pod.Name] {
  2035. t.Errorf("expected pod %v but didn't get it", pod.Name)
  2036. }
  2037. delete(gotPods, pod.Name)
  2038. }
  2039. for podName := range gotPods {
  2040. t.Errorf("unexpected pod %v was returned", podName)
  2041. }
  2042. }
  2043. }
  2044. func TestAddNode(t *testing.T) {
  2045. manager, _, _, err := newTestController()
  2046. if err != nil {
  2047. t.Fatalf("error creating DaemonSets controller: %v", err)
  2048. }
  2049. node1 := newNode("node1", nil)
  2050. ds := newDaemonSet("ds")
  2051. ds.Spec.Template.Spec.NodeSelector = simpleNodeLabel
  2052. manager.dsStore.Add(ds)
  2053. manager.addNode(node1)
  2054. if got, want := manager.queue.Len(), 0; got != want {
  2055. t.Fatalf("queue.Len() = %v, want %v", got, want)
  2056. }
  2057. node2 := newNode("node2", simpleNodeLabel)
  2058. manager.addNode(node2)
  2059. if got, want := manager.queue.Len(), 1; got != want {
  2060. t.Fatalf("queue.Len() = %v, want %v", got, want)
  2061. }
  2062. key, done := manager.queue.Get()
  2063. if key == nil || done {
  2064. t.Fatalf("failed to enqueue controller for node %v", node2.Name)
  2065. }
  2066. }
  2067. func TestAddPod(t *testing.T) {
  2068. for _, strategy := range updateStrategies() {
  2069. manager, _, _, err := newTestController()
  2070. if err != nil {
  2071. t.Fatalf("error creating DaemonSets controller: %v", err)
  2072. }
  2073. ds1 := newDaemonSet("foo1")
  2074. ds1.Spec.UpdateStrategy = *strategy
  2075. ds2 := newDaemonSet("foo2")
  2076. ds2.Spec.UpdateStrategy = *strategy
  2077. manager.dsStore.Add(ds1)
  2078. manager.dsStore.Add(ds2)
  2079. pod1 := newPod("pod1-", "node-0", simpleDaemonSetLabel, ds1)
  2080. manager.addPod(pod1)
  2081. if got, want := manager.queue.Len(), 1; got != want {
  2082. t.Fatalf("queue.Len() = %v, want %v", got, want)
  2083. }
  2084. key, done := manager.queue.Get()
  2085. if key == nil || done {
  2086. t.Fatalf("failed to enqueue controller for pod %v", pod1.Name)
  2087. }
  2088. expectedKey, _ := controller.KeyFunc(ds1)
  2089. if got, want := key.(string), expectedKey; got != want {
  2090. t.Errorf("queue.Get() = %v, want %v", got, want)
  2091. }
  2092. pod2 := newPod("pod2-", "node-0", simpleDaemonSetLabel, ds2)
  2093. manager.addPod(pod2)
  2094. if got, want := manager.queue.Len(), 1; got != want {
  2095. t.Fatalf("queue.Len() = %v, want %v", got, want)
  2096. }
  2097. key, done = manager.queue.Get()
  2098. if key == nil || done {
  2099. t.Fatalf("failed to enqueue controller for pod %v", pod2.Name)
  2100. }
  2101. expectedKey, _ = controller.KeyFunc(ds2)
  2102. if got, want := key.(string), expectedKey; got != want {
  2103. t.Errorf("queue.Get() = %v, want %v", got, want)
  2104. }
  2105. }
  2106. }
  2107. func TestAddPodOrphan(t *testing.T) {
  2108. for _, strategy := range updateStrategies() {
  2109. manager, _, _, err := newTestController()
  2110. if err != nil {
  2111. t.Fatalf("error creating DaemonSets controller: %v", err)
  2112. }
  2113. ds1 := newDaemonSet("foo1")
  2114. ds1.Spec.UpdateStrategy = *strategy
  2115. ds2 := newDaemonSet("foo2")
  2116. ds2.Spec.UpdateStrategy = *strategy
  2117. ds3 := newDaemonSet("foo3")
  2118. ds3.Spec.UpdateStrategy = *strategy
  2119. ds3.Spec.Selector.MatchLabels = simpleDaemonSetLabel2
  2120. manager.dsStore.Add(ds1)
  2121. manager.dsStore.Add(ds2)
  2122. manager.dsStore.Add(ds3)
  2123. // Make pod an orphan. Expect matching sets to be queued.
  2124. pod := newPod("pod1-", "node-0", simpleDaemonSetLabel, nil)
  2125. manager.addPod(pod)
  2126. if got, want := manager.queue.Len(), 2; got != want {
  2127. t.Fatalf("queue.Len() = %v, want %v", got, want)
  2128. }
  2129. if got, want := getQueuedKeys(manager.queue), []string{"default/foo1", "default/foo2"}; !reflect.DeepEqual(got, want) {
  2130. t.Errorf("getQueuedKeys() = %v, want %v", got, want)
  2131. }
  2132. }
  2133. }
  2134. func TestUpdatePod(t *testing.T) {
  2135. for _, strategy := range updateStrategies() {
  2136. manager, _, _, err := newTestController()
  2137. if err != nil {
  2138. t.Fatalf("error creating DaemonSets controller: %v", err)
  2139. }
  2140. ds1 := newDaemonSet("foo1")
  2141. ds1.Spec.UpdateStrategy = *strategy
  2142. ds2 := newDaemonSet("foo2")
  2143. ds2.Spec.UpdateStrategy = *strategy
  2144. manager.dsStore.Add(ds1)
  2145. manager.dsStore.Add(ds2)
  2146. pod1 := newPod("pod1-", "node-0", simpleDaemonSetLabel, ds1)
  2147. prev := *pod1
  2148. bumpResourceVersion(pod1)
  2149. manager.updatePod(&prev, pod1)
  2150. if got, want := manager.queue.Len(), 1; got != want {
  2151. t.Fatalf("queue.Len() = %v, want %v", got, want)
  2152. }
  2153. key, done := manager.queue.Get()
  2154. if key == nil || done {
  2155. t.Fatalf("failed to enqueue controller for pod %v", pod1.Name)
  2156. }
  2157. expectedKey, _ := controller.KeyFunc(ds1)
  2158. if got, want := key.(string), expectedKey; got != want {
  2159. t.Errorf("queue.Get() = %v, want %v", got, want)
  2160. }
  2161. pod2 := newPod("pod2-", "node-0", simpleDaemonSetLabel, ds2)
  2162. prev = *pod2
  2163. bumpResourceVersion(pod2)
  2164. manager.updatePod(&prev, pod2)
  2165. if got, want := manager.queue.Len(), 1; got != want {
  2166. t.Fatalf("queue.Len() = %v, want %v", got, want)
  2167. }
  2168. key, done = manager.queue.Get()
  2169. if key == nil || done {
  2170. t.Fatalf("failed to enqueue controller for pod %v", pod2.Name)
  2171. }
  2172. expectedKey, _ = controller.KeyFunc(ds2)
  2173. if got, want := key.(string), expectedKey; got != want {
  2174. t.Errorf("queue.Get() = %v, want %v", got, want)
  2175. }
  2176. }
  2177. }
  2178. func TestUpdatePodOrphanSameLabels(t *testing.T) {
  2179. for _, strategy := range updateStrategies() {
  2180. manager, _, _, err := newTestController()
  2181. if err != nil {
  2182. t.Fatalf("error creating DaemonSets controller: %v", err)
  2183. }
  2184. ds1 := newDaemonSet("foo1")
  2185. ds1.Spec.UpdateStrategy = *strategy
  2186. ds2 := newDaemonSet("foo2")
  2187. ds2.Spec.UpdateStrategy = *strategy
  2188. manager.dsStore.Add(ds1)
  2189. manager.dsStore.Add(ds2)
  2190. pod := newPod("pod1-", "node-0", simpleDaemonSetLabel, nil)
  2191. prev := *pod
  2192. bumpResourceVersion(pod)
  2193. manager.updatePod(&prev, pod)
  2194. if got, want := manager.queue.Len(), 0; got != want {
  2195. t.Fatalf("queue.Len() = %v, want %v", got, want)
  2196. }
  2197. }
  2198. }
  2199. func TestUpdatePodOrphanWithNewLabels(t *testing.T) {
  2200. for _, strategy := range updateStrategies() {
  2201. manager, _, _, err := newTestController()
  2202. if err != nil {
  2203. t.Fatalf("error creating DaemonSets controller: %v", err)
  2204. }
  2205. ds1 := newDaemonSet("foo1")
  2206. ds1.Spec.UpdateStrategy = *strategy
  2207. ds2 := newDaemonSet("foo2")
  2208. ds2.Spec.UpdateStrategy = *strategy
  2209. manager.dsStore.Add(ds1)
  2210. manager.dsStore.Add(ds2)
  2211. pod := newPod("pod1-", "node-0", simpleDaemonSetLabel, nil)
  2212. prev := *pod
  2213. prev.Labels = map[string]string{"foo2": "bar2"}
  2214. bumpResourceVersion(pod)
  2215. manager.updatePod(&prev, pod)
  2216. if got, want := manager.queue.Len(), 2; got != want {
  2217. t.Fatalf("queue.Len() = %v, want %v", got, want)
  2218. }
  2219. if got, want := getQueuedKeys(manager.queue), []string{"default/foo1", "default/foo2"}; !reflect.DeepEqual(got, want) {
  2220. t.Errorf("getQueuedKeys() = %v, want %v", got, want)
  2221. }
  2222. }
  2223. }
  2224. func TestUpdatePodChangeControllerRef(t *testing.T) {
  2225. for _, strategy := range updateStrategies() {
  2226. ds := newDaemonSet("foo")
  2227. ds.Spec.UpdateStrategy = *strategy
  2228. manager, _, _, err := newTestController()
  2229. if err != nil {
  2230. t.Fatalf("error creating DaemonSets controller: %v", err)
  2231. }
  2232. ds1 := newDaemonSet("foo1")
  2233. ds2 := newDaemonSet("foo2")
  2234. manager.dsStore.Add(ds1)
  2235. manager.dsStore.Add(ds2)
  2236. pod := newPod("pod1-", "node-0", simpleDaemonSetLabel, ds1)
  2237. prev := *pod
  2238. prev.OwnerReferences = []metav1.OwnerReference{*metav1.NewControllerRef(ds2, controllerKind)}
  2239. bumpResourceVersion(pod)
  2240. manager.updatePod(&prev, pod)
  2241. if got, want := manager.queue.Len(), 2; got != want {
  2242. t.Fatalf("queue.Len() = %v, want %v", got, want)
  2243. }
  2244. }
  2245. }
  2246. func TestUpdatePodControllerRefRemoved(t *testing.T) {
  2247. for _, strategy := range updateStrategies() {
  2248. manager, _, _, err := newTestController()
  2249. if err != nil {
  2250. t.Fatalf("error creating DaemonSets controller: %v", err)
  2251. }
  2252. ds1 := newDaemonSet("foo1")
  2253. ds1.Spec.UpdateStrategy = *strategy
  2254. ds2 := newDaemonSet("foo2")
  2255. ds2.Spec.UpdateStrategy = *strategy
  2256. manager.dsStore.Add(ds1)
  2257. manager.dsStore.Add(ds2)
  2258. pod := newPod("pod1-", "node-0", simpleDaemonSetLabel, ds1)
  2259. prev := *pod
  2260. pod.OwnerReferences = nil
  2261. bumpResourceVersion(pod)
  2262. manager.updatePod(&prev, pod)
  2263. if got, want := manager.queue.Len(), 2; got != want {
  2264. t.Fatalf("queue.Len() = %v, want %v", got, want)
  2265. }
  2266. }
  2267. }
  2268. func TestDeletePod(t *testing.T) {
  2269. for _, strategy := range updateStrategies() {
  2270. manager, _, _, err := newTestController()
  2271. if err != nil {
  2272. t.Fatalf("error creating DaemonSets controller: %v", err)
  2273. }
  2274. ds1 := newDaemonSet("foo1")
  2275. ds1.Spec.UpdateStrategy = *strategy
  2276. ds2 := newDaemonSet("foo2")
  2277. ds2.Spec.UpdateStrategy = *strategy
  2278. manager.dsStore.Add(ds1)
  2279. manager.dsStore.Add(ds2)
  2280. pod1 := newPod("pod1-", "node-0", simpleDaemonSetLabel, ds1)
  2281. manager.deletePod(pod1)
  2282. if got, want := manager.queue.Len(), 1; got != want {
  2283. t.Fatalf("queue.Len() = %v, want %v", got, want)
  2284. }
  2285. key, done := manager.queue.Get()
  2286. if key == nil || done {
  2287. t.Fatalf("failed to enqueue controller for pod %v", pod1.Name)
  2288. }
  2289. expectedKey, _ := controller.KeyFunc(ds1)
  2290. if got, want := key.(string), expectedKey; got != want {
  2291. t.Errorf("queue.Get() = %v, want %v", got, want)
  2292. }
  2293. pod2 := newPod("pod2-", "node-0", simpleDaemonSetLabel, ds2)
  2294. manager.deletePod(pod2)
  2295. if got, want := manager.queue.Len(), 1; got != want {
  2296. t.Fatalf("queue.Len() = %v, want %v", got, want)
  2297. }
  2298. key, done = manager.queue.Get()
  2299. if key == nil || done {
  2300. t.Fatalf("failed to enqueue controller for pod %v", pod2.Name)
  2301. }
  2302. expectedKey, _ = controller.KeyFunc(ds2)
  2303. if got, want := key.(string), expectedKey; got != want {
  2304. t.Errorf("queue.Get() = %v, want %v", got, want)
  2305. }
  2306. }
  2307. }
  2308. func TestDeletePodOrphan(t *testing.T) {
  2309. for _, strategy := range updateStrategies() {
  2310. manager, _, _, err := newTestController()
  2311. if err != nil {
  2312. t.Fatalf("error creating DaemonSets controller: %v", err)
  2313. }
  2314. ds1 := newDaemonSet("foo1")
  2315. ds1.Spec.UpdateStrategy = *strategy
  2316. ds2 := newDaemonSet("foo2")
  2317. ds2.Spec.UpdateStrategy = *strategy
  2318. ds3 := newDaemonSet("foo3")
  2319. ds3.Spec.UpdateStrategy = *strategy
  2320. ds3.Spec.Selector.MatchLabels = simpleDaemonSetLabel2
  2321. manager.dsStore.Add(ds1)
  2322. manager.dsStore.Add(ds2)
  2323. manager.dsStore.Add(ds3)
  2324. pod := newPod("pod1-", "node-0", simpleDaemonSetLabel, nil)
  2325. manager.deletePod(pod)
  2326. if got, want := manager.queue.Len(), 0; got != want {
  2327. t.Fatalf("queue.Len() = %v, want %v", got, want)
  2328. }
  2329. }
  2330. }
  2331. func bumpResourceVersion(obj metav1.Object) {
  2332. ver, _ := strconv.ParseInt(obj.GetResourceVersion(), 10, 32)
  2333. obj.SetResourceVersion(strconv.FormatInt(ver+1, 10))
  2334. }
  2335. // getQueuedKeys returns a sorted list of keys in the queue.
  2336. // It can be used to quickly check that multiple keys are in there.
  2337. func getQueuedKeys(queue workqueue.RateLimitingInterface) []string {
  2338. var keys []string
  2339. count := queue.Len()
  2340. for i := 0; i < count; i++ {
  2341. key, done := queue.Get()
  2342. if done {
  2343. return keys
  2344. }
  2345. keys = append(keys, key.(string))
  2346. }
  2347. sort.Strings(keys)
  2348. return keys
  2349. }