Skip to content

Commit 8f32696

Browse files
authored
Merge branch 'main' into 1.18_add_bia_skip_resource_logic
2 parents 3f15e92 + 8b55592 commit 8f32696

14 files changed

Lines changed: 377 additions & 70 deletions

File tree

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fix issue #9496, support customized host os

pkg/exposer/csi_snapshot.go

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -330,7 +330,8 @@ func (e *csiSnapshotExposer) GetExposed(ctx context.Context, ownerObject corev1a
330330
curLog.WithField("pod", pod.Name).Infof("Backup volume is found in pod at index %v", i)
331331

332332
var nodeOS *string
333-
if os, found := pod.Spec.NodeSelector[kube.NodeOSLabel]; found {
333+
if pod.Spec.OS != nil {
334+
os := string(pod.Spec.OS.Name)
334335
nodeOS = &os
335336
}
336337

@@ -654,6 +655,10 @@ func (e *csiSnapshotExposer) createBackupPod(
654655
args = append(args, podInfo.logFormatArgs...)
655656
args = append(args, podInfo.logLevelArgs...)
656657

658+
if affinity == nil {
659+
affinity = &kube.LoadAffinity{}
660+
}
661+
657662
var securityCtx *corev1api.PodSecurityContext
658663
nodeSelector := map[string]string{}
659664
podOS := corev1api.PodOS{}
@@ -665,9 +670,14 @@ func (e *csiSnapshotExposer) createBackupPod(
665670
},
666671
}
667672

668-
nodeSelector[kube.NodeOSLabel] = kube.NodeOSWindows
669673
podOS.Name = kube.NodeOSWindows
670674

675+
affinity.NodeSelector.MatchExpressions = append(affinity.NodeSelector.MatchExpressions, metav1.LabelSelectorRequirement{
676+
Key: kube.NodeOSLabel,
677+
Values: []string{kube.NodeOSWindows},
678+
Operator: metav1.LabelSelectorOpIn,
679+
})
680+
671681
toleration = append(toleration, []corev1api.Toleration{
672682
{
673683
Key: "os",
@@ -694,11 +704,15 @@ func (e *csiSnapshotExposer) createBackupPod(
694704
}
695705
}
696706

697-
nodeSelector[kube.NodeOSLabel] = kube.NodeOSLinux
698707
podOS.Name = kube.NodeOSLinux
708+
709+
affinity.NodeSelector.MatchExpressions = append(affinity.NodeSelector.MatchExpressions, metav1.LabelSelectorRequirement{
710+
Key: kube.NodeOSLabel,
711+
Values: []string{kube.NodeOSWindows},
712+
Operator: metav1.LabelSelectorOpNotIn,
713+
})
699714
}
700715

701-
var podAffinity *corev1api.Affinity
702716
if len(intoleratableNodes) > 0 {
703717
if affinity == nil {
704718
affinity = &kube.LoadAffinity{}
@@ -711,9 +725,7 @@ func (e *csiSnapshotExposer) createBackupPod(
711725
})
712726
}
713727

714-
if affinity != nil {
715-
podAffinity = kube.ToSystemAffinity(affinity, volumeTopology)
716-
}
728+
podAffinity := kube.ToSystemAffinity(affinity, volumeTopology)
717729

718730
pod := &corev1api.Pod{
719731
ObjectMeta: metav1.ObjectMeta{

pkg/exposer/csi_snapshot_test.go

Lines changed: 170 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -467,6 +467,23 @@ func TestExpose(t *testing.T) {
467467
daemonSet,
468468
scObj,
469469
},
470+
expectedAffinity: &corev1api.Affinity{
471+
NodeAffinity: &corev1api.NodeAffinity{
472+
RequiredDuringSchedulingIgnoredDuringExecution: &corev1api.NodeSelector{
473+
NodeSelectorTerms: []corev1api.NodeSelectorTerm{
474+
{
475+
MatchExpressions: []corev1api.NodeSelectorRequirement{
476+
{
477+
Key: "kubernetes.io/os",
478+
Operator: corev1api.NodeSelectorOpNotIn,
479+
Values: []string{"windows"},
480+
},
481+
},
482+
},
483+
},
484+
},
485+
},
486+
},
470487
},
471488
{
472489
name: "success-with-labels",
@@ -488,6 +505,23 @@ func TestExpose(t *testing.T) {
488505
daemonSet,
489506
scObj,
490507
},
508+
expectedAffinity: &corev1api.Affinity{
509+
NodeAffinity: &corev1api.NodeAffinity{
510+
RequiredDuringSchedulingIgnoredDuringExecution: &corev1api.NodeSelector{
511+
NodeSelectorTerms: []corev1api.NodeSelectorTerm{
512+
{
513+
MatchExpressions: []corev1api.NodeSelectorRequirement{
514+
{
515+
Key: "kubernetes.io/os",
516+
Operator: corev1api.NodeSelectorOpNotIn,
517+
Values: []string{"windows"},
518+
},
519+
},
520+
},
521+
},
522+
},
523+
},
524+
},
491525
},
492526
{
493527
name: "restore size from exposeParam",
@@ -511,6 +545,23 @@ func TestExpose(t *testing.T) {
511545
scObj,
512546
},
513547
expectedVolumeSize: resource.NewQuantity(567890, ""),
548+
expectedAffinity: &corev1api.Affinity{
549+
NodeAffinity: &corev1api.NodeAffinity{
550+
RequiredDuringSchedulingIgnoredDuringExecution: &corev1api.NodeSelector{
551+
NodeSelectorTerms: []corev1api.NodeSelectorTerm{
552+
{
553+
MatchExpressions: []corev1api.NodeSelectorRequirement{
554+
{
555+
Key: "kubernetes.io/os",
556+
Operator: corev1api.NodeSelectorOpNotIn,
557+
Values: []string{"windows"},
558+
},
559+
},
560+
},
561+
},
562+
},
563+
},
564+
},
514565
},
515566
{
516567
name: "backupPod mounts read only backupPVC",
@@ -539,6 +590,23 @@ func TestExpose(t *testing.T) {
539590
scObj,
540591
},
541592
expectedReadOnlyPVC: true,
593+
expectedAffinity: &corev1api.Affinity{
594+
NodeAffinity: &corev1api.NodeAffinity{
595+
RequiredDuringSchedulingIgnoredDuringExecution: &corev1api.NodeSelector{
596+
NodeSelectorTerms: []corev1api.NodeSelectorTerm{
597+
{
598+
MatchExpressions: []corev1api.NodeSelectorRequirement{
599+
{
600+
Key: "kubernetes.io/os",
601+
Operator: corev1api.NodeSelectorOpNotIn,
602+
Values: []string{"windows"},
603+
},
604+
},
605+
},
606+
},
607+
},
608+
},
609+
},
542610
},
543611
{
544612
name: "backupPod mounts read only backupPVC and storageClass specified in backupPVC config",
@@ -568,6 +636,23 @@ func TestExpose(t *testing.T) {
568636
},
569637
expectedReadOnlyPVC: true,
570638
expectedBackupPVCStorageClass: "fake-sc-read-only",
639+
expectedAffinity: &corev1api.Affinity{
640+
NodeAffinity: &corev1api.NodeAffinity{
641+
RequiredDuringSchedulingIgnoredDuringExecution: &corev1api.NodeSelector{
642+
NodeSelectorTerms: []corev1api.NodeSelectorTerm{
643+
{
644+
MatchExpressions: []corev1api.NodeSelectorRequirement{
645+
{
646+
Key: "kubernetes.io/os",
647+
Operator: corev1api.NodeSelectorOpNotIn,
648+
Values: []string{"windows"},
649+
},
650+
},
651+
},
652+
},
653+
},
654+
},
655+
},
571656
},
572657
{
573658
name: "backupPod mounts backupPVC with storageClass specified in backupPVC config",
@@ -595,6 +680,23 @@ func TestExpose(t *testing.T) {
595680
scObj,
596681
},
597682
expectedBackupPVCStorageClass: "fake-sc-read-only",
683+
expectedAffinity: &corev1api.Affinity{
684+
NodeAffinity: &corev1api.NodeAffinity{
685+
RequiredDuringSchedulingIgnoredDuringExecution: &corev1api.NodeSelector{
686+
NodeSelectorTerms: []corev1api.NodeSelectorTerm{
687+
{
688+
MatchExpressions: []corev1api.NodeSelectorRequirement{
689+
{
690+
Key: "kubernetes.io/os",
691+
Operator: corev1api.NodeSelectorOpNotIn,
692+
Values: []string{"windows"},
693+
},
694+
},
695+
},
696+
},
697+
},
698+
},
699+
},
598700
},
599701
{
600702
name: "Affinity per StorageClass",
@@ -641,6 +743,11 @@ func TestExpose(t *testing.T) {
641743
Operator: corev1api.NodeSelectorOpIn,
642744
Values: []string{"Linux"},
643745
},
746+
{
747+
Key: "kubernetes.io/os",
748+
Operator: corev1api.NodeSelectorOpNotIn,
749+
Values: []string{"windows"},
750+
},
644751
},
645752
},
646753
},
@@ -699,6 +806,11 @@ func TestExpose(t *testing.T) {
699806
Operator: corev1api.NodeSelectorOpIn,
700807
Values: []string{"amd64"},
701808
},
809+
{
810+
Key: "kubernetes.io/os",
811+
Operator: corev1api.NodeSelectorOpNotIn,
812+
Values: []string{"windows"},
813+
},
702814
},
703815
},
704816
},
@@ -733,7 +845,23 @@ func TestExpose(t *testing.T) {
733845
scObj,
734846
},
735847
expectedBackupPVCStorageClass: "fake-sc-read-only",
736-
expectedAffinity: nil,
848+
expectedAffinity: &corev1api.Affinity{
849+
NodeAffinity: &corev1api.NodeAffinity{
850+
RequiredDuringSchedulingIgnoredDuringExecution: &corev1api.NodeSelector{
851+
NodeSelectorTerms: []corev1api.NodeSelectorTerm{
852+
{
853+
MatchExpressions: []corev1api.NodeSelectorRequirement{
854+
{
855+
Key: "kubernetes.io/os",
856+
Operator: corev1api.NodeSelectorOpNotIn,
857+
Values: []string{"windows"},
858+
},
859+
},
860+
},
861+
},
862+
},
863+
},
864+
},
737865
},
738866
{
739867
name: "IntolerateSourceNode, get source node fail",
@@ -770,7 +898,23 @@ func TestExpose(t *testing.T) {
770898
},
771899
},
772900
},
773-
expectedAffinity: nil,
901+
expectedAffinity: &corev1api.Affinity{
902+
NodeAffinity: &corev1api.NodeAffinity{
903+
RequiredDuringSchedulingIgnoredDuringExecution: &corev1api.NodeSelector{
904+
NodeSelectorTerms: []corev1api.NodeSelectorTerm{
905+
{
906+
MatchExpressions: []corev1api.NodeSelectorRequirement{
907+
{
908+
Key: "kubernetes.io/os",
909+
Operator: corev1api.NodeSelectorOpNotIn,
910+
Values: []string{"windows"},
911+
},
912+
},
913+
},
914+
},
915+
},
916+
},
917+
},
774918
expectedPVCAnnotation: nil,
775919
},
776920
{
@@ -799,7 +943,23 @@ func TestExpose(t *testing.T) {
799943
daemonSet,
800944
scObj,
801945
},
802-
expectedAffinity: nil,
946+
expectedAffinity: &corev1api.Affinity{
947+
NodeAffinity: &corev1api.NodeAffinity{
948+
RequiredDuringSchedulingIgnoredDuringExecution: &corev1api.NodeSelector{
949+
NodeSelectorTerms: []corev1api.NodeSelectorTerm{
950+
{
951+
MatchExpressions: []corev1api.NodeSelectorRequirement{
952+
{
953+
Key: "kubernetes.io/os",
954+
Operator: corev1api.NodeSelectorOpNotIn,
955+
Values: []string{"windows"},
956+
},
957+
},
958+
},
959+
},
960+
},
961+
},
962+
},
803963
expectedPVCAnnotation: map[string]string{util.VSphereCNSFastCloneAnno: "true"},
804964
},
805965
{
@@ -836,6 +996,11 @@ func TestExpose(t *testing.T) {
836996
NodeSelectorTerms: []corev1api.NodeSelectorTerm{
837997
{
838998
MatchExpressions: []corev1api.NodeSelectorRequirement{
999+
{
1000+
Key: "kubernetes.io/os",
1001+
Operator: corev1api.NodeSelectorOpNotIn,
1002+
Values: []string{"windows"},
1003+
},
8391004
{
8401005
Key: "kubernetes.io/hostname",
8411006
Operator: corev1api.NodeSelectorOpNotIn,
@@ -929,6 +1094,8 @@ func TestExpose(t *testing.T) {
9291094

9301095
if test.expectedAffinity != nil {
9311096
assert.Equal(t, test.expectedAffinity, backupPod.Spec.Affinity)
1097+
} else {
1098+
assert.Nil(t, backupPod.Spec.Affinity)
9321099
}
9331100

9341101
if test.expectedPVCAnnotation != nil {

pkg/exposer/generic_restore.go

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -493,13 +493,13 @@ func (e *genericRestoreExposer) createRestorePod(
493493
containerName := string(ownerObject.UID)
494494
volumeName := string(ownerObject.UID)
495495

496-
var podAffinity *corev1api.Affinity
497-
if selectedNode == "" {
498-
e.log.Infof("No selected node for restore pod. Try to get affinity from the node-agent config.")
496+
if selectedNode != "" {
497+
affinity = nil
498+
e.log.Infof("Selected node for restore pod. Ignore affinity from the node-agent config.")
499+
}
499500

500-
if affinity != nil {
501-
podAffinity = kube.ToSystemAffinity(affinity, nil)
502-
}
501+
if affinity == nil {
502+
affinity = &kube.LoadAffinity{}
503503
}
504504

505505
podInfo, err := getInheritedPodInfo(ctx, e.kubeClient, ownerObject.Namespace, nodeOS)
@@ -576,9 +576,14 @@ func (e *genericRestoreExposer) createRestorePod(
576576
},
577577
}
578578

579-
nodeSelector[kube.NodeOSLabel] = kube.NodeOSWindows
580579
podOS.Name = kube.NodeOSWindows
581580

581+
affinity.NodeSelector.MatchExpressions = append(affinity.NodeSelector.MatchExpressions, metav1.LabelSelectorRequirement{
582+
Key: kube.NodeOSLabel,
583+
Values: []string{kube.NodeOSWindows},
584+
Operator: metav1.LabelSelectorOpIn,
585+
})
586+
582587
toleration = append(toleration, []corev1api.Toleration{
583588
{
584589
Key: "os",
@@ -599,10 +604,17 @@ func (e *genericRestoreExposer) createRestorePod(
599604
RunAsUser: &userID,
600605
}
601606

602-
nodeSelector[kube.NodeOSLabel] = kube.NodeOSLinux
603607
podOS.Name = kube.NodeOSLinux
608+
609+
affinity.NodeSelector.MatchExpressions = append(affinity.NodeSelector.MatchExpressions, metav1.LabelSelectorRequirement{
610+
Key: kube.NodeOSLabel,
611+
Values: []string{kube.NodeOSWindows},
612+
Operator: metav1.LabelSelectorOpNotIn,
613+
})
604614
}
605615

616+
podAffinity := kube.ToSystemAffinity(affinity, nil)
617+
606618
pod := &corev1api.Pod{
607619
ObjectMeta: metav1.ObjectMeta{
608620
Name: restorePodName,

0 commit comments

Comments
 (0)