@@ -422,16 +422,20 @@ func (p *LocalPathProvisioner) provisionFor(opts pvController.ProvisionOptions,
422
422
// affinity, as path is accessible from any node
423
423
nodeAffinity = nil
424
424
} else {
425
+ valueNode , ok := node .GetLabels ()[KeyNode ]
426
+ if ! ok {
427
+ valueNode = nodeName
428
+ }
425
429
nodeAffinity = & v1.VolumeNodeAffinity {
426
430
Required : & v1.NodeSelector {
427
431
NodeSelectorTerms : []v1.NodeSelectorTerm {
428
432
{
429
- MatchFields : []v1.NodeSelectorRequirement {
433
+ MatchExpressions : []v1.NodeSelectorRequirement {
430
434
{
431
- Key : metav1 . ObjectNameField ,
435
+ Key : KeyNode ,
432
436
Operator : v1 .NodeSelectorOpIn ,
433
437
Values : []string {
434
- node . Name ,
438
+ valueNode ,
435
439
},
436
440
},
437
441
},
@@ -471,7 +475,7 @@ func (p *LocalPathProvisioner) deleteFor(pv *v1.PersistentVolume, c *StorageClas
471
475
err = errors .Wrapf (err , "failed to delete volume %v" , pv .Name )
472
476
}()
473
477
474
- path , node , nodeLabels , err := p .getPathAndNodeForPV (pv , c )
478
+ path , node , err := p .getPathAndNodeForPV (pv , c )
475
479
if err != nil {
476
480
return err
477
481
}
@@ -494,7 +498,6 @@ func (p *LocalPathProvisioner) deleteFor(pv *v1.PersistentVolume, c *StorageClas
494
498
Mode : * pv .Spec .VolumeMode ,
495
499
SizeInBytes : storage .Value (),
496
500
Node : node ,
497
- NodeLabels : nodeLabels ,
498
501
}, c ); err != nil {
499
502
logrus .Infof ("clean up volume %v failed: %v" , pv .Name , err )
500
503
return err
@@ -505,7 +508,7 @@ func (p *LocalPathProvisioner) deleteFor(pv *v1.PersistentVolume, c *StorageClas
505
508
return nil
506
509
}
507
510
508
- func (p * LocalPathProvisioner ) getPathAndNodeForPV (pv * v1.PersistentVolume , cfg * StorageClassConfig ) (path , node string , nodeLabels map [ string ] string , err error ) {
511
+ func (p * LocalPathProvisioner ) getPathAndNodeForPV (pv * v1.PersistentVolume , cfg * StorageClassConfig ) (path , node string , err error ) {
509
512
defer func () {
510
513
err = errors .Wrapf (err , "failed to delete volume %v" , pv .Name )
511
514
}()
@@ -516,55 +519,49 @@ func (p *LocalPathProvisioner) getPathAndNodeForPV(pv *v1.PersistentVolume, cfg
516
519
} else if volumeSource .Local != nil && volumeSource .HostPath == nil {
517
520
path = volumeSource .Local .Path
518
521
} else {
519
- return "" , "" , nil , fmt .Errorf ("no path set" )
522
+ return "" , "" , fmt .Errorf ("no path set" )
520
523
}
521
524
522
525
sharedFS , err := p .isSharedFilesystem (cfg )
523
526
if err != nil {
524
- return "" , "" , nil , err
527
+ return "" , "" , err
525
528
}
526
529
527
530
if sharedFS {
528
531
// We don't have affinity and can use any node
529
- return path , "" , nil , nil
532
+ return path , "" , nil
530
533
}
531
534
532
535
// Dealing with local filesystem
533
536
534
537
nodeAffinity := pv .Spec .NodeAffinity
535
538
if nodeAffinity == nil {
536
- return "" , "" , nil , fmt .Errorf ("no NodeAffinity set" )
539
+ return "" , "" , fmt .Errorf ("no NodeAffinity set" )
537
540
}
538
541
required := nodeAffinity .Required
539
542
if required == nil {
540
- return "" , "" , nil , fmt .Errorf ("no NodeAffinity.Required set" )
543
+ return "" , "" , fmt .Errorf ("no NodeAffinity.Required set" )
541
544
}
542
545
543
- // If we have an explicit node, use that; otherwise use the selector.
544
- for _ , selectorTerm := range required .NodeSelectorTerms {
545
- for _ , expression := range selectorTerm .MatchFields {
546
- if expression .Key == metav1 .ObjectNameField && expression .Operator == v1 .NodeSelectorOpIn {
547
- if len (expression .Values ) != 1 {
548
- return "" , "" , nil , fmt .Errorf ("multiple values for the node affinity" )
549
- }
550
- return path , expression .Values [0 ], nil , nil
551
- }
552
- }
553
- }
554
- // The scheduler must use the PV's node selector to schedule a helper pod.
546
+ node = ""
555
547
for _ , selectorTerm := range required .NodeSelectorTerms {
556
548
for _ , expression := range selectorTerm .MatchExpressions {
557
549
if expression .Key == KeyNode && expression .Operator == v1 .NodeSelectorOpIn {
558
550
if len (expression .Values ) != 1 {
559
- return "" , "" , nil , fmt .Errorf ("multiple values for the node affinity" )
551
+ return "" , "" , fmt .Errorf ("multiple values for the node affinity" )
560
552
}
561
- return path , "" , map [string ]string {
562
- KeyNode : expression .Values [0 ],
563
- }, nil
553
+ node = expression .Values [0 ]
554
+ break
564
555
}
565
556
}
557
+ if node != "" {
558
+ break
559
+ }
566
560
}
567
- return "" , "" , nil , fmt .Errorf ("cannot find affinited node" )
561
+ if node == "" {
562
+ return "" , "" , fmt .Errorf ("cannot find affinited node" )
563
+ }
564
+ return path , node , nil
568
565
}
569
566
570
567
type volumeOptions struct {
@@ -573,7 +570,6 @@ type volumeOptions struct {
573
570
Mode v1.PersistentVolumeMode
574
571
SizeInBytes int64
575
572
Node string
576
- NodeLabels map [string ]string
577
573
}
578
574
579
575
func (p * LocalPathProvisioner ) createHelperPod (action ActionType , cmd []string , o volumeOptions , cfg * StorageClassConfig ) (err error ) {
@@ -584,7 +580,7 @@ func (p *LocalPathProvisioner) createHelperPod(action ActionType, cmd []string,
584
580
if err != nil {
585
581
return err
586
582
}
587
- if o .Name == "" || o .Path == "" || (! sharedFS && o .Node == "" && o . NodeLabels == nil ) {
583
+ if o .Name == "" || o .Path == "" || (! sharedFS && o .Node == "" ) {
588
584
return fmt .Errorf ("invalid empty name or path or node" )
589
585
}
590
586
if ! filepath .IsAbs (o .Path ) {
@@ -665,8 +661,9 @@ func (p *LocalPathProvisioner) createHelperPod(action ActionType, cmd []string,
665
661
helperPod .Name = helperPod .Name [:HelperPodNameMaxLength ]
666
662
}
667
663
helperPod .Namespace = p .namespace
668
- helperPod .Spec .NodeName = o .Node
669
- helperPod .Spec .NodeSelector = o .NodeLabels
664
+ if o .Node != "" {
665
+ helperPod .Spec .NodeName = o .Node
666
+ }
670
667
helperPod .Spec .ServiceAccountName = p .serviceAccountName
671
668
helperPod .Spec .RestartPolicy = v1 .RestartPolicyNever
672
669
helperPod .Spec .Tolerations = append (helperPod .Spec .Tolerations , lpvTolerations ... )
0 commit comments