Skip to content

Commit 4e4aaa3

Browse files
authored
change how we copy labels to importer pod (#4091)
when we are using populators, instead of copying labels from target pvc -> prime pvc -> pod, skip copying to prime and instead get the labels from target pvc by using the prime pvc's owner ref. convert functional test for this to unit test. Signed-off-by: dsanatar <dsanatar@redhat.com>
1 parent c4239d6 commit 4e4aaa3

6 files changed

Lines changed: 94 additions & 51 deletions

File tree

pkg/controller/BUILD.bazel

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ go_test(
120120
"//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library",
121121
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
122122
"//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library",
123+
"//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library",
123124
"//vendor/k8s.io/apimachinery/pkg/types:go_default_library",
124125
"//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library",
125126
"//vendor/k8s.io/apimachinery/pkg/util/validation:go_default_library",

pkg/controller/import-controller.go

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -941,8 +941,22 @@ func createImporterPod(ctx context.Context, log logr.Logger, client client.Clien
941941

942942
util.SetRecommendedLabels(pod, installerLabels, "cdi-controller")
943943

944+
srcLabels := args.pvc.Labels
945+
if _, isPopulator := args.pvc.Annotations[cc.AnnPopulatorKind]; isPopulator {
946+
ownerRef := metav1.GetControllerOf(args.pvc)
947+
if ownerRef == nil || ownerRef.Kind != "PersistentVolumeClaim" {
948+
return nil, fmt.Errorf("pvc %s/%s does not have a valid owner reference", args.pvc.Namespace, args.pvc.Name)
949+
}
950+
951+
pvc := &corev1.PersistentVolumeClaim{}
952+
if err := client.Get(context.TODO(), types.NamespacedName{Namespace: args.pvc.Namespace, Name: ownerRef.Name}, pvc); err != nil {
953+
return nil, err
954+
}
955+
srcLabels = pvc.GetLabels()
956+
}
957+
944958
// add any labels from pvc to the importer pod
945-
util.MergeLabels(args.pvc.Labels, pod.Labels)
959+
util.MergeLabels(srcLabels, pod.Labels)
946960

947961
if err = client.Create(context.TODO(), pod); err != nil {
948962
return nil, err

pkg/controller/import-controller_test.go

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import (
3131
"k8s.io/apimachinery/pkg/api/errors"
3232
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3333
"k8s.io/apimachinery/pkg/runtime"
34+
"k8s.io/apimachinery/pkg/runtime/schema"
3435
"k8s.io/apimachinery/pkg/types"
3536
kvalidation "k8s.io/apimachinery/pkg/util/validation"
3637
"k8s.io/client-go/kubernetes/scheme"
@@ -907,6 +908,64 @@ var _ = Describe("Create Importer Pod", func() {
907908
Entry("should create pod with block volume mode and scratchspace", createBlockPvc("testBlockPvc1", "default", map[string]string{cc.AnnEndpoint: testEndPoint, cc.AnnPodPhase: string(corev1.PodPending), cc.AnnImportPod: "podName", cc.AnnPriorityClassName: "p0", cc.AnnPodServiceAccount: "my-sa"}, nil), &scratchPvcName),
908909
)
909910

911+
DescribeTable("should copy labels from target PVC when creating pod", func(isPopulator bool) {
912+
targetPvc := cc.CreatePvc("targetPvc", "default",
913+
map[string]string{
914+
cc.AnnEndpoint: testEndPoint,
915+
cc.AnnImportPod: "podName",
916+
},
917+
map[string]string{
918+
"custom-label": "value",
919+
},
920+
)
921+
922+
objects := []runtime.Object{targetPvc}
923+
podArgs := &importerPodArgs{
924+
image: testImage,
925+
verbose: "5",
926+
pullPolicy: testPullPolicy,
927+
podEnvVar: &importPodEnvVar{},
928+
pvc: targetPvc,
929+
}
930+
931+
if isPopulator {
932+
primePvc := cc.CreatePvc("primePvc", "default",
933+
map[string]string{
934+
cc.AnnEndpoint: testEndPoint,
935+
cc.AnnImportPod: "podName",
936+
cc.AnnPopulatorKind: cdiv1.VolumeImportSourceRef,
937+
},
938+
map[string]string{
939+
"prime-label": "prime-value",
940+
},
941+
)
942+
primePvc.OwnerReferences = []metav1.OwnerReference{
943+
*metav1.NewControllerRef(targetPvc, schema.GroupVersionKind{
944+
Group: "",
945+
Version: "v1",
946+
Kind: "PersistentVolumeClaim",
947+
}),
948+
}
949+
objects = append(objects, primePvc)
950+
podArgs.pvc = primePvc
951+
}
952+
953+
reconciler := createImportReconciler(objects...)
954+
955+
pod, err := createImporterPod(context.TODO(), reconciler.log, reconciler.client, podArgs, map[string]string{})
956+
Expect(err).ToNot(HaveOccurred())
957+
958+
By("Verifying pod has labels from target PVC")
959+
Expect(pod.Labels).To(HaveKeyWithValue("custom-label", "value"))
960+
if isPopulator {
961+
By("Verifying pod does not have labels from prime PVC")
962+
Expect(pod.Labels).ToNot(HaveKey("prime-label"))
963+
}
964+
},
965+
Entry("using populator", true),
966+
Entry("using non-populator", false),
967+
)
968+
910969
DescribeTable("should append current checkpoint name to importer pod", func(pvcName, checkpointID string) {
911970
pvc := cc.CreatePvc(pvcName, "default", map[string]string{cc.AnnCurrentCheckpoint: checkpointID, cc.AnnEndpoint: testEndPoint}, nil)
912971
pvc.Status.Phase = v1.ClaimBound

pkg/controller/populators/import-populator_test.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,25 @@ var _ = Describe("Import populator tests", func() {
285285
Entry("retain pod annotation is passed", AnnPodRetainAfterCompletion, "true", "true"),
286286
)
287287

288+
It("Should not copy target PVC labels to PVC Prime", func() {
289+
targetPvc := CreatePvcInStorageClass(targetPvcName, metav1.NamespaceDefault, &sc.Name,
290+
map[string]string{}, map[string]string{"custom-label": "value"}, corev1.ClaimPending)
291+
targetPvc.Spec.DataSourceRef = dataSourceRef
292+
volumeImportSource := getVolumeImportSource(true, metav1.NamespaceDefault)
293+
294+
By("Reconcile")
295+
reconciler = createImportPopulatorReconciler(targetPvc, volumeImportSource, sc)
296+
result, err := reconciler.Reconcile(context.TODO(), reconcile.Request{NamespacedName: types.NamespacedName{Name: targetPvcName, Namespace: metav1.NamespaceDefault}})
297+
Expect(err).To(Not(HaveOccurred()))
298+
Expect(result).To(Not(BeNil()))
299+
300+
By("Checking prime PVC does not have target PVC labels")
301+
pvcPrime, err := reconciler.getPVCPrime(targetPvc)
302+
Expect(err).ToNot(HaveOccurred())
303+
Expect(pvcPrime).ToNot(BeNil())
304+
Expect(pvcPrime.GetLabels()).ToNot(HaveKey("custom-label"))
305+
})
306+
288307
It("should trigger appropriate event when using AnnPodRetainAfterCompletion", func() {
289308
targetPvc := CreatePvcInStorageClass(targetPvcName, metav1.NamespaceDefault, &sc.Name,
290309
map[string]string{AnnPodPhase: string(corev1.PodSucceeded)}, nil, corev1.ClaimPending)

pkg/controller/populators/populator-base.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,6 @@ func (r *ReconcilerBase) createPVCPrime(pvc *corev1.PersistentVolumeClaim, sourc
231231
}
232232
cc.CopyAllowedAnnotations(pvc, pvcPrime)
233233
util.SetRecommendedLabels(pvcPrime, r.installerLabels, "cdi-controller")
234-
util.MergeLabels(pvc.Labels, pvcPrime.Labels)
235234

236235
// We use the populator-specific pvcModifierFunc to add required annotations
237236
if updatePVCForPopulation != nil {

tests/import_test.go

Lines changed: 0 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -2097,55 +2097,6 @@ var _ = Describe("Containerdisk envs to PVC labels", func() {
20972097
)
20982098
})
20992099

2100-
var _ = Describe("Propagate DV Labels to Importer Pod", func() {
2101-
f := framework.NewFramework(namespacePrefix)
2102-
2103-
const (
2104-
testKubevirtKey = "test.kubevirt.io/test"
2105-
testKubevirtValue = "true"
2106-
testNonKubevirtKey = "testLabel"
2107-
testNonKubevirtVal = "none"
2108-
)
2109-
2110-
DescribeTable("Import pod should inherit any labels from Data Volume", func(usePopulator string) {
2111-
2112-
dataVolume := utils.NewDataVolumeWithHTTPImport("label-test", "100Mi", fmt.Sprintf(utils.TinyCoreIsoURL, f.CdiInstallNs))
2113-
dataVolume.Annotations[controller.AnnImmediateBinding] = "true"
2114-
dataVolume.Annotations[controller.AnnPodRetainAfterCompletion] = "true"
2115-
dataVolume.Annotations[controller.AnnUsePopulator] = usePopulator
2116-
2117-
dataVolume.Labels = map[string]string{
2118-
testKubevirtKey: testKubevirtValue,
2119-
testNonKubevirtKey: testNonKubevirtVal,
2120-
}
2121-
2122-
By(fmt.Sprintf("Create new datavolume %s", dataVolume.Name))
2123-
dataVolume, err := utils.CreateDataVolumeFromDefinition(f.CdiClient, f.Namespace.Name, dataVolume)
2124-
Expect(err).ToNot(HaveOccurred())
2125-
2126-
By("Verify pvc was created")
2127-
_, err = utils.WaitForPVC(f.K8sClient, dataVolume.Namespace, dataVolume.Name)
2128-
Expect(err).ToNot(HaveOccurred())
2129-
2130-
By("Wait for import to be completed")
2131-
err = utils.WaitForDataVolumePhase(f, dataVolume.Namespace, cdiv1.Succeeded, dataVolume.Name)
2132-
Expect(err).ToNot(HaveOccurred(), "Datavolume not in phase succeeded in time")
2133-
2134-
By("Find importer pod")
2135-
importer, err := utils.FindPodByPrefix(f.K8sClient, dataVolume.Namespace, common.ImporterPodName, common.CDILabelSelector)
2136-
Expect(err).ToNot(HaveOccurred())
2137-
2138-
By("Check labels were appended")
2139-
importLabels := importer.GetLabels()
2140-
Expect(importLabels).Should(HaveKeyWithValue(testKubevirtKey, testKubevirtValue))
2141-
Expect(importLabels).Should(HaveKeyWithValue(testNonKubevirtKey, testNonKubevirtVal))
2142-
2143-
},
2144-
Entry("With Populators", "true"),
2145-
Entry("Without Populators", "false"),
2146-
)
2147-
})
2148-
21492100
var _ = Describe("pull image failure", func() {
21502101
var (
21512102
f = framework.NewFramework(namespacePrefix)

0 commit comments

Comments
 (0)