diff --git a/cmd/kube-controller-manager/app/core.go b/cmd/kube-controller-manager/app/core.go index b800abcfe4..aa86130b51 100644 --- a/cmd/kube-controller-manager/app/core.go +++ b/cmd/kube-controller-manager/app/core.go @@ -175,6 +175,7 @@ func startPersistentVolumeBinderController(ctx ControllerContext) (bool, error) VolumeInformer: ctx.InformerFactory.Core().V1().PersistentVolumes(), ClaimInformer: ctx.InformerFactory.Core().V1().PersistentVolumeClaims(), ClassInformer: ctx.InformerFactory.Storage().V1().StorageClasses(), + PodInformer: ctx.InformerFactory.Core().V1().Pods(), EnableDynamicProvisioning: ctx.Options.VolumeConfiguration.EnableDynamicProvisioning, } volumeController, volumeControllerErr := persistentvolumecontroller.NewController(params) diff --git a/pkg/controller/volume/persistentvolume/binder_test.go b/pkg/controller/volume/persistentvolume/binder_test.go index cb916c08e0..0f51b47f00 100644 --- a/pkg/controller/volume/persistentvolume/binder_test.go +++ b/pkg/controller/volume/persistentvolume/binder_test.go @@ -624,7 +624,7 @@ func TestSync(t *testing.T) { ObjectMeta: metav1.ObjectMeta{Name: classWait}, VolumeBindingMode: &modeWait, }, - }) + }, []*v1.Pod{}) } func TestSyncAlphaBlockVolume(t *testing.T) { @@ -776,7 +776,7 @@ func TestSyncAlphaBlockVolume(t *testing.T) { } defer utilfeature.DefaultFeatureGate.Set("BlockVolume=false") - runSyncTests(t, tests, []*storage.StorageClass{}) + runSyncTests(t, tests, []*storage.StorageClass{}, []*v1.Pod{}) } // Test multiple calls to syncClaim/syncVolume and periodic sync of all diff --git a/pkg/controller/volume/persistentvolume/delete_test.go b/pkg/controller/volume/persistentvolume/delete_test.go index 7c3497f483..202d0d89ab 100644 --- a/pkg/controller/volume/persistentvolume/delete_test.go +++ b/pkg/controller/volume/persistentvolume/delete_test.go @@ -192,7 +192,7 @@ func TestDeleteSync(t *testing.T) { }, }, } - runSyncTests(t, tests, []*storage.StorageClass{}) + runSyncTests(t, tests, []*storage.StorageClass{}, []*v1.Pod{}) } // Test multiple calls to syncClaim/syncVolume and periodic sync of all diff --git a/pkg/controller/volume/persistentvolume/framework_test.go b/pkg/controller/volume/persistentvolume/framework_test.go index 7720dd5607..441309e6b5 100644 --- a/pkg/controller/volume/persistentvolume/framework_test.go +++ b/pkg/controller/volume/persistentvolume/framework_test.go @@ -41,6 +41,7 @@ import ( "k8s.io/client-go/informers" clientset "k8s.io/client-go/kubernetes" "k8s.io/client-go/kubernetes/fake" + corelisters "k8s.io/client-go/listers/core/v1" storagelisters "k8s.io/client-go/listers/storage/v1" core "k8s.io/client-go/testing" "k8s.io/client-go/tools/cache" @@ -609,6 +610,7 @@ func newTestController(kubeClient clientset.Interface, informerFactory informers VolumeInformer: informerFactory.Core().V1().PersistentVolumes(), ClaimInformer: informerFactory.Core().V1().PersistentVolumeClaims(), ClassInformer: informerFactory.Storage().V1().StorageClasses(), + PodInformer: informerFactory.Core().V1().Pods(), EventRecorder: record.NewFakeRecorder(1000), EnableDynamicProvisioning: enableDynamicProvisioning, } @@ -939,7 +941,7 @@ func evaluateTestResults(ctrl *PersistentVolumeController, reactor *volumeReacto // 2. Call the tested function (syncClaim/syncVolume) via // controllerTest.testCall *once*. // 3. Compare resulting volumes and claims with expected volumes and claims. -func runSyncTests(t *testing.T, tests []controllerTest, storageClasses []*storage.StorageClass) { +func runSyncTests(t *testing.T, tests []controllerTest, storageClasses []*storage.StorageClass, pods []*v1.Pod) { for _, test := range tests { glog.V(4).Infof("starting test %q", test.name) @@ -966,6 +968,12 @@ func runSyncTests(t *testing.T, tests []controllerTest, storageClasses []*storag } ctrl.classLister = storagelisters.NewStorageClassLister(indexer) + podIndexer := cache.NewIndexer(cache.MetaNamespaceKeyFunc, cache.Indexers{}) + for _, pod := range pods { + podIndexer.Add(pod) + } + ctrl.podLister = corelisters.NewPodLister(podIndexer) + // Run the tested functions err = test.test(ctrl, reactor, test) if err != nil { diff --git a/pkg/controller/volume/persistentvolume/provision_test.go b/pkg/controller/volume/persistentvolume/provision_test.go index 15b8987090..4fa3cf2f36 100644 --- a/pkg/controller/volume/persistentvolume/provision_test.go +++ b/pkg/controller/volume/persistentvolume/provision_test.go @@ -416,7 +416,7 @@ func TestProvisionSync(t *testing.T) { noerrors, wrapTestWithProvisionCalls([]provisionCall{}, testSyncClaim), }, } - runSyncTests(t, tests, storageClasses) + runSyncTests(t, tests, storageClasses, []*v1.Pod{}) } // Test multiple calls to syncClaim/syncVolume and periodic sync of all diff --git a/pkg/controller/volume/persistentvolume/pv_controller.go b/pkg/controller/volume/persistentvolume/pv_controller.go index b65bcedb7a..4a3f5b7677 100644 --- a/pkg/controller/volume/persistentvolume/pv_controller.go +++ b/pkg/controller/volume/persistentvolume/pv_controller.go @@ -161,6 +161,8 @@ type PersistentVolumeController struct { claimListerSynced cache.InformerSynced classLister storagelisters.StorageClassLister classListerSynced cache.InformerSynced + podLister corelisters.PodLister + podListerSynced cache.InformerSynced kubeClient clientset.Interface eventRecorder record.EventRecorder diff --git a/pkg/controller/volume/persistentvolume/pv_controller_base.go b/pkg/controller/volume/persistentvolume/pv_controller_base.go index 2ba5d831cb..b9fb58fafc 100644 --- a/pkg/controller/volume/persistentvolume/pv_controller_base.go +++ b/pkg/controller/volume/persistentvolume/pv_controller_base.go @@ -61,6 +61,7 @@ type ControllerParameters struct { VolumeInformer coreinformers.PersistentVolumeInformer ClaimInformer coreinformers.PersistentVolumeClaimInformer ClassInformer storageinformers.StorageClassInformer + PodInformer coreinformers.PodInformer EventRecorder record.EventRecorder EnableDynamicProvisioning bool } @@ -118,6 +119,8 @@ func NewController(p ControllerParameters) (*PersistentVolumeController, error) controller.classLister = p.ClassInformer.Lister() controller.classListerSynced = p.ClassInformer.Informer().HasSynced + controller.podLister = p.PodInformer.Lister() + controller.podListerSynced = p.PodInformer.Informer().HasSynced return controller, nil } @@ -264,7 +267,7 @@ func (ctrl *PersistentVolumeController) Run(stopCh <-chan struct{}) { glog.Infof("Starting persistent volume controller") defer glog.Infof("Shutting down peristent volume controller") - if !controller.WaitForCacheSync("persistent volume", stopCh, ctrl.volumeListerSynced, ctrl.claimListerSynced, ctrl.classListerSynced) { + if !controller.WaitForCacheSync("persistent volume", stopCh, ctrl.volumeListerSynced, ctrl.claimListerSynced, ctrl.classListerSynced, ctrl.podListerSynced) { return } diff --git a/pkg/controller/volume/persistentvolume/recycle_test.go b/pkg/controller/volume/persistentvolume/recycle_test.go index 0ef075f624..80c4470394 100644 --- a/pkg/controller/volume/persistentvolume/recycle_test.go +++ b/pkg/controller/volume/persistentvolume/recycle_test.go @@ -161,7 +161,7 @@ func TestRecycleSync(t *testing.T) { []string{"Warning VolumeUnknownReclaimPolicy"}, noerrors, testSyncVolume, }, } - runSyncTests(t, tests, []*storage.StorageClass{}) + runSyncTests(t, tests, []*storage.StorageClass{}, []*v1.Pod{}) } // Test multiple calls to syncClaim/syncVolume and periodic sync of all diff --git a/test/integration/scheduler/local-pv-neg-affinity_test.go b/test/integration/scheduler/local-pv-neg-affinity_test.go index 42b01bb3d4..7cbf774253 100644 --- a/test/integration/scheduler/local-pv-neg-affinity_test.go +++ b/test/integration/scheduler/local-pv-neg-affinity_test.go @@ -136,6 +136,7 @@ func setupNodes(t *testing.T, nsName string, numberOfNodes int) *testConfig { VolumeInformer: informers.Core().V1().PersistentVolumes(), ClaimInformer: informers.Core().V1().PersistentVolumeClaims(), ClassInformer: informers.Storage().V1().StorageClasses(), + PodInformer: informers.Core().V1().Pods(), EventRecorder: nil, // TODO: add one so we can test PV events EnableDynamicProvisioning: true, } diff --git a/test/integration/volume/persistent_volumes_test.go b/test/integration/volume/persistent_volumes_test.go index aaa409d336..0739336f00 100644 --- a/test/integration/volume/persistent_volumes_test.go +++ b/test/integration/volume/persistent_volumes_test.go @@ -1135,6 +1135,7 @@ func createClients(ns *v1.Namespace, t *testing.T, s *httptest.Server, syncPerio VolumeInformer: informers.Core().V1().PersistentVolumes(), ClaimInformer: informers.Core().V1().PersistentVolumeClaims(), ClassInformer: informers.Storage().V1().StorageClasses(), + PodInformer: informers.Core().V1().Pods(), EnableDynamicProvisioning: true, }) if err != nil {