mirror of https://github.com/k3s-io/k3s
Merge pull request #78878 from msau42/automated-cherry-pick-of-#75129-upstream-release-1.14
Automated cherry pick of #75129: Move CSIDriver Lister to the controllerk3s-v1.14.4
commit
2ff91b0885
|
@ -224,6 +224,7 @@ func startAttachDetachController(ctx ControllerContext) (http.Handler, bool, err
|
||||||
ctx.InformerFactory.Core().V1().PersistentVolumeClaims(),
|
ctx.InformerFactory.Core().V1().PersistentVolumeClaims(),
|
||||||
ctx.InformerFactory.Core().V1().PersistentVolumes(),
|
ctx.InformerFactory.Core().V1().PersistentVolumes(),
|
||||||
ctx.InformerFactory.Storage().V1beta1().CSINodes(),
|
ctx.InformerFactory.Storage().V1beta1().CSINodes(),
|
||||||
|
ctx.InformerFactory.Storage().V1beta1().CSIDrivers(),
|
||||||
ctx.Cloud,
|
ctx.Cloud,
|
||||||
ProbeAttachableVolumePlugins(),
|
ProbeAttachableVolumePlugins(),
|
||||||
GetDynamicPluginProber(ctx.ComponentConfig.PersistentVolumeBinderController.VolumeConfiguration),
|
GetDynamicPluginProber(ctx.ComponentConfig.PersistentVolumeBinderController.VolumeConfiguration),
|
||||||
|
|
|
@ -106,6 +106,7 @@ func NewAttachDetachController(
|
||||||
pvcInformer coreinformers.PersistentVolumeClaimInformer,
|
pvcInformer coreinformers.PersistentVolumeClaimInformer,
|
||||||
pvInformer coreinformers.PersistentVolumeInformer,
|
pvInformer coreinformers.PersistentVolumeInformer,
|
||||||
csiNodeInformer storageinformers.CSINodeInformer,
|
csiNodeInformer storageinformers.CSINodeInformer,
|
||||||
|
csiDriverInformer storageinformers.CSIDriverInformer,
|
||||||
cloud cloudprovider.Interface,
|
cloud cloudprovider.Interface,
|
||||||
plugins []volume.VolumePlugin,
|
plugins []volume.VolumePlugin,
|
||||||
prober volume.DynamicPluginProber,
|
prober volume.DynamicPluginProber,
|
||||||
|
@ -147,6 +148,11 @@ func NewAttachDetachController(
|
||||||
adc.csiNodeSynced = csiNodeInformer.Informer().HasSynced
|
adc.csiNodeSynced = csiNodeInformer.Informer().HasSynced
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if utilfeature.DefaultFeatureGate.Enabled(features.CSIDriverRegistry) {
|
||||||
|
adc.csiDriverLister = csiDriverInformer.Lister()
|
||||||
|
adc.csiDriversSynced = csiDriverInformer.Informer().HasSynced
|
||||||
|
}
|
||||||
|
|
||||||
if err := adc.volumePluginMgr.InitPlugins(plugins, prober, adc); err != nil {
|
if err := adc.volumePluginMgr.InitPlugins(plugins, prober, adc); err != nil {
|
||||||
return nil, fmt.Errorf("Could not initialize volume plugins for Attach/Detach Controller: %+v", err)
|
return nil, fmt.Errorf("Could not initialize volume plugins for Attach/Detach Controller: %+v", err)
|
||||||
}
|
}
|
||||||
|
@ -271,6 +277,12 @@ type attachDetachController struct {
|
||||||
csiNodeLister storagelisters.CSINodeLister
|
csiNodeLister storagelisters.CSINodeLister
|
||||||
csiNodeSynced kcache.InformerSynced
|
csiNodeSynced kcache.InformerSynced
|
||||||
|
|
||||||
|
// csiDriverLister is the shared CSIDriver lister used to fetch and store
|
||||||
|
// CSIDriver objects from the API server. It is shared with other controllers
|
||||||
|
// and therefore the CSIDriver objects in its store should be treated as immutable.
|
||||||
|
csiDriverLister storagelisters.CSIDriverLister
|
||||||
|
csiDriversSynced kcache.InformerSynced
|
||||||
|
|
||||||
// cloud provider used by volume host
|
// cloud provider used by volume host
|
||||||
cloud cloudprovider.Interface
|
cloud cloudprovider.Interface
|
||||||
|
|
||||||
|
@ -327,6 +339,9 @@ func (adc *attachDetachController) Run(stopCh <-chan struct{}) {
|
||||||
if adc.csiNodeSynced != nil {
|
if adc.csiNodeSynced != nil {
|
||||||
synced = append(synced, adc.csiNodeSynced)
|
synced = append(synced, adc.csiNodeSynced)
|
||||||
}
|
}
|
||||||
|
if adc.csiDriversSynced != nil {
|
||||||
|
synced = append(synced, adc.csiDriversSynced)
|
||||||
|
}
|
||||||
|
|
||||||
if !controller.WaitForCacheSync("attach detach", stopCh, synced...) {
|
if !controller.WaitForCacheSync("attach detach", stopCh, synced...) {
|
||||||
return
|
return
|
||||||
|
@ -669,6 +684,10 @@ func (adc *attachDetachController) CSINodeLister() storagelisters.CSINodeLister
|
||||||
return adc.csiNodeLister
|
return adc.csiNodeLister
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (adc *attachDetachController) CSIDriverLister() storagelisters.CSIDriverLister {
|
||||||
|
return adc.csiDriverLister
|
||||||
|
}
|
||||||
|
|
||||||
func (adc *attachDetachController) IsAttachDetachController() bool {
|
func (adc *attachDetachController) IsAttachDetachController() bool {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
@ -793,3 +812,7 @@ func (adc *attachDetachController) GetSubpather() subpath.Interface {
|
||||||
// Subpaths not needed in attachdetach controller
|
// Subpaths not needed in attachdetach controller
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (adc *attachDetachController) GetCSIDriverLister() storagelisters.CSIDriverLister {
|
||||||
|
return adc.csiDriverLister
|
||||||
|
}
|
||||||
|
|
|
@ -45,6 +45,7 @@ func Test_NewAttachDetachController_Positive(t *testing.T) {
|
||||||
informerFactory.Core().V1().PersistentVolumeClaims(),
|
informerFactory.Core().V1().PersistentVolumeClaims(),
|
||||||
informerFactory.Core().V1().PersistentVolumes(),
|
informerFactory.Core().V1().PersistentVolumes(),
|
||||||
informerFactory.Storage().V1beta1().CSINodes(),
|
informerFactory.Storage().V1beta1().CSINodes(),
|
||||||
|
informerFactory.Storage().V1beta1().CSIDrivers(),
|
||||||
nil, /* cloud */
|
nil, /* cloud */
|
||||||
nil, /* plugins */
|
nil, /* plugins */
|
||||||
nil, /* prober */
|
nil, /* prober */
|
||||||
|
@ -220,6 +221,7 @@ func attachDetachRecoveryTestCase(t *testing.T, extraPods1 []*v1.Pod, extraPods2
|
||||||
informerFactory.Core().V1().PersistentVolumeClaims(),
|
informerFactory.Core().V1().PersistentVolumeClaims(),
|
||||||
informerFactory.Core().V1().PersistentVolumes(),
|
informerFactory.Core().V1().PersistentVolumes(),
|
||||||
informerFactory.Storage().V1beta1().CSINodes(),
|
informerFactory.Storage().V1beta1().CSINodes(),
|
||||||
|
informerFactory.Storage().V1beta1().CSIDrivers(),
|
||||||
nil, /* cloud */
|
nil, /* cloud */
|
||||||
plugins,
|
plugins,
|
||||||
prober,
|
prober,
|
||||||
|
|
|
@ -132,9 +132,11 @@ go_library(
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/validation:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/util/validation:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library",
|
||||||
"//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library",
|
"//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library",
|
||||||
|
"//staging/src/k8s.io/client-go/informers:go_default_library",
|
||||||
"//staging/src/k8s.io/client-go/kubernetes:go_default_library",
|
"//staging/src/k8s.io/client-go/kubernetes:go_default_library",
|
||||||
"//staging/src/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library",
|
"//staging/src/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library",
|
||||||
"//staging/src/k8s.io/client-go/listers/core/v1:go_default_library",
|
"//staging/src/k8s.io/client-go/listers/core/v1:go_default_library",
|
||||||
|
"//staging/src/k8s.io/client-go/listers/storage/v1beta1:go_default_library",
|
||||||
"//staging/src/k8s.io/client-go/tools/cache:go_default_library",
|
"//staging/src/k8s.io/client-go/tools/cache:go_default_library",
|
||||||
"//staging/src/k8s.io/client-go/tools/record:go_default_library",
|
"//staging/src/k8s.io/client-go/tools/record:go_default_library",
|
||||||
"//staging/src/k8s.io/client-go/util/certificate:go_default_library",
|
"//staging/src/k8s.io/client-go/util/certificate:go_default_library",
|
||||||
|
|
|
@ -26,8 +26,12 @@ import (
|
||||||
authenticationv1 "k8s.io/api/authentication/v1"
|
authenticationv1 "k8s.io/api/authentication/v1"
|
||||||
"k8s.io/api/core/v1"
|
"k8s.io/api/core/v1"
|
||||||
"k8s.io/apimachinery/pkg/types"
|
"k8s.io/apimachinery/pkg/types"
|
||||||
|
"k8s.io/apimachinery/pkg/util/wait"
|
||||||
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
||||||
|
"k8s.io/client-go/informers"
|
||||||
clientset "k8s.io/client-go/kubernetes"
|
clientset "k8s.io/client-go/kubernetes"
|
||||||
|
storagelisters "k8s.io/client-go/listers/storage/v1beta1"
|
||||||
|
"k8s.io/client-go/tools/cache"
|
||||||
"k8s.io/client-go/tools/record"
|
"k8s.io/client-go/tools/record"
|
||||||
cloudprovider "k8s.io/cloud-provider"
|
cloudprovider "k8s.io/cloud-provider"
|
||||||
"k8s.io/kubernetes/pkg/features"
|
"k8s.io/kubernetes/pkg/features"
|
||||||
|
@ -56,6 +60,24 @@ func NewInitializedVolumePluginMgr(
|
||||||
plugins []volume.VolumePlugin,
|
plugins []volume.VolumePlugin,
|
||||||
prober volume.DynamicPluginProber) (*volume.VolumePluginMgr, error) {
|
prober volume.DynamicPluginProber) (*volume.VolumePluginMgr, error) {
|
||||||
|
|
||||||
|
// Initialize csiDriverLister before calling InitPlugins
|
||||||
|
var informerFactory informers.SharedInformerFactory
|
||||||
|
var csiDriverLister storagelisters.CSIDriverLister
|
||||||
|
var csiDriversSynced cache.InformerSynced
|
||||||
|
const resyncPeriod = 0
|
||||||
|
if utilfeature.DefaultFeatureGate.Enabled(features.CSIDriverRegistry) {
|
||||||
|
// Don't initialize if kubeClient is nil
|
||||||
|
if kubelet.kubeClient != nil {
|
||||||
|
informerFactory = informers.NewSharedInformerFactory(kubelet.kubeClient, resyncPeriod)
|
||||||
|
csiDriverInformer := informerFactory.Storage().V1beta1().CSIDrivers()
|
||||||
|
csiDriverLister = csiDriverInformer.Lister()
|
||||||
|
csiDriversSynced = csiDriverInformer.Informer().HasSynced
|
||||||
|
|
||||||
|
} else {
|
||||||
|
klog.Warning("kubeClient is nil. Skip initialization of CSIDriverLister")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
mountPodManager, err := mountpod.NewManager(kubelet.getRootDir(), kubelet.podManager)
|
mountPodManager, err := mountpod.NewManager(kubelet.getRootDir(), kubelet.podManager)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -67,6 +89,9 @@ func NewInitializedVolumePluginMgr(
|
||||||
configMapManager: configMapManager,
|
configMapManager: configMapManager,
|
||||||
tokenManager: tokenManager,
|
tokenManager: tokenManager,
|
||||||
mountPodManager: mountPodManager,
|
mountPodManager: mountPodManager,
|
||||||
|
informerFactory: informerFactory,
|
||||||
|
csiDriverLister: csiDriverLister,
|
||||||
|
csiDriversSynced: csiDriversSynced,
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := kvh.volumePluginMgr.InitPlugins(plugins, prober, kvh); err != nil {
|
if err := kvh.volumePluginMgr.InitPlugins(plugins, prober, kvh); err != nil {
|
||||||
|
@ -93,6 +118,9 @@ type kubeletVolumeHost struct {
|
||||||
tokenManager *token.Manager
|
tokenManager *token.Manager
|
||||||
configMapManager configmap.Manager
|
configMapManager configmap.Manager
|
||||||
mountPodManager mountpod.Manager
|
mountPodManager mountpod.Manager
|
||||||
|
informerFactory informers.SharedInformerFactory
|
||||||
|
csiDriverLister storagelisters.CSIDriverLister
|
||||||
|
csiDriversSynced cache.InformerSynced
|
||||||
}
|
}
|
||||||
|
|
||||||
func (kvh *kubeletVolumeHost) SetKubeletError(err error) {
|
func (kvh *kubeletVolumeHost) SetKubeletError(err error) {
|
||||||
|
@ -131,6 +159,34 @@ func (kvh *kubeletVolumeHost) GetSubpather() subpath.Interface {
|
||||||
return kvh.kubelet.subpather
|
return kvh.kubelet.subpather
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (kvh *kubeletVolumeHost) GetInformerFactory() informers.SharedInformerFactory {
|
||||||
|
return kvh.informerFactory
|
||||||
|
}
|
||||||
|
|
||||||
|
func (kvh *kubeletVolumeHost) CSIDriverLister() storagelisters.CSIDriverLister {
|
||||||
|
return kvh.csiDriverLister
|
||||||
|
}
|
||||||
|
|
||||||
|
func (kvh *kubeletVolumeHost) CSIDriversSynced() cache.InformerSynced {
|
||||||
|
return kvh.csiDriversSynced
|
||||||
|
}
|
||||||
|
|
||||||
|
// WaitForCacheSync is a helper function that waits for cache sync for CSIDriverLister
|
||||||
|
func (kvh *kubeletVolumeHost) WaitForCacheSync() error {
|
||||||
|
if kvh.csiDriversSynced == nil {
|
||||||
|
klog.Error("csiDriversSynced not found on KubeletVolumeHost")
|
||||||
|
return fmt.Errorf("csiDriversSynced not found on KubeletVolumeHost")
|
||||||
|
}
|
||||||
|
|
||||||
|
synced := []cache.InformerSynced{kvh.csiDriversSynced}
|
||||||
|
if !cache.WaitForCacheSync(wait.NeverStop, synced...) {
|
||||||
|
klog.Warning("failed to wait for cache sync for CSIDriverLister")
|
||||||
|
return fmt.Errorf("failed to wait for cache sync for CSIDriverLister")
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (kvh *kubeletVolumeHost) NewWrapperMounter(
|
func (kvh *kubeletVolumeHost) NewWrapperMounter(
|
||||||
volName string,
|
volName string,
|
||||||
spec volume.Spec,
|
spec volume.Spec,
|
||||||
|
|
|
@ -250,6 +250,11 @@ func (vm *volumeManager) Run(sourcesReady config.SourcesReady, stopCh <-chan str
|
||||||
|
|
||||||
metrics.Register(vm.actualStateOfWorld, vm.desiredStateOfWorld, vm.volumePluginMgr)
|
metrics.Register(vm.actualStateOfWorld, vm.desiredStateOfWorld, vm.volumePluginMgr)
|
||||||
|
|
||||||
|
if vm.kubeClient != nil {
|
||||||
|
// start informer for CSIDriver
|
||||||
|
vm.volumePluginMgr.Run(stopCh)
|
||||||
|
}
|
||||||
|
|
||||||
<-stopCh
|
<-stopCh
|
||||||
klog.Infof("Shutting down Kubelet Volume Manager")
|
klog.Infof("Shutting down Kubelet Volume Manager")
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,6 +18,7 @@ go_library(
|
||||||
importpath = "k8s.io/kubernetes/pkg/volume",
|
importpath = "k8s.io/kubernetes/pkg/volume",
|
||||||
visibility = ["//visibility:public"],
|
visibility = ["//visibility:public"],
|
||||||
deps = [
|
deps = [
|
||||||
|
"//pkg/features:go_default_library",
|
||||||
"//pkg/util/mount:go_default_library",
|
"//pkg/util/mount:go_default_library",
|
||||||
"//pkg/volume/util/fs:go_default_library",
|
"//pkg/volume/util/fs:go_default_library",
|
||||||
"//pkg/volume/util/recyclerclient:go_default_library",
|
"//pkg/volume/util/recyclerclient:go_default_library",
|
||||||
|
@ -29,8 +30,11 @@ go_library(
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/types:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/types:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/validation:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/util/validation:go_default_library",
|
||||||
|
"//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library",
|
||||||
|
"//staging/src/k8s.io/client-go/informers:go_default_library",
|
||||||
"//staging/src/k8s.io/client-go/kubernetes:go_default_library",
|
"//staging/src/k8s.io/client-go/kubernetes:go_default_library",
|
||||||
"//staging/src/k8s.io/client-go/listers/storage/v1beta1:go_default_library",
|
"//staging/src/k8s.io/client-go/listers/storage/v1beta1:go_default_library",
|
||||||
|
"//staging/src/k8s.io/client-go/tools/cache:go_default_library",
|
||||||
"//staging/src/k8s.io/client-go/tools/record:go_default_library",
|
"//staging/src/k8s.io/client-go/tools/record:go_default_library",
|
||||||
"//staging/src/k8s.io/cloud-provider:go_default_library",
|
"//staging/src/k8s.io/cloud-provider:go_default_library",
|
||||||
"//vendor/k8s.io/klog:go_default_library",
|
"//vendor/k8s.io/klog:go_default_library",
|
||||||
|
|
|
@ -31,8 +31,6 @@ go_library(
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library",
|
||||||
"//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library",
|
"//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library",
|
||||||
"//staging/src/k8s.io/client-go/informers:go_default_library",
|
|
||||||
"//staging/src/k8s.io/client-go/informers/storage/v1beta1:go_default_library",
|
|
||||||
"//staging/src/k8s.io/client-go/kubernetes:go_default_library",
|
"//staging/src/k8s.io/client-go/kubernetes:go_default_library",
|
||||||
"//staging/src/k8s.io/client-go/listers/storage/v1beta1:go_default_library",
|
"//staging/src/k8s.io/client-go/listers/storage/v1beta1:go_default_library",
|
||||||
"//staging/src/k8s.io/csi-translation-lib/plugins:go_default_library",
|
"//staging/src/k8s.io/csi-translation-lib/plugins:go_default_library",
|
||||||
|
@ -73,6 +71,7 @@ go_test(
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library",
|
||||||
"//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library",
|
"//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library",
|
||||||
"//staging/src/k8s.io/apiserver/pkg/util/feature/testing:go_default_library",
|
"//staging/src/k8s.io/apiserver/pkg/util/feature/testing:go_default_library",
|
||||||
|
"//staging/src/k8s.io/client-go/informers:go_default_library",
|
||||||
"//staging/src/k8s.io/client-go/kubernetes:go_default_library",
|
"//staging/src/k8s.io/client-go/kubernetes:go_default_library",
|
||||||
"//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library",
|
"//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library",
|
||||||
"//staging/src/k8s.io/client-go/testing:go_default_library",
|
"//staging/src/k8s.io/client-go/testing:go_default_library",
|
||||||
|
|
|
@ -33,6 +33,7 @@ import (
|
||||||
"k8s.io/apimachinery/pkg/watch"
|
"k8s.io/apimachinery/pkg/watch"
|
||||||
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
||||||
utilfeaturetesting "k8s.io/apiserver/pkg/util/feature/testing"
|
utilfeaturetesting "k8s.io/apiserver/pkg/util/feature/testing"
|
||||||
|
"k8s.io/client-go/informers"
|
||||||
clientset "k8s.io/client-go/kubernetes"
|
clientset "k8s.io/client-go/kubernetes"
|
||||||
fakeclient "k8s.io/client-go/kubernetes/fake"
|
fakeclient "k8s.io/client-go/kubernetes/fake"
|
||||||
core "k8s.io/client-go/testing"
|
core "k8s.io/client-go/testing"
|
||||||
|
@ -1435,12 +1436,20 @@ func newTestWatchPlugin(t *testing.T, fakeClient *fakeclient.Clientset) (*csiPlu
|
||||||
fakeClient = fakeclient.NewSimpleClientset()
|
fakeClient = fakeclient.NewSimpleClientset()
|
||||||
}
|
}
|
||||||
fakeWatcher := watch.NewRaceFreeFake()
|
fakeWatcher := watch.NewRaceFreeFake()
|
||||||
fakeClient.Fake.AddWatchReactor("*", core.DefaultWatchReactor(fakeWatcher, nil))
|
fakeClient.Fake.PrependWatchReactor("volumeattachments", core.DefaultWatchReactor(fakeWatcher, nil))
|
||||||
|
|
||||||
|
// Start informer for CSIDrivers.
|
||||||
|
factory := informers.NewSharedInformerFactory(fakeClient, csiResyncPeriod)
|
||||||
|
csiDriverInformer := factory.Storage().V1beta1().CSIDrivers()
|
||||||
|
csiDriverLister := csiDriverInformer.Lister()
|
||||||
|
go factory.Start(wait.NeverStop)
|
||||||
|
|
||||||
host := volumetest.NewFakeVolumeHostWithCSINodeName(
|
host := volumetest.NewFakeVolumeHostWithCSINodeName(
|
||||||
tmpDir,
|
tmpDir,
|
||||||
fakeClient,
|
fakeClient,
|
||||||
nil,
|
nil,
|
||||||
"node",
|
"node",
|
||||||
|
csiDriverLister,
|
||||||
)
|
)
|
||||||
plugMgr := &volume.VolumePluginMgr{}
|
plugMgr := &volume.VolumePluginMgr{}
|
||||||
plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, host)
|
plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, host)
|
||||||
|
@ -1458,7 +1467,7 @@ func newTestWatchPlugin(t *testing.T, fakeClient *fakeclient.Clientset) (*csiPlu
|
||||||
if utilfeature.DefaultFeatureGate.Enabled(features.CSIDriverRegistry) {
|
if utilfeature.DefaultFeatureGate.Enabled(features.CSIDriverRegistry) {
|
||||||
// Wait until the informer in CSI volume plugin has all CSIDrivers.
|
// Wait until the informer in CSI volume plugin has all CSIDrivers.
|
||||||
wait.PollImmediate(testInformerSyncPeriod, testInformerSyncTimeout, func() (bool, error) {
|
wait.PollImmediate(testInformerSyncPeriod, testInformerSyncTimeout, func() (bool, error) {
|
||||||
return csiPlug.csiDriverInformer.Informer().HasSynced(), nil
|
return csiDriverInformer.Informer().HasSynced(), nil
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -216,6 +216,7 @@ func TestBlockMapperSetupDevice(t *testing.T) {
|
||||||
fakeClient,
|
fakeClient,
|
||||||
nil,
|
nil,
|
||||||
"fakeNode",
|
"fakeNode",
|
||||||
|
nil,
|
||||||
)
|
)
|
||||||
plug.host = host
|
plug.host = host
|
||||||
|
|
||||||
|
@ -282,6 +283,7 @@ func TestBlockMapperMapDevice(t *testing.T) {
|
||||||
fakeClient,
|
fakeClient,
|
||||||
nil,
|
nil,
|
||||||
"fakeNode",
|
"fakeNode",
|
||||||
|
nil,
|
||||||
)
|
)
|
||||||
plug.host = host
|
plug.host = host
|
||||||
|
|
||||||
|
@ -364,6 +366,7 @@ func TestBlockMapperTearDownDevice(t *testing.T) {
|
||||||
fakeClient,
|
fakeClient,
|
||||||
nil,
|
nil,
|
||||||
"fakeNode",
|
"fakeNode",
|
||||||
|
nil,
|
||||||
)
|
)
|
||||||
plug.host = host
|
plug.host = host
|
||||||
|
|
||||||
|
|
|
@ -19,7 +19,6 @@ package csi
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"crypto/sha256"
|
"crypto/sha256"
|
||||||
"errors"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"path"
|
"path"
|
||||||
|
@ -292,8 +291,14 @@ func (c *csiMountMgr) podAttributes() (map[string]string, error) {
|
||||||
if !utilfeature.DefaultFeatureGate.Enabled(features.CSIDriverRegistry) {
|
if !utilfeature.DefaultFeatureGate.Enabled(features.CSIDriverRegistry) {
|
||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
kletHost, ok := c.plugin.host.(volume.KubeletVolumeHost)
|
||||||
|
if ok {
|
||||||
|
kletHost.WaitForCacheSync()
|
||||||
|
}
|
||||||
|
|
||||||
if c.plugin.csiDriverLister == nil {
|
if c.plugin.csiDriverLister == nil {
|
||||||
return nil, errors.New("CSIDriver lister does not exist")
|
return nil, fmt.Errorf("CSIDriverLister not found")
|
||||||
}
|
}
|
||||||
|
|
||||||
csiDriver, err := c.plugin.csiDriverLister.Get(string(c.driverName))
|
csiDriver, err := c.plugin.csiDriverLister.Get(string(c.driverName))
|
||||||
|
|
|
@ -33,7 +33,6 @@ import (
|
||||||
storagev1beta1 "k8s.io/api/storage/v1beta1"
|
storagev1beta1 "k8s.io/api/storage/v1beta1"
|
||||||
meta "k8s.io/apimachinery/pkg/apis/meta/v1"
|
meta "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/apimachinery/pkg/types"
|
"k8s.io/apimachinery/pkg/types"
|
||||||
"k8s.io/apimachinery/pkg/util/wait"
|
|
||||||
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
||||||
utilfeaturetesting "k8s.io/apiserver/pkg/util/feature/testing"
|
utilfeaturetesting "k8s.io/apiserver/pkg/util/feature/testing"
|
||||||
fakeclient "k8s.io/client-go/kubernetes/fake"
|
fakeclient "k8s.io/client-go/kubernetes/fake"
|
||||||
|
@ -155,13 +154,6 @@ func MounterSetUpTests(t *testing.T, podInfoEnabled bool) {
|
||||||
plug, tmpDir := newTestPlugin(t, fakeClient)
|
plug, tmpDir := newTestPlugin(t, fakeClient)
|
||||||
defer os.RemoveAll(tmpDir)
|
defer os.RemoveAll(tmpDir)
|
||||||
|
|
||||||
if utilfeature.DefaultFeatureGate.Enabled(features.CSIDriverRegistry) {
|
|
||||||
// Wait until the informer in CSI volume plugin has all CSIDrivers.
|
|
||||||
wait.PollImmediate(testInformerSyncPeriod, testInformerSyncTimeout, func() (bool, error) {
|
|
||||||
return plug.csiDriverInformer.Informer().HasSynced(), nil
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
registerFakePlugin(test.driver, "endpoint", []string{"1.0.0"}, t)
|
registerFakePlugin(test.driver, "endpoint", []string{"1.0.0"}, t)
|
||||||
pv := makeTestPV("test-pv", 10, test.driver, testVol)
|
pv := makeTestPV("test-pv", 10, test.driver, testVol)
|
||||||
pv.Spec.CSI.VolumeAttributes = test.volumeContext
|
pv.Spec.CSI.VolumeAttributes = test.volumeContext
|
||||||
|
@ -391,6 +383,7 @@ func TestMounterSetUpSimple(t *testing.T) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestMounterSetUpWithInline(t *testing.T) {
|
func TestMounterSetUpWithInline(t *testing.T) {
|
||||||
defer utilfeaturetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.CSIInlineVolume, true)()
|
defer utilfeaturetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.CSIInlineVolume, true)()
|
||||||
|
|
||||||
|
@ -527,6 +520,7 @@ func TestMounterSetUpWithInline(t *testing.T) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestMounterSetUpWithFSGroup(t *testing.T) {
|
func TestMounterSetUpWithFSGroup(t *testing.T) {
|
||||||
fakeClient := fakeclient.NewSimpleClientset()
|
fakeClient := fakeclient.NewSimpleClientset()
|
||||||
plug, tmpDir := newTestPlugin(t, fakeClient)
|
plug, tmpDir := newTestPlugin(t, fakeClient)
|
||||||
|
|
|
@ -37,10 +37,8 @@ import (
|
||||||
utilversion "k8s.io/apimachinery/pkg/util/version"
|
utilversion "k8s.io/apimachinery/pkg/util/version"
|
||||||
"k8s.io/apimachinery/pkg/util/wait"
|
"k8s.io/apimachinery/pkg/util/wait"
|
||||||
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
||||||
csiapiinformer "k8s.io/client-go/informers"
|
|
||||||
csiinformer "k8s.io/client-go/informers/storage/v1beta1"
|
|
||||||
clientset "k8s.io/client-go/kubernetes"
|
clientset "k8s.io/client-go/kubernetes"
|
||||||
csilister "k8s.io/client-go/listers/storage/v1beta1"
|
storagelisters "k8s.io/client-go/listers/storage/v1beta1"
|
||||||
csitranslationplugins "k8s.io/csi-translation-lib/plugins"
|
csitranslationplugins "k8s.io/csi-translation-lib/plugins"
|
||||||
"k8s.io/kubernetes/pkg/features"
|
"k8s.io/kubernetes/pkg/features"
|
||||||
"k8s.io/kubernetes/pkg/volume"
|
"k8s.io/kubernetes/pkg/volume"
|
||||||
|
@ -68,10 +66,9 @@ const (
|
||||||
var deprecatedSocketDirVersions = []string{"0.1.0", "0.2.0", "0.3.0", "0.4.0"}
|
var deprecatedSocketDirVersions = []string{"0.1.0", "0.2.0", "0.3.0", "0.4.0"}
|
||||||
|
|
||||||
type csiPlugin struct {
|
type csiPlugin struct {
|
||||||
host volume.VolumeHost
|
host volume.VolumeHost
|
||||||
blockEnabled bool
|
blockEnabled bool
|
||||||
csiDriverLister csilister.CSIDriverLister
|
csiDriverLister storagelisters.CSIDriverLister
|
||||||
csiDriverInformer csiinformer.CSIDriverInformer
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO (vladimirvivien) add this type to storage api
|
//TODO (vladimirvivien) add this type to storage api
|
||||||
|
@ -217,11 +214,21 @@ func (p *csiPlugin) Init(host volume.VolumeHost) error {
|
||||||
if csiClient == nil {
|
if csiClient == nil {
|
||||||
klog.Warning(log("kubeclient not set, assuming standalone kubelet"))
|
klog.Warning(log("kubeclient not set, assuming standalone kubelet"))
|
||||||
} else {
|
} else {
|
||||||
// Start informer for CSIDrivers.
|
// set CSIDriverLister
|
||||||
factory := csiapiinformer.NewSharedInformerFactory(csiClient, csiResyncPeriod)
|
adcHost, ok := host.(volume.AttachDetachVolumeHost)
|
||||||
p.csiDriverInformer = factory.Storage().V1beta1().CSIDrivers()
|
if ok {
|
||||||
p.csiDriverLister = p.csiDriverInformer.Lister()
|
p.csiDriverLister = adcHost.CSIDriverLister()
|
||||||
go factory.Start(wait.NeverStop)
|
if p.csiDriverLister == nil {
|
||||||
|
klog.Error(log("CSIDriverLister not found on AttachDetachVolumeHost"))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
kletHost, ok := host.(volume.KubeletVolumeHost)
|
||||||
|
if ok {
|
||||||
|
p.csiDriverLister = kletHost.CSIDriverLister()
|
||||||
|
if p.csiDriverLister == nil {
|
||||||
|
klog.Error(log("CSIDriverLister not found on KubeletVolumeHost"))
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -752,6 +759,12 @@ func (p *csiPlugin) skipAttach(driver string) (bool, error) {
|
||||||
if !utilfeature.DefaultFeatureGate.Enabled(features.CSIDriverRegistry) {
|
if !utilfeature.DefaultFeatureGate.Enabled(features.CSIDriverRegistry) {
|
||||||
return false, nil
|
return false, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
kletHost, ok := p.host.(volume.KubeletVolumeHost)
|
||||||
|
if ok {
|
||||||
|
kletHost.WaitForCacheSync()
|
||||||
|
}
|
||||||
|
|
||||||
if p.csiDriverLister == nil {
|
if p.csiDriverLister == nil {
|
||||||
return false, errors.New("CSIDriver lister does not exist")
|
return false, errors.New("CSIDriver lister does not exist")
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,6 +31,7 @@ import (
|
||||||
"k8s.io/apimachinery/pkg/util/wait"
|
"k8s.io/apimachinery/pkg/util/wait"
|
||||||
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
||||||
utilfeaturetesting "k8s.io/apiserver/pkg/util/feature/testing"
|
utilfeaturetesting "k8s.io/apiserver/pkg/util/feature/testing"
|
||||||
|
"k8s.io/client-go/informers"
|
||||||
fakeclient "k8s.io/client-go/kubernetes/fake"
|
fakeclient "k8s.io/client-go/kubernetes/fake"
|
||||||
utiltesting "k8s.io/client-go/util/testing"
|
utiltesting "k8s.io/client-go/util/testing"
|
||||||
"k8s.io/kubernetes/pkg/features"
|
"k8s.io/kubernetes/pkg/features"
|
||||||
|
@ -48,11 +49,19 @@ func newTestPlugin(t *testing.T, client *fakeclient.Clientset) (*csiPlugin, stri
|
||||||
if client == nil {
|
if client == nil {
|
||||||
client = fakeclient.NewSimpleClientset()
|
client = fakeclient.NewSimpleClientset()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Start informer for CSIDrivers.
|
||||||
|
factory := informers.NewSharedInformerFactory(client, csiResyncPeriod)
|
||||||
|
csiDriverInformer := factory.Storage().V1beta1().CSIDrivers()
|
||||||
|
csiDriverLister := csiDriverInformer.Lister()
|
||||||
|
go factory.Start(wait.NeverStop)
|
||||||
|
|
||||||
host := volumetest.NewFakeVolumeHostWithCSINodeName(
|
host := volumetest.NewFakeVolumeHostWithCSINodeName(
|
||||||
tmpDir,
|
tmpDir,
|
||||||
client,
|
client,
|
||||||
nil,
|
nil,
|
||||||
"fakeNode",
|
"fakeNode",
|
||||||
|
csiDriverLister,
|
||||||
)
|
)
|
||||||
plugMgr := &volume.VolumePluginMgr{}
|
plugMgr := &volume.VolumePluginMgr{}
|
||||||
plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, host)
|
plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, host)
|
||||||
|
@ -70,7 +79,7 @@ func newTestPlugin(t *testing.T, client *fakeclient.Clientset) (*csiPlugin, stri
|
||||||
if utilfeature.DefaultFeatureGate.Enabled(features.CSIDriverRegistry) {
|
if utilfeature.DefaultFeatureGate.Enabled(features.CSIDriverRegistry) {
|
||||||
// Wait until the informer in CSI volume plugin has all CSIDrivers.
|
// Wait until the informer in CSI volume plugin has all CSIDrivers.
|
||||||
wait.PollImmediate(testInformerSyncPeriod, testInformerSyncTimeout, func() (bool, error) {
|
wait.PollImmediate(testInformerSyncPeriod, testInformerSyncTimeout, func() (bool, error) {
|
||||||
return csiPlug.csiDriverInformer.Informer().HasSynced(), nil
|
return csiDriverInformer.Informer().HasSynced(), nil
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -740,6 +740,7 @@ func TestInstallCSIDriverExistingAnnotation(t *testing.T) {
|
||||||
client,
|
client,
|
||||||
nil,
|
nil,
|
||||||
nodeName,
|
nodeName,
|
||||||
|
nil,
|
||||||
)
|
)
|
||||||
|
|
||||||
nim := NewNodeInfoManager(types.NodeName(nodeName), host, nil)
|
nim := NewNodeInfoManager(types.NodeName(nodeName), host, nil)
|
||||||
|
@ -799,6 +800,7 @@ func test(t *testing.T, addNodeInfo bool, csiNodeInfoEnabled bool, testcases []t
|
||||||
client,
|
client,
|
||||||
nil,
|
nil,
|
||||||
nodeName,
|
nodeName,
|
||||||
|
nil,
|
||||||
)
|
)
|
||||||
nim := NewNodeInfoManager(types.NodeName(nodeName), host, nil)
|
nim := NewNodeInfoManager(types.NodeName(nodeName), host, nil)
|
||||||
|
|
||||||
|
|
|
@ -29,11 +29,15 @@ import (
|
||||||
"k8s.io/apimachinery/pkg/types"
|
"k8s.io/apimachinery/pkg/types"
|
||||||
utilerrors "k8s.io/apimachinery/pkg/util/errors"
|
utilerrors "k8s.io/apimachinery/pkg/util/errors"
|
||||||
"k8s.io/apimachinery/pkg/util/validation"
|
"k8s.io/apimachinery/pkg/util/validation"
|
||||||
|
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
||||||
|
"k8s.io/client-go/informers"
|
||||||
clientset "k8s.io/client-go/kubernetes"
|
clientset "k8s.io/client-go/kubernetes"
|
||||||
storagelisters "k8s.io/client-go/listers/storage/v1beta1"
|
storagelisters "k8s.io/client-go/listers/storage/v1beta1"
|
||||||
|
"k8s.io/client-go/tools/cache"
|
||||||
"k8s.io/client-go/tools/record"
|
"k8s.io/client-go/tools/record"
|
||||||
cloudprovider "k8s.io/cloud-provider"
|
cloudprovider "k8s.io/cloud-provider"
|
||||||
"k8s.io/klog"
|
"k8s.io/klog"
|
||||||
|
"k8s.io/kubernetes/pkg/features"
|
||||||
"k8s.io/kubernetes/pkg/util/mount"
|
"k8s.io/kubernetes/pkg/util/mount"
|
||||||
"k8s.io/kubernetes/pkg/volume/util/recyclerclient"
|
"k8s.io/kubernetes/pkg/volume/util/recyclerclient"
|
||||||
"k8s.io/kubernetes/pkg/volume/util/subpath"
|
"k8s.io/kubernetes/pkg/volume/util/subpath"
|
||||||
|
@ -319,6 +323,15 @@ type KubeletVolumeHost interface {
|
||||||
// SetKubeletError lets plugins set an error on the Kubelet runtime status
|
// SetKubeletError lets plugins set an error on the Kubelet runtime status
|
||||||
// that will cause the Kubelet to post NotReady status with the error message provided
|
// that will cause the Kubelet to post NotReady status with the error message provided
|
||||||
SetKubeletError(err error)
|
SetKubeletError(err error)
|
||||||
|
|
||||||
|
// GetInformerFactory returns the informer factory for CSIDriverLister
|
||||||
|
GetInformerFactory() informers.SharedInformerFactory
|
||||||
|
// CSIDriverLister returns the informer lister for the CSIDriver API Object
|
||||||
|
CSIDriverLister() storagelisters.CSIDriverLister
|
||||||
|
// CSIDriverSynced returns the informer synced for the CSIDriver API Object
|
||||||
|
CSIDriversSynced() cache.InformerSynced
|
||||||
|
// WaitForCacheSync is a helper function that waits for cache sync for CSIDriverLister
|
||||||
|
WaitForCacheSync() error
|
||||||
}
|
}
|
||||||
|
|
||||||
// AttachDetachVolumeHost is a AttachDetach Controller specific interface that plugins can use
|
// AttachDetachVolumeHost is a AttachDetach Controller specific interface that plugins can use
|
||||||
|
@ -327,6 +340,9 @@ type AttachDetachVolumeHost interface {
|
||||||
// CSINodeLister returns the informer lister for the CSINode API Object
|
// CSINodeLister returns the informer lister for the CSINode API Object
|
||||||
CSINodeLister() storagelisters.CSINodeLister
|
CSINodeLister() storagelisters.CSINodeLister
|
||||||
|
|
||||||
|
// CSIDriverLister returns the informer lister for the CSIDriver API Object
|
||||||
|
CSIDriverLister() storagelisters.CSIDriverLister
|
||||||
|
|
||||||
// IsAttachDetachController is an interface marker to strictly tie AttachDetachVolumeHost
|
// IsAttachDetachController is an interface marker to strictly tie AttachDetachVolumeHost
|
||||||
// to the attachDetachController
|
// to the attachDetachController
|
||||||
IsAttachDetachController() bool
|
IsAttachDetachController() bool
|
||||||
|
@ -1004,6 +1020,17 @@ func (pm *VolumePluginMgr) FindNodeExpandablePluginByName(name string) (NodeExpa
|
||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (pm *VolumePluginMgr) Run(stopCh <-chan struct{}) {
|
||||||
|
kletHost, ok := pm.Host.(KubeletVolumeHost)
|
||||||
|
if ok {
|
||||||
|
// start informer for CSIDriver
|
||||||
|
if utilfeature.DefaultFeatureGate.Enabled(features.CSIDriverRegistry) {
|
||||||
|
informerFactory := kletHost.GetInformerFactory()
|
||||||
|
go informerFactory.Start(stopCh)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// NewPersistentVolumeRecyclerPodTemplate creates a template for a recycler
|
// NewPersistentVolumeRecyclerPodTemplate creates a template for a recycler
|
||||||
// pod. By default, a recycler pod simply runs "rm -rf" on a volume and tests
|
// pod. By default, a recycler pod simply runs "rm -rf" on a volume and tests
|
||||||
// for emptiness. Most attributes of the template will be correct for most
|
// for emptiness. Most attributes of the template will be correct for most
|
||||||
|
|
|
@ -26,6 +26,7 @@ go_library(
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/types:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/types:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library",
|
||||||
"//staging/src/k8s.io/client-go/kubernetes:go_default_library",
|
"//staging/src/k8s.io/client-go/kubernetes:go_default_library",
|
||||||
|
"//staging/src/k8s.io/client-go/listers/storage/v1beta1:go_default_library",
|
||||||
"//staging/src/k8s.io/client-go/tools/record:go_default_library",
|
"//staging/src/k8s.io/client-go/tools/record:go_default_library",
|
||||||
"//staging/src/k8s.io/client-go/util/testing:go_default_library",
|
"//staging/src/k8s.io/client-go/util/testing:go_default_library",
|
||||||
"//staging/src/k8s.io/cloud-provider:go_default_library",
|
"//staging/src/k8s.io/cloud-provider:go_default_library",
|
||||||
|
|
|
@ -34,6 +34,7 @@ import (
|
||||||
"k8s.io/apimachinery/pkg/types"
|
"k8s.io/apimachinery/pkg/types"
|
||||||
"k8s.io/apimachinery/pkg/util/uuid"
|
"k8s.io/apimachinery/pkg/util/uuid"
|
||||||
clientset "k8s.io/client-go/kubernetes"
|
clientset "k8s.io/client-go/kubernetes"
|
||||||
|
storagelisters "k8s.io/client-go/listers/storage/v1beta1"
|
||||||
"k8s.io/client-go/tools/record"
|
"k8s.io/client-go/tools/record"
|
||||||
utiltesting "k8s.io/client-go/util/testing"
|
utiltesting "k8s.io/client-go/util/testing"
|
||||||
cloudprovider "k8s.io/cloud-provider"
|
cloudprovider "k8s.io/cloud-provider"
|
||||||
|
@ -62,17 +63,21 @@ const (
|
||||||
|
|
||||||
// fakeVolumeHost is useful for testing volume plugins.
|
// fakeVolumeHost is useful for testing volume plugins.
|
||||||
type fakeVolumeHost struct {
|
type fakeVolumeHost struct {
|
||||||
rootDir string
|
rootDir string
|
||||||
kubeClient clientset.Interface
|
kubeClient clientset.Interface
|
||||||
pluginMgr VolumePluginMgr
|
pluginMgr VolumePluginMgr
|
||||||
cloud cloudprovider.Interface
|
cloud cloudprovider.Interface
|
||||||
mounter mount.Interface
|
mounter mount.Interface
|
||||||
exec mount.Exec
|
exec mount.Exec
|
||||||
nodeLabels map[string]string
|
nodeLabels map[string]string
|
||||||
nodeName string
|
nodeName string
|
||||||
subpather subpath.Interface
|
subpather subpath.Interface
|
||||||
|
csiDriverLister storagelisters.CSIDriverLister
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var _ VolumeHost = &fakeVolumeHost{}
|
||||||
|
var _ AttachDetachVolumeHost = &fakeVolumeHost{}
|
||||||
|
|
||||||
func NewFakeVolumeHost(rootDir string, kubeClient clientset.Interface, plugins []VolumePlugin) *fakeVolumeHost {
|
func NewFakeVolumeHost(rootDir string, kubeClient clientset.Interface, plugins []VolumePlugin) *fakeVolumeHost {
|
||||||
return newFakeVolumeHost(rootDir, kubeClient, plugins, nil, nil)
|
return newFakeVolumeHost(rootDir, kubeClient, plugins, nil, nil)
|
||||||
}
|
}
|
||||||
|
@ -87,9 +92,12 @@ func NewFakeVolumeHostWithNodeLabels(rootDir string, kubeClient clientset.Interf
|
||||||
return volHost
|
return volHost
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewFakeVolumeHostWithCSINodeName(rootDir string, kubeClient clientset.Interface, plugins []VolumePlugin, nodeName string) *fakeVolumeHost {
|
func NewFakeVolumeHostWithCSINodeName(rootDir string, kubeClient clientset.Interface, plugins []VolumePlugin, nodeName string, driverLister storagelisters.CSIDriverLister) *fakeVolumeHost {
|
||||||
volHost := newFakeVolumeHost(rootDir, kubeClient, plugins, nil, nil)
|
volHost := newFakeVolumeHost(rootDir, kubeClient, plugins, nil, nil)
|
||||||
volHost.nodeName = nodeName
|
volHost.nodeName = nodeName
|
||||||
|
if driverLister != nil {
|
||||||
|
volHost.csiDriverLister = driverLister
|
||||||
|
}
|
||||||
return volHost
|
return volHost
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1469,3 +1477,16 @@ func ContainsAccessMode(modes []v1.PersistentVolumeAccessMode, mode v1.Persisten
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (f *fakeVolumeHost) CSIDriverLister() storagelisters.CSIDriverLister {
|
||||||
|
return f.csiDriverLister
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *fakeVolumeHost) CSINodeLister() storagelisters.CSINodeLister {
|
||||||
|
// not needed for testing
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *fakeVolumeHost) IsAttachDetachController() bool {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
|
@ -21,6 +21,7 @@ go_test(
|
||||||
"//pkg/controller/volume/attachdetach/cache:go_default_library",
|
"//pkg/controller/volume/attachdetach/cache:go_default_library",
|
||||||
"//pkg/controller/volume/persistentvolume:go_default_library",
|
"//pkg/controller/volume/persistentvolume:go_default_library",
|
||||||
"//pkg/controller/volume/persistentvolume/options:go_default_library",
|
"//pkg/controller/volume/persistentvolume/options:go_default_library",
|
||||||
|
"//pkg/features:go_default_library",
|
||||||
"//pkg/volume:go_default_library",
|
"//pkg/volume:go_default_library",
|
||||||
"//pkg/volume/testing:go_default_library",
|
"//pkg/volume/testing:go_default_library",
|
||||||
"//pkg/volume/util:go_default_library",
|
"//pkg/volume/util:go_default_library",
|
||||||
|
@ -31,6 +32,7 @@ go_test(
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library",
|
||||||
|
"//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library",
|
||||||
"//staging/src/k8s.io/client-go/informers:go_default_library",
|
"//staging/src/k8s.io/client-go/informers:go_default_library",
|
||||||
"//staging/src/k8s.io/client-go/kubernetes:go_default_library",
|
"//staging/src/k8s.io/client-go/kubernetes:go_default_library",
|
||||||
"//staging/src/k8s.io/client-go/rest:go_default_library",
|
"//staging/src/k8s.io/client-go/rest:go_default_library",
|
||||||
|
|
|
@ -27,7 +27,8 @@ import (
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||||
"k8s.io/apimachinery/pkg/util/wait"
|
"k8s.io/apimachinery/pkg/util/wait"
|
||||||
"k8s.io/client-go/informers"
|
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
||||||
|
clientgoinformers "k8s.io/client-go/informers"
|
||||||
clientset "k8s.io/client-go/kubernetes"
|
clientset "k8s.io/client-go/kubernetes"
|
||||||
restclient "k8s.io/client-go/rest"
|
restclient "k8s.io/client-go/rest"
|
||||||
"k8s.io/client-go/tools/cache"
|
"k8s.io/client-go/tools/cache"
|
||||||
|
@ -36,6 +37,7 @@ import (
|
||||||
volumecache "k8s.io/kubernetes/pkg/controller/volume/attachdetach/cache"
|
volumecache "k8s.io/kubernetes/pkg/controller/volume/attachdetach/cache"
|
||||||
"k8s.io/kubernetes/pkg/controller/volume/persistentvolume"
|
"k8s.io/kubernetes/pkg/controller/volume/persistentvolume"
|
||||||
persistentvolumeoptions "k8s.io/kubernetes/pkg/controller/volume/persistentvolume/options"
|
persistentvolumeoptions "k8s.io/kubernetes/pkg/controller/volume/persistentvolume/options"
|
||||||
|
"k8s.io/kubernetes/pkg/features"
|
||||||
"k8s.io/kubernetes/pkg/volume"
|
"k8s.io/kubernetes/pkg/volume"
|
||||||
volumetest "k8s.io/kubernetes/pkg/volume/testing"
|
volumetest "k8s.io/kubernetes/pkg/volume/testing"
|
||||||
"k8s.io/kubernetes/pkg/volume/util"
|
"k8s.io/kubernetes/pkg/volume/util"
|
||||||
|
@ -179,6 +181,7 @@ func TestPodDeletionWithDswp(t *testing.T) {
|
||||||
stopCh := make(chan struct{})
|
stopCh := make(chan struct{})
|
||||||
go informers.Core().V1().PersistentVolumeClaims().Informer().Run(stopCh)
|
go informers.Core().V1().PersistentVolumeClaims().Informer().Run(stopCh)
|
||||||
go informers.Core().V1().PersistentVolumes().Informer().Run(stopCh)
|
go informers.Core().V1().PersistentVolumes().Informer().Run(stopCh)
|
||||||
|
initCSIObjects(stopCh, informers)
|
||||||
go ctrl.Run(stopCh)
|
go ctrl.Run(stopCh)
|
||||||
|
|
||||||
waitToObservePods(t, podInformer, 1)
|
waitToObservePods(t, podInformer, 1)
|
||||||
|
@ -207,6 +210,16 @@ func TestPodDeletionWithDswp(t *testing.T) {
|
||||||
close(stopCh)
|
close(stopCh)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func initCSIObjects(stopCh chan struct{}, informers clientgoinformers.SharedInformerFactory) {
|
||||||
|
if utilfeature.DefaultFeatureGate.Enabled(features.CSIMigration) &&
|
||||||
|
utilfeature.DefaultFeatureGate.Enabled(features.CSINodeInfo) {
|
||||||
|
go informers.Storage().V1beta1().CSINodes().Informer().Run(stopCh)
|
||||||
|
}
|
||||||
|
if utilfeature.DefaultFeatureGate.Enabled(features.CSIDriverRegistry) {
|
||||||
|
go informers.Storage().V1beta1().CSIDrivers().Informer().Run(stopCh)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestPodUpdateWithWithADC(t *testing.T) {
|
func TestPodUpdateWithWithADC(t *testing.T) {
|
||||||
_, server, closeFn := framework.RunAMaster(framework.NewIntegrationTestMasterConfig())
|
_, server, closeFn := framework.RunAMaster(framework.NewIntegrationTestMasterConfig())
|
||||||
defer closeFn()
|
defer closeFn()
|
||||||
|
@ -246,6 +259,7 @@ func TestPodUpdateWithWithADC(t *testing.T) {
|
||||||
stopCh := make(chan struct{})
|
stopCh := make(chan struct{})
|
||||||
go informers.Core().V1().PersistentVolumeClaims().Informer().Run(stopCh)
|
go informers.Core().V1().PersistentVolumeClaims().Informer().Run(stopCh)
|
||||||
go informers.Core().V1().PersistentVolumes().Informer().Run(stopCh)
|
go informers.Core().V1().PersistentVolumes().Informer().Run(stopCh)
|
||||||
|
initCSIObjects(stopCh, informers)
|
||||||
go ctrl.Run(stopCh)
|
go ctrl.Run(stopCh)
|
||||||
|
|
||||||
waitToObservePods(t, podInformer, 1)
|
waitToObservePods(t, podInformer, 1)
|
||||||
|
@ -314,6 +328,7 @@ func TestPodUpdateWithKeepTerminatedPodVolumes(t *testing.T) {
|
||||||
stopCh := make(chan struct{})
|
stopCh := make(chan struct{})
|
||||||
go informers.Core().V1().PersistentVolumeClaims().Informer().Run(stopCh)
|
go informers.Core().V1().PersistentVolumeClaims().Informer().Run(stopCh)
|
||||||
go informers.Core().V1().PersistentVolumes().Informer().Run(stopCh)
|
go informers.Core().V1().PersistentVolumes().Informer().Run(stopCh)
|
||||||
|
initCSIObjects(stopCh, informers)
|
||||||
go ctrl.Run(stopCh)
|
go ctrl.Run(stopCh)
|
||||||
|
|
||||||
waitToObservePods(t, podInformer, 1)
|
waitToObservePods(t, podInformer, 1)
|
||||||
|
@ -383,7 +398,7 @@ func waitForPodFuncInDSWP(t *testing.T, dswp volumecache.DesiredStateOfWorld, ch
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func createAdClients(ns *v1.Namespace, t *testing.T, server *httptest.Server, syncPeriod time.Duration, timers attachdetach.TimerConfig) (*clientset.Clientset, attachdetach.AttachDetachController, *persistentvolume.PersistentVolumeController, informers.SharedInformerFactory) {
|
func createAdClients(ns *v1.Namespace, t *testing.T, server *httptest.Server, syncPeriod time.Duration, timers attachdetach.TimerConfig) (*clientset.Clientset, attachdetach.AttachDetachController, *persistentvolume.PersistentVolumeController, clientgoinformers.SharedInformerFactory) {
|
||||||
config := restclient.Config{
|
config := restclient.Config{
|
||||||
Host: server.URL,
|
Host: server.URL,
|
||||||
ContentConfig: restclient.ContentConfig{GroupVersion: &schema.GroupVersion{Group: "", Version: "v1"}},
|
ContentConfig: restclient.ContentConfig{GroupVersion: &schema.GroupVersion{Group: "", Version: "v1"}},
|
||||||
|
@ -408,7 +423,7 @@ func createAdClients(ns *v1.Namespace, t *testing.T, server *httptest.Server, sy
|
||||||
}
|
}
|
||||||
plugins := []volume.VolumePlugin{plugin}
|
plugins := []volume.VolumePlugin{plugin}
|
||||||
cloud := &fakecloud.FakeCloud{}
|
cloud := &fakecloud.FakeCloud{}
|
||||||
informers := informers.NewSharedInformerFactory(testClient, resyncPeriod)
|
informers := clientgoinformers.NewSharedInformerFactory(testClient, resyncPeriod)
|
||||||
ctrl, err := attachdetach.NewAttachDetachController(
|
ctrl, err := attachdetach.NewAttachDetachController(
|
||||||
testClient,
|
testClient,
|
||||||
informers.Core().V1().Pods(),
|
informers.Core().V1().Pods(),
|
||||||
|
@ -416,6 +431,7 @@ func createAdClients(ns *v1.Namespace, t *testing.T, server *httptest.Server, sy
|
||||||
informers.Core().V1().PersistentVolumeClaims(),
|
informers.Core().V1().PersistentVolumeClaims(),
|
||||||
informers.Core().V1().PersistentVolumes(),
|
informers.Core().V1().PersistentVolumes(),
|
||||||
informers.Storage().V1beta1().CSINodes(),
|
informers.Storage().V1beta1().CSINodes(),
|
||||||
|
informers.Storage().V1beta1().CSIDrivers(),
|
||||||
cloud,
|
cloud,
|
||||||
plugins,
|
plugins,
|
||||||
nil, /* prober */
|
nil, /* prober */
|
||||||
|
@ -491,6 +507,7 @@ func TestPodAddedByDswp(t *testing.T) {
|
||||||
stopCh := make(chan struct{})
|
stopCh := make(chan struct{})
|
||||||
go informers.Core().V1().PersistentVolumeClaims().Informer().Run(stopCh)
|
go informers.Core().V1().PersistentVolumeClaims().Informer().Run(stopCh)
|
||||||
go informers.Core().V1().PersistentVolumes().Informer().Run(stopCh)
|
go informers.Core().V1().PersistentVolumes().Informer().Run(stopCh)
|
||||||
|
initCSIObjects(stopCh, informers)
|
||||||
go ctrl.Run(stopCh)
|
go ctrl.Run(stopCh)
|
||||||
|
|
||||||
waitToObservePods(t, podInformer, 1)
|
waitToObservePods(t, podInformer, 1)
|
||||||
|
@ -576,6 +593,7 @@ func TestPVCBoundWithADC(t *testing.T) {
|
||||||
stopCh := make(chan struct{})
|
stopCh := make(chan struct{})
|
||||||
informers.Start(stopCh)
|
informers.Start(stopCh)
|
||||||
informers.WaitForCacheSync(stopCh)
|
informers.WaitForCacheSync(stopCh)
|
||||||
|
initCSIObjects(stopCh, informers)
|
||||||
go ctrl.Run(stopCh)
|
go ctrl.Run(stopCh)
|
||||||
go pvCtrl.Run(stopCh)
|
go pvCtrl.Run(stopCh)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue