mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-21 10:51:29 +00:00
Remove CSINodeInfo feature gate
Signed-off-by: ialidzhikov <i.alidjikov@gmail.com>
This commit is contained in:
parent
ccd29ea264
commit
bc432124a2
@ -122,7 +122,6 @@ go_library(
|
|||||||
"//staging/src/k8s.io/client-go/discovery/cached:go_default_library",
|
"//staging/src/k8s.io/client-go/discovery/cached:go_default_library",
|
||||||
"//staging/src/k8s.io/client-go/dynamic:go_default_library",
|
"//staging/src/k8s.io/client-go/dynamic: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/informers/storage/v1: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/metadata:go_default_library",
|
"//staging/src/k8s.io/client-go/metadata:go_default_library",
|
||||||
"//staging/src/k8s.io/client-go/metadata/metadatainformer:go_default_library",
|
"//staging/src/k8s.io/client-go/metadata/metadatainformer:go_default_library",
|
||||||
|
@ -34,7 +34,6 @@ import (
|
|||||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||||
"k8s.io/apiserver/pkg/quota/v1/generic"
|
"k8s.io/apiserver/pkg/quota/v1/generic"
|
||||||
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
||||||
storagev1informer "k8s.io/client-go/informers/storage/v1"
|
|
||||||
clientset "k8s.io/client-go/kubernetes"
|
clientset "k8s.io/client-go/kubernetes"
|
||||||
"k8s.io/client-go/metadata"
|
"k8s.io/client-go/metadata"
|
||||||
restclient "k8s.io/client-go/rest"
|
restclient "k8s.io/client-go/rest"
|
||||||
@ -320,12 +319,7 @@ func startAttachDetachController(ctx ControllerContext) (http.Handler, bool, err
|
|||||||
return nil, true, fmt.Errorf("duration time must be greater than one second as set via command line option reconcile-sync-loop-period")
|
return nil, true, fmt.Errorf("duration time must be greater than one second as set via command line option reconcile-sync-loop-period")
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
csiNodeInformer := ctx.InformerFactory.Storage().V1().CSINodes()
|
||||||
csiNodeInformer storagev1informer.CSINodeInformer
|
|
||||||
)
|
|
||||||
if utilfeature.DefaultFeatureGate.Enabled(features.CSINodeInfo) {
|
|
||||||
csiNodeInformer = ctx.InformerFactory.Storage().V1().CSINodes()
|
|
||||||
}
|
|
||||||
csiDriverInformer := ctx.InformerFactory.Storage().V1().CSIDrivers()
|
csiDriverInformer := ctx.InformerFactory.Storage().V1().CSIDrivers()
|
||||||
|
|
||||||
plugins, err := ProbeAttachableVolumePlugins()
|
plugins, err := ProbeAttachableVolumePlugins()
|
||||||
|
@ -137,8 +137,7 @@ func NewAttachDetachController(
|
|||||||
filteredDialOptions: filteredDialOptions,
|
filteredDialOptions: filteredDialOptions,
|
||||||
}
|
}
|
||||||
|
|
||||||
if utilfeature.DefaultFeatureGate.Enabled(features.CSIMigration) &&
|
if utilfeature.DefaultFeatureGate.Enabled(features.CSIMigration) {
|
||||||
utilfeature.DefaultFeatureGate.Enabled(features.CSINodeInfo) {
|
|
||||||
adc.csiNodeLister = csiNodeInformer.Lister()
|
adc.csiNodeLister = csiNodeInformer.Lister()
|
||||||
adc.csiNodeSynced = csiNodeInformer.Informer().HasSynced
|
adc.csiNodeSynced = csiNodeInformer.Informer().HasSynced
|
||||||
}
|
}
|
||||||
|
@ -310,12 +310,8 @@ func translateInTreeSpecToCSIIfNeeded(spec *volume.Spec, nodeName types.NodeName
|
|||||||
}
|
}
|
||||||
|
|
||||||
func isCSIMigrationSupportedOnNode(nodeName types.NodeName, spec *volume.Spec, vpm *volume.VolumePluginMgr, csiMigratedPluginManager csimigration.PluginManager) (bool, error) {
|
func isCSIMigrationSupportedOnNode(nodeName types.NodeName, spec *volume.Spec, vpm *volume.VolumePluginMgr, csiMigratedPluginManager csimigration.PluginManager) (bool, error) {
|
||||||
if !utilfeature.DefaultFeatureGate.Enabled(features.CSIMigration) ||
|
if !utilfeature.DefaultFeatureGate.Enabled(features.CSIMigration) {
|
||||||
!utilfeature.DefaultFeatureGate.Enabled(features.CSINodeInfo) {
|
// If CSIMigration is disabled, CSI migration paths will not be taken for the node.
|
||||||
// If CSIMigration is disabled, CSI migration paths will not be taken for
|
|
||||||
// the node. If CSINodeInfo is disabled, checking of installation status
|
|
||||||
// of a migrated CSI plugin cannot be performed. Therefore stick to
|
|
||||||
// in-tree plugins.
|
|
||||||
return false, nil
|
return false, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -165,13 +165,6 @@ const (
|
|||||||
// Enable all logic related to the CSIDriver API object in storage.k8s.io
|
// Enable all logic related to the CSIDriver API object in storage.k8s.io
|
||||||
CSIDriverRegistry featuregate.Feature = "CSIDriverRegistry"
|
CSIDriverRegistry featuregate.Feature = "CSIDriverRegistry"
|
||||||
|
|
||||||
// owner: @verult
|
|
||||||
// alpha: v1.12
|
|
||||||
// beta: v1.14
|
|
||||||
// ga: v1.17
|
|
||||||
// Enable all logic related to the CSINode API object in storage.k8s.io
|
|
||||||
CSINodeInfo featuregate.Feature = "CSINodeInfo"
|
|
||||||
|
|
||||||
// owner: @screeley44
|
// owner: @screeley44
|
||||||
// alpha: v1.9
|
// alpha: v1.9
|
||||||
// beta: v1.13
|
// beta: v1.13
|
||||||
@ -750,7 +743,6 @@ var defaultKubernetesFeatureGates = map[featuregate.Feature]featuregate.FeatureS
|
|||||||
ServiceNodeExclusion: {Default: true, PreRelease: featuregate.Beta},
|
ServiceNodeExclusion: {Default: true, PreRelease: featuregate.Beta},
|
||||||
NodeDisruptionExclusion: {Default: true, PreRelease: featuregate.Beta},
|
NodeDisruptionExclusion: {Default: true, PreRelease: featuregate.Beta},
|
||||||
CSIDriverRegistry: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.20
|
CSIDriverRegistry: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.20
|
||||||
CSINodeInfo: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.19
|
|
||||||
BlockVolume: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.20
|
BlockVolume: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.20
|
||||||
StorageObjectInUseProtection: {Default: true, PreRelease: featuregate.GA},
|
StorageObjectInUseProtection: {Default: true, PreRelease: featuregate.GA},
|
||||||
SupportPodPidsLimit: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.23
|
SupportPodPidsLimit: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.23
|
||||||
|
@ -105,14 +105,12 @@ func (p RESTStorageProvider) v1beta1Storage(apiResourceConfigSource serverstorag
|
|||||||
}
|
}
|
||||||
storage["volumeattachments"] = volumeAttachmentStorage.VolumeAttachment
|
storage["volumeattachments"] = volumeAttachmentStorage.VolumeAttachment
|
||||||
|
|
||||||
// register csinodes if CSINodeInfo feature gate is enabled
|
// register csinodes
|
||||||
if utilfeature.DefaultFeatureGate.Enabled(features.CSINodeInfo) {
|
csiNodeStorage, err := csinodestore.NewStorage(restOptionsGetter)
|
||||||
csiNodeStorage, err := csinodestore.NewStorage(restOptionsGetter)
|
if err != nil {
|
||||||
if err != nil {
|
return storage, err
|
||||||
return storage, err
|
|
||||||
}
|
|
||||||
storage["csinodes"] = csiNodeStorage.CSINode
|
|
||||||
}
|
}
|
||||||
|
storage["csinodes"] = csiNodeStorage.CSINode
|
||||||
|
|
||||||
// register csidrivers
|
// register csidrivers
|
||||||
csiDriverStorage, err := csidriverstore.NewStorage(restOptionsGetter)
|
csiDriverStorage, err := csidriverstore.NewStorage(restOptionsGetter)
|
||||||
@ -143,14 +141,12 @@ func (p RESTStorageProvider) v1Storage(apiResourceConfigSource serverstorage.API
|
|||||||
"volumeattachments/status": volumeAttachmentStorage.Status,
|
"volumeattachments/status": volumeAttachmentStorage.Status,
|
||||||
}
|
}
|
||||||
|
|
||||||
// register csinodes if CSINodeInfo feature gate is enabled
|
// register csinodes
|
||||||
if utilfeature.DefaultFeatureGate.Enabled(features.CSINodeInfo) {
|
csiNodeStorage, err := csinodestore.NewStorage(restOptionsGetter)
|
||||||
csiNodeStorage, err := csinodestore.NewStorage(restOptionsGetter)
|
if err != nil {
|
||||||
if err != nil {
|
return nil, err
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
storage["csinodes"] = csiNodeStorage.CSINode
|
|
||||||
}
|
}
|
||||||
|
storage["csinodes"] = csiNodeStorage.CSINode
|
||||||
|
|
||||||
// register csidrivers
|
// register csidrivers
|
||||||
csiDriverStorage, err := csidriverstore.NewStorage(restOptionsGetter)
|
csiDriverStorage, err := csidriverstore.NewStorage(restOptionsGetter)
|
||||||
|
@ -11,7 +11,6 @@ go_library(
|
|||||||
visibility = ["//visibility:public"],
|
visibility = ["//visibility:public"],
|
||||||
deps = [
|
deps = [
|
||||||
"//pkg/api/v1/pod:go_default_library",
|
"//pkg/api/v1/pod:go_default_library",
|
||||||
"//pkg/features:go_default_library",
|
|
||||||
"//pkg/scheduler/algorithmprovider:go_default_library",
|
"//pkg/scheduler/algorithmprovider:go_default_library",
|
||||||
"//pkg/scheduler/apis/config:go_default_library",
|
"//pkg/scheduler/apis/config:go_default_library",
|
||||||
"//pkg/scheduler/apis/config/scheme:go_default_library",
|
"//pkg/scheduler/apis/config/scheme:go_default_library",
|
||||||
@ -39,7 +38,6 @@ go_library(
|
|||||||
"//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/util/sets: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/client-go/informers:go_default_library",
|
"//staging/src/k8s.io/client-go/informers:go_default_library",
|
||||||
"//staging/src/k8s.io/client-go/informers/core/v1:go_default_library",
|
"//staging/src/k8s.io/client-go/informers/core/v1:go_default_library",
|
||||||
"//staging/src/k8s.io/client-go/kubernetes:go_default_library",
|
"//staging/src/k8s.io/client-go/kubernetes:go_default_library",
|
||||||
|
@ -25,10 +25,8 @@ import (
|
|||||||
v1 "k8s.io/api/core/v1"
|
v1 "k8s.io/api/core/v1"
|
||||||
storagev1 "k8s.io/api/storage/v1"
|
storagev1 "k8s.io/api/storage/v1"
|
||||||
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
|
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
|
||||||
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
|
||||||
"k8s.io/client-go/informers"
|
"k8s.io/client-go/informers"
|
||||||
"k8s.io/client-go/tools/cache"
|
"k8s.io/client-go/tools/cache"
|
||||||
"k8s.io/kubernetes/pkg/features"
|
|
||||||
"k8s.io/kubernetes/pkg/scheduler/internal/queue"
|
"k8s.io/kubernetes/pkg/scheduler/internal/queue"
|
||||||
"k8s.io/kubernetes/pkg/scheduler/profile"
|
"k8s.io/kubernetes/pkg/scheduler/profile"
|
||||||
)
|
)
|
||||||
@ -426,14 +424,12 @@ func addAllEventHandlers(
|
|||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
if utilfeature.DefaultFeatureGate.Enabled(features.CSINodeInfo) {
|
informerFactory.Storage().V1().CSINodes().Informer().AddEventHandler(
|
||||||
informerFactory.Storage().V1().CSINodes().Informer().AddEventHandler(
|
cache.ResourceEventHandlerFuncs{
|
||||||
cache.ResourceEventHandlerFuncs{
|
AddFunc: sched.onCSINodeAdd,
|
||||||
AddFunc: sched.onCSINodeAdd,
|
UpdateFunc: sched.onCSINodeUpdate,
|
||||||
UpdateFunc: sched.onCSINodeUpdate,
|
},
|
||||||
},
|
)
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
// On add and update of PVs.
|
// On add and update of PVs.
|
||||||
informerFactory.Core().V1().PersistentVolumes().Informer().AddEventHandler(
|
informerFactory.Core().V1().PersistentVolumes().Informer().AddEventHandler(
|
||||||
|
@ -270,10 +270,11 @@ func NewCSI(_ runtime.Object, handle framework.Handle) (framework.Plugin, error)
|
|||||||
informerFactory := handle.SharedInformerFactory()
|
informerFactory := handle.SharedInformerFactory()
|
||||||
pvLister := informerFactory.Core().V1().PersistentVolumes().Lister()
|
pvLister := informerFactory.Core().V1().PersistentVolumes().Lister()
|
||||||
pvcLister := informerFactory.Core().V1().PersistentVolumeClaims().Lister()
|
pvcLister := informerFactory.Core().V1().PersistentVolumeClaims().Lister()
|
||||||
|
csiNodesLister := informerFactory.Storage().V1().CSINodes().Lister()
|
||||||
scLister := informerFactory.Storage().V1().StorageClasses().Lister()
|
scLister := informerFactory.Storage().V1().StorageClasses().Lister()
|
||||||
|
|
||||||
return &CSILimits{
|
return &CSILimits{
|
||||||
csiNodeLister: getCSINodeListerIfEnabled(informerFactory),
|
csiNodeLister: csiNodesLister,
|
||||||
pvLister: pvLister,
|
pvLister: pvLister,
|
||||||
pvcLister: pvcLister,
|
pvcLister: pvcLister,
|
||||||
scLister: scLister,
|
scLister: scLister,
|
||||||
|
@ -34,7 +34,6 @@ import (
|
|||||||
csilibplugins "k8s.io/csi-translation-lib/plugins"
|
csilibplugins "k8s.io/csi-translation-lib/plugins"
|
||||||
"k8s.io/klog/v2"
|
"k8s.io/klog/v2"
|
||||||
"k8s.io/kubernetes/pkg/features"
|
"k8s.io/kubernetes/pkg/features"
|
||||||
kubefeatures "k8s.io/kubernetes/pkg/features"
|
|
||||||
"k8s.io/kubernetes/pkg/scheduler/framework"
|
"k8s.io/kubernetes/pkg/scheduler/framework"
|
||||||
volumeutil "k8s.io/kubernetes/pkg/volume/util"
|
volumeutil "k8s.io/kubernetes/pkg/volume/util"
|
||||||
)
|
)
|
||||||
@ -126,9 +125,10 @@ func newNonCSILimitsWithInformerFactory(
|
|||||||
) framework.Plugin {
|
) framework.Plugin {
|
||||||
pvLister := informerFactory.Core().V1().PersistentVolumes().Lister()
|
pvLister := informerFactory.Core().V1().PersistentVolumes().Lister()
|
||||||
pvcLister := informerFactory.Core().V1().PersistentVolumeClaims().Lister()
|
pvcLister := informerFactory.Core().V1().PersistentVolumeClaims().Lister()
|
||||||
|
csiNodesLister := informerFactory.Storage().V1().CSINodes().Lister()
|
||||||
scLister := informerFactory.Storage().V1().StorageClasses().Lister()
|
scLister := informerFactory.Storage().V1().StorageClasses().Lister()
|
||||||
|
|
||||||
return newNonCSILimits(filterName, getCSINodeListerIfEnabled(informerFactory), scLister, pvLister, pvcLister)
|
return newNonCSILimits(filterName, csiNodesLister, scLister, pvLister, pvcLister)
|
||||||
}
|
}
|
||||||
|
|
||||||
// newNonCSILimits creates a plugin which evaluates whether a pod can fit based on the
|
// newNonCSILimits creates a plugin which evaluates whether a pod can fit based on the
|
||||||
@ -511,11 +511,3 @@ func getMaxEBSVolume(nodeInstanceType string) int {
|
|||||||
}
|
}
|
||||||
return volumeutil.DefaultMaxEBSVolumes
|
return volumeutil.DefaultMaxEBSVolumes
|
||||||
}
|
}
|
||||||
|
|
||||||
// getCSINodeListerIfEnabled returns the CSINode lister or nil if the feature is disabled
|
|
||||||
func getCSINodeListerIfEnabled(factory informers.SharedInformerFactory) storagelisters.CSINodeLister {
|
|
||||||
if !utilfeature.DefaultFeatureGate.Enabled(kubefeatures.CSINodeInfo) {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return factory.Storage().V1().CSINodes().Lister()
|
|
||||||
}
|
|
||||||
|
@ -240,8 +240,7 @@ func (p *csiPlugin) Init(host volume.VolumeHost) error {
|
|||||||
// Initializing the label management channels
|
// Initializing the label management channels
|
||||||
nim = nodeinfomanager.NewNodeInfoManager(host.GetNodeName(), host, migratedPlugins)
|
nim = nodeinfomanager.NewNodeInfoManager(host.GetNodeName(), host, migratedPlugins)
|
||||||
|
|
||||||
if utilfeature.DefaultFeatureGate.Enabled(features.CSINodeInfo) &&
|
if utilfeature.DefaultFeatureGate.Enabled(features.CSIMigration) {
|
||||||
utilfeature.DefaultFeatureGate.Enabled(features.CSIMigration) {
|
|
||||||
// This function prevents Kubelet from posting Ready status until CSINode
|
// This function prevents Kubelet from posting Ready status until CSINode
|
||||||
// is both installed and initialized
|
// is both installed and initialized
|
||||||
if err := initializeCSINode(host); err != nil {
|
if err := initializeCSINode(host); err != nil {
|
||||||
|
@ -6,7 +6,6 @@ go_library(
|
|||||||
importpath = "k8s.io/kubernetes/pkg/volume/csi/nodeinfomanager",
|
importpath = "k8s.io/kubernetes/pkg/volume/csi/nodeinfomanager",
|
||||||
visibility = ["//visibility:public"],
|
visibility = ["//visibility:public"],
|
||||||
deps = [
|
deps = [
|
||||||
"//pkg/features:go_default_library",
|
|
||||||
"//pkg/util/node:go_default_library",
|
"//pkg/util/node:go_default_library",
|
||||||
"//pkg/volume:go_default_library",
|
"//pkg/volume:go_default_library",
|
||||||
"//pkg/volume/util:go_default_library",
|
"//pkg/volume/util:go_default_library",
|
||||||
@ -18,7 +17,6 @@ go_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/sets:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/util/sets: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/client-go/kubernetes:go_default_library",
|
"//staging/src/k8s.io/client-go/kubernetes:go_default_library",
|
||||||
"//vendor/k8s.io/klog/v2:go_default_library",
|
"//vendor/k8s.io/klog/v2:go_default_library",
|
||||||
],
|
],
|
||||||
@ -44,7 +42,6 @@ go_test(
|
|||||||
embed = [":go_default_library"],
|
embed = [":go_default_library"],
|
||||||
deps = [
|
deps = [
|
||||||
"//pkg/apis/core/helper:go_default_library",
|
"//pkg/apis/core/helper:go_default_library",
|
||||||
"//pkg/features: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",
|
||||||
"//staging/src/k8s.io/api/core/v1:go_default_library",
|
"//staging/src/k8s.io/api/core/v1:go_default_library",
|
||||||
@ -55,11 +52,9 @@ go_test(
|
|||||||
"//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_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/strategicpatch:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/util/strategicpatch:go_default_library",
|
||||||
"//staging/src/k8s.io/apiserver/pkg/util/feature: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",
|
||||||
"//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/component-base/featuregate/testing:go_default_library",
|
|
||||||
"//vendor/github.com/stretchr/testify/assert:go_default_library",
|
"//vendor/github.com/stretchr/testify/assert:go_default_library",
|
||||||
"//vendor/k8s.io/utils/pointer:go_default_library",
|
"//vendor/k8s.io/utils/pointer:go_default_library",
|
||||||
],
|
],
|
||||||
|
@ -37,10 +37,8 @@ import (
|
|||||||
utilerrors "k8s.io/apimachinery/pkg/util/errors"
|
utilerrors "k8s.io/apimachinery/pkg/util/errors"
|
||||||
"k8s.io/apimachinery/pkg/util/sets"
|
"k8s.io/apimachinery/pkg/util/sets"
|
||||||
"k8s.io/apimachinery/pkg/util/wait"
|
"k8s.io/apimachinery/pkg/util/wait"
|
||||||
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
|
||||||
clientset "k8s.io/client-go/kubernetes"
|
clientset "k8s.io/client-go/kubernetes"
|
||||||
"k8s.io/klog/v2"
|
"k8s.io/klog/v2"
|
||||||
"k8s.io/kubernetes/pkg/features"
|
|
||||||
nodeutil "k8s.io/kubernetes/pkg/util/node"
|
nodeutil "k8s.io/kubernetes/pkg/util/node"
|
||||||
"k8s.io/kubernetes/pkg/volume"
|
"k8s.io/kubernetes/pkg/volume"
|
||||||
"k8s.io/kubernetes/pkg/volume/util"
|
"k8s.io/kubernetes/pkg/volume/util"
|
||||||
@ -115,10 +113,7 @@ func (nim *nodeInfoManager) InstallCSIDriver(driverName string, driverNodeID str
|
|||||||
|
|
||||||
nodeUpdateFuncs := []nodeUpdateFunc{
|
nodeUpdateFuncs := []nodeUpdateFunc{
|
||||||
updateNodeIDInNode(driverName, driverNodeID),
|
updateNodeIDInNode(driverName, driverNodeID),
|
||||||
}
|
updateTopologyLabels(topology),
|
||||||
|
|
||||||
if utilfeature.DefaultFeatureGate.Enabled(features.CSINodeInfo) {
|
|
||||||
nodeUpdateFuncs = append(nodeUpdateFuncs, updateTopologyLabels(topology))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
err := nim.updateNode(nodeUpdateFuncs...)
|
err := nim.updateNode(nodeUpdateFuncs...)
|
||||||
@ -126,28 +121,25 @@ func (nim *nodeInfoManager) InstallCSIDriver(driverName string, driverNodeID str
|
|||||||
return fmt.Errorf("error updating Node object with CSI driver node info: %v", err)
|
return fmt.Errorf("error updating Node object with CSI driver node info: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if utilfeature.DefaultFeatureGate.Enabled(features.CSINodeInfo) {
|
err = nim.updateCSINode(driverName, driverNodeID, maxAttachLimit, topology)
|
||||||
err = nim.updateCSINode(driverName, driverNodeID, maxAttachLimit, topology)
|
if err != nil {
|
||||||
if err != nil {
|
return fmt.Errorf("error updating CSINode object with CSI driver node info: %v", err)
|
||||||
return fmt.Errorf("error updating CSINode object with CSI driver node info: %v", err)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// UninstallCSIDriver removes the node ID annotation from the Node object and CSIDrivers field from the
|
// UninstallCSIDriver removes the node ID annotation from the Node object and CSIDrivers field from the
|
||||||
// CSINode object. If the CSINOdeInfo object contains no CSIDrivers, it will be deleted.
|
// CSINode object. If the CSINodeInfo object contains no CSIDrivers, it will be deleted.
|
||||||
// If multiple calls to UninstallCSIDriver() are made in parallel, some calls might receive Node or
|
// If multiple calls to UninstallCSIDriver() are made in parallel, some calls might receive Node or
|
||||||
// CSINode update conflicts, which causes the function to retry the corresponding update.
|
// CSINode update conflicts, which causes the function to retry the corresponding update.
|
||||||
func (nim *nodeInfoManager) UninstallCSIDriver(driverName string) error {
|
func (nim *nodeInfoManager) UninstallCSIDriver(driverName string) error {
|
||||||
if utilfeature.DefaultFeatureGate.Enabled(features.CSINodeInfo) {
|
err := nim.uninstallDriverFromCSINode(driverName)
|
||||||
err := nim.uninstallDriverFromCSINode(driverName)
|
if err != nil {
|
||||||
if err != nil {
|
return fmt.Errorf("error uninstalling CSI driver from CSINode object %v", err)
|
||||||
return fmt.Errorf("error uninstalling CSI driver from CSINode object %v", err)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
err := nim.updateNode(
|
err = nim.updateNode(
|
||||||
removeMaxAttachLimit(driverName),
|
removeMaxAttachLimit(driverName),
|
||||||
removeNodeIDFromNode(driverName),
|
removeNodeIDFromNode(driverName),
|
||||||
)
|
)
|
||||||
|
@ -35,13 +35,10 @@ import (
|
|||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/apimachinery/pkg/types"
|
"k8s.io/apimachinery/pkg/types"
|
||||||
"k8s.io/apimachinery/pkg/util/strategicpatch"
|
"k8s.io/apimachinery/pkg/util/strategicpatch"
|
||||||
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
|
||||||
"k8s.io/client-go/kubernetes/fake"
|
"k8s.io/client-go/kubernetes/fake"
|
||||||
clienttesting "k8s.io/client-go/testing"
|
clienttesting "k8s.io/client-go/testing"
|
||||||
utiltesting "k8s.io/client-go/util/testing"
|
utiltesting "k8s.io/client-go/util/testing"
|
||||||
featuregatetesting "k8s.io/component-base/featuregate/testing"
|
|
||||||
"k8s.io/kubernetes/pkg/apis/core/helper"
|
"k8s.io/kubernetes/pkg/apis/core/helper"
|
||||||
"k8s.io/kubernetes/pkg/features"
|
|
||||||
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"
|
||||||
utilpointer "k8s.io/utils/pointer"
|
utilpointer "k8s.io/utils/pointer"
|
||||||
@ -604,7 +601,7 @@ func TestInstallCSIDriver(t *testing.T) {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
test(t, true /* addNodeInfo */, true /* csiNodeInfoEnabled */, testcases)
|
test(t, true /* addNodeInfo */, testcases)
|
||||||
}
|
}
|
||||||
|
|
||||||
func generateVolumeLimits(i int32) *storage.VolumeNodeResources {
|
func generateVolumeLimits(i int32) *storage.VolumeNodeResources {
|
||||||
@ -772,7 +769,7 @@ func TestUninstallCSIDriver(t *testing.T) {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
test(t, false /* addNodeInfo */, true /* csiNodeInfoEnabled */, testcases)
|
test(t, false /* addNodeInfo */, testcases)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestSetMigrationAnnotation(t *testing.T) {
|
func TestSetMigrationAnnotation(t *testing.T) {
|
||||||
@ -926,8 +923,6 @@ func TestSetMigrationAnnotation(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestInstallCSIDriverExistingAnnotation(t *testing.T) {
|
func TestInstallCSIDriverExistingAnnotation(t *testing.T) {
|
||||||
defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.CSINodeInfo, true)()
|
|
||||||
|
|
||||||
driverName := "com.example.csi/driver1"
|
driverName := "com.example.csi/driver1"
|
||||||
nodeID := "com.example.csi/some-node"
|
nodeID := "com.example.csi/some-node"
|
||||||
|
|
||||||
@ -1013,9 +1008,7 @@ func getClientSet(existingNode *v1.Node, existingCSINode *storage.CSINode) *fake
|
|||||||
return fake.NewSimpleClientset(objects...)
|
return fake.NewSimpleClientset(objects...)
|
||||||
}
|
}
|
||||||
|
|
||||||
func test(t *testing.T, addNodeInfo bool, csiNodeInfoEnabled bool, testcases []testcase) {
|
func test(t *testing.T, addNodeInfo bool, testcases []testcase) {
|
||||||
defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.CSINodeInfo, csiNodeInfoEnabled)()
|
|
||||||
|
|
||||||
for _, tc := range testcases {
|
for _, tc := range testcases {
|
||||||
t.Logf("test case: %q", tc.name)
|
t.Logf("test case: %q", tc.name)
|
||||||
|
|
||||||
@ -1077,26 +1070,24 @@ func test(t *testing.T, addNodeInfo bool, csiNodeInfoEnabled bool, testcases []t
|
|||||||
t.Errorf("expected Node %v; got: %v", tc.expectedNode, node)
|
t.Errorf("expected Node %v; got: %v", tc.expectedNode, node)
|
||||||
}
|
}
|
||||||
|
|
||||||
if csiNodeInfoEnabled {
|
// CSINode validation
|
||||||
// CSINode validation
|
nodeInfo, err := client.StorageV1().CSINodes().Get(context.TODO(), nodeName, metav1.GetOptions{})
|
||||||
nodeInfo, err := client.StorageV1().CSINodes().Get(context.TODO(), nodeName, metav1.GetOptions{})
|
if err != nil {
|
||||||
if err != nil {
|
if !errors.IsNotFound(err) {
|
||||||
if !errors.IsNotFound(err) {
|
t.Errorf("error getting CSINode: %v", err)
|
||||||
t.Errorf("error getting CSINode: %v", err)
|
|
||||||
}
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if !helper.Semantic.DeepEqual(nodeInfo, tc.expectedCSINode) {
|
|
||||||
t.Errorf("expected CSINode %v; got: %v", tc.expectedCSINode, nodeInfo)
|
|
||||||
}
|
}
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if !helper.Semantic.DeepEqual(nodeInfo, tc.expectedCSINode) {
|
||||||
|
t.Errorf("expected CSINode %v; got: %v", tc.expectedCSINode, nodeInfo)
|
||||||
|
}
|
||||||
|
|
||||||
if !addNodeInfo && tc.existingCSINode != nil && tc.existingNode != nil {
|
if !addNodeInfo && tc.existingCSINode != nil && tc.existingNode != nil {
|
||||||
if tc.hasModified && helper.Semantic.DeepEqual(nodeInfo, tc.existingCSINode) {
|
if tc.hasModified && helper.Semantic.DeepEqual(nodeInfo, tc.existingCSINode) {
|
||||||
t.Errorf("existing CSINode %v; got: %v", tc.existingCSINode, nodeInfo)
|
t.Errorf("existing CSINode %v; got: %v", tc.existingCSINode, nodeInfo)
|
||||||
}
|
}
|
||||||
if !tc.hasModified && !helper.Semantic.DeepEqual(nodeInfo, tc.existingCSINode) {
|
if !tc.hasModified && !helper.Semantic.DeepEqual(nodeInfo, tc.existingCSINode) {
|
||||||
t.Errorf("existing CSINode %v; got: %v", tc.existingCSINode, nodeInfo)
|
t.Errorf("existing CSINode %v; got: %v", tc.existingCSINode, nodeInfo)
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -46,13 +46,11 @@ go_test(
|
|||||||
"//pkg/apis/policy:go_default_library",
|
"//pkg/apis/policy:go_default_library",
|
||||||
"//pkg/apis/storage:go_default_library",
|
"//pkg/apis/storage:go_default_library",
|
||||||
"//pkg/auth/nodeidentifier:go_default_library",
|
"//pkg/auth/nodeidentifier:go_default_library",
|
||||||
"//pkg/features:go_default_library",
|
|
||||||
"//pkg/kubelet/apis:go_default_library",
|
"//pkg/kubelet/apis:go_default_library",
|
||||||
"//staging/src/k8s.io/api/core/v1:go_default_library",
|
"//staging/src/k8s.io/api/core/v1:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
||||||
"//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/types:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/types:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library",
|
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library",
|
||||||
"//staging/src/k8s.io/apiserver/pkg/admission:go_default_library",
|
"//staging/src/k8s.io/apiserver/pkg/admission:go_default_library",
|
||||||
"//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library",
|
"//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library",
|
||||||
|
@ -71,7 +71,6 @@ type Plugin struct {
|
|||||||
podsGetter corev1lister.PodLister
|
podsGetter corev1lister.PodLister
|
||||||
nodesGetter corev1lister.NodeLister
|
nodesGetter corev1lister.NodeLister
|
||||||
|
|
||||||
csiNodeInfoEnabled bool
|
|
||||||
expandPersistentVolumesEnabled bool
|
expandPersistentVolumesEnabled bool
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -83,7 +82,6 @@ var (
|
|||||||
|
|
||||||
// InspectFeatureGates allows setting bools without taking a dep on a global variable
|
// InspectFeatureGates allows setting bools without taking a dep on a global variable
|
||||||
func (p *Plugin) InspectFeatureGates(featureGates featuregate.FeatureGate) {
|
func (p *Plugin) InspectFeatureGates(featureGates featuregate.FeatureGate) {
|
||||||
p.csiNodeInfoEnabled = featureGates.Enabled(features.CSINodeInfo)
|
|
||||||
p.expandPersistentVolumesEnabled = featureGates.Enabled(features.ExpandPersistentVolumes)
|
p.expandPersistentVolumesEnabled = featureGates.Enabled(features.ExpandPersistentVolumes)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -163,10 +161,7 @@ func (p *Plugin) Admit(ctx context.Context, a admission.Attributes, o admission.
|
|||||||
return p.admitLease(nodeName, a)
|
return p.admitLease(nodeName, a)
|
||||||
|
|
||||||
case csiNodeResource:
|
case csiNodeResource:
|
||||||
if p.csiNodeInfoEnabled {
|
return p.admitCSINode(nodeName, a)
|
||||||
return p.admitCSINode(nodeName, a)
|
|
||||||
}
|
|
||||||
return admission.NewForbidden(a, fmt.Errorf("disabled by feature gates %s", features.CSINodeInfo))
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return nil
|
return nil
|
||||||
|
@ -18,18 +18,15 @@ package noderestriction
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
|
||||||
"reflect"
|
"reflect"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
corev1 "k8s.io/api/core/v1"
|
corev1 "k8s.io/api/core/v1"
|
||||||
v1 "k8s.io/api/core/v1"
|
|
||||||
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/types"
|
"k8s.io/apimachinery/pkg/types"
|
||||||
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
|
|
||||||
"k8s.io/apimachinery/pkg/util/sets"
|
"k8s.io/apimachinery/pkg/util/sets"
|
||||||
"k8s.io/apiserver/pkg/admission"
|
"k8s.io/apiserver/pkg/admission"
|
||||||
"k8s.io/apiserver/pkg/authentication/user"
|
"k8s.io/apiserver/pkg/authentication/user"
|
||||||
@ -42,28 +39,10 @@ import (
|
|||||||
"k8s.io/kubernetes/pkg/apis/policy"
|
"k8s.io/kubernetes/pkg/apis/policy"
|
||||||
storage "k8s.io/kubernetes/pkg/apis/storage"
|
storage "k8s.io/kubernetes/pkg/apis/storage"
|
||||||
"k8s.io/kubernetes/pkg/auth/nodeidentifier"
|
"k8s.io/kubernetes/pkg/auth/nodeidentifier"
|
||||||
"k8s.io/kubernetes/pkg/features"
|
|
||||||
kubeletapis "k8s.io/kubernetes/pkg/kubelet/apis"
|
kubeletapis "k8s.io/kubernetes/pkg/kubelet/apis"
|
||||||
"k8s.io/utils/pointer"
|
"k8s.io/utils/pointer"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
|
||||||
csiNodeInfoEnabledFeature = featuregate.NewFeatureGate()
|
|
||||||
csiNodeInfoDisabledFeature = featuregate.NewFeatureGate()
|
|
||||||
)
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
// all features need to be set on all featuregates for the tests. We set everything and then then the if's below override it.
|
|
||||||
relevantFeatures := map[featuregate.Feature]featuregate.FeatureSpec{
|
|
||||||
features.CSINodeInfo: {Default: false},
|
|
||||||
features.ExpandPersistentVolumes: {Default: false},
|
|
||||||
}
|
|
||||||
utilruntime.Must(csiNodeInfoEnabledFeature.Add(relevantFeatures))
|
|
||||||
utilruntime.Must(csiNodeInfoDisabledFeature.Add(relevantFeatures))
|
|
||||||
|
|
||||||
utilruntime.Must(csiNodeInfoEnabledFeature.SetFromMap(map[string]bool{string(features.CSINodeInfo): true}))
|
|
||||||
}
|
|
||||||
|
|
||||||
func makeTestPod(namespace, name, node string, mirror bool) (*api.Pod, *corev1.Pod) {
|
func makeTestPod(namespace, name, node string, mirror bool) (*api.Pod, *corev1.Pod) {
|
||||||
corePod := &api.Pod{}
|
corePod := &api.Pod{}
|
||||||
corePod.Namespace = namespace
|
corePod.Namespace = namespace
|
||||||
@ -398,7 +377,7 @@ func Test_nodePlugin_Admit(t *testing.T) {
|
|||||||
existingPodsIndex.Add(v1otherpod)
|
existingPodsIndex.Add(v1otherpod)
|
||||||
existingPodsIndex.Add(v1unboundpod)
|
existingPodsIndex.Add(v1unboundpod)
|
||||||
|
|
||||||
existingNodesIndex.Add(&v1.Node{ObjectMeta: mynodeObjMeta})
|
existingNodesIndex.Add(&corev1.Node{ObjectMeta: mynodeObjMeta})
|
||||||
|
|
||||||
sapod, _ := makeTestPod("ns", "mysapod", "mynode", true)
|
sapod, _ := makeTestPod("ns", "mysapod", "mynode", true)
|
||||||
sapod.Spec.ServiceAccountName = "foo"
|
sapod.Spec.ServiceAccountName = "foo"
|
||||||
@ -1214,45 +1193,33 @@ func Test_nodePlugin_Admit(t *testing.T) {
|
|||||||
},
|
},
|
||||||
// CSINode
|
// CSINode
|
||||||
{
|
{
|
||||||
name: "disallowed create CSINode - feature disabled",
|
name: "disallowed create another node's CSINode",
|
||||||
attributes: admission.NewAttributesRecord(nodeInfo, nil, csiNodeKind, nodeInfo.Namespace, nodeInfo.Name, csiNodeResource, "", admission.Create, &metav1.CreateOptions{}, false, mynode),
|
|
||||||
features: csiNodeInfoDisabledFeature,
|
|
||||||
err: fmt.Sprintf("forbidden: disabled by feature gates %s", features.CSINodeInfo),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "disallowed create another node's CSINode - feature enabled",
|
|
||||||
attributes: admission.NewAttributesRecord(nodeInfoWrongName, nil, csiNodeKind, nodeInfoWrongName.Namespace, nodeInfoWrongName.Name, csiNodeResource, "", admission.Create, &metav1.CreateOptions{}, false, mynode),
|
attributes: admission.NewAttributesRecord(nodeInfoWrongName, nil, csiNodeKind, nodeInfoWrongName.Namespace, nodeInfoWrongName.Name, csiNodeResource, "", admission.Create, &metav1.CreateOptions{}, false, mynode),
|
||||||
features: csiNodeInfoEnabledFeature,
|
|
||||||
err: "forbidden: ",
|
err: "forbidden: ",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "disallowed update another node's CSINode - feature enabled",
|
name: "disallowed update another node's CSINode",
|
||||||
attributes: admission.NewAttributesRecord(nodeInfoWrongName, nodeInfoWrongName, csiNodeKind, nodeInfoWrongName.Namespace, nodeInfoWrongName.Name, csiNodeResource, "", admission.Update, &metav1.UpdateOptions{}, false, mynode),
|
attributes: admission.NewAttributesRecord(nodeInfoWrongName, nodeInfoWrongName, csiNodeKind, nodeInfoWrongName.Namespace, nodeInfoWrongName.Name, csiNodeResource, "", admission.Update, &metav1.UpdateOptions{}, false, mynode),
|
||||||
features: csiNodeInfoEnabledFeature,
|
|
||||||
err: "forbidden: ",
|
err: "forbidden: ",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "disallowed delete another node's CSINode - feature enabled",
|
name: "disallowed delete another node's CSINode",
|
||||||
attributes: admission.NewAttributesRecord(nil, nil, csiNodeKind, nodeInfoWrongName.Namespace, nodeInfoWrongName.Name, csiNodeResource, "", admission.Delete, &metav1.DeleteOptions{}, false, mynode),
|
attributes: admission.NewAttributesRecord(nil, nil, csiNodeKind, nodeInfoWrongName.Namespace, nodeInfoWrongName.Name, csiNodeResource, "", admission.Delete, &metav1.DeleteOptions{}, false, mynode),
|
||||||
features: csiNodeInfoEnabledFeature,
|
|
||||||
err: "forbidden: ",
|
err: "forbidden: ",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "allowed create node CSINode - feature enabled",
|
name: "allowed create node CSINode",
|
||||||
attributes: admission.NewAttributesRecord(nodeInfo, nil, csiNodeKind, nodeInfo.Namespace, nodeInfo.Name, csiNodeResource, "", admission.Create, &metav1.CreateOptions{}, false, mynode),
|
attributes: admission.NewAttributesRecord(nodeInfo, nil, csiNodeKind, nodeInfo.Namespace, nodeInfo.Name, csiNodeResource, "", admission.Create, &metav1.CreateOptions{}, false, mynode),
|
||||||
features: csiNodeInfoEnabledFeature,
|
|
||||||
err: "",
|
err: "",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "allowed update node CSINode - feature enabled",
|
name: "allowed update node CSINode",
|
||||||
attributes: admission.NewAttributesRecord(nodeInfo, nodeInfo, csiNodeKind, nodeInfo.Namespace, nodeInfo.Name, csiNodeResource, "", admission.Update, &metav1.UpdateOptions{}, false, mynode),
|
attributes: admission.NewAttributesRecord(nodeInfo, nodeInfo, csiNodeKind, nodeInfo.Namespace, nodeInfo.Name, csiNodeResource, "", admission.Update, &metav1.UpdateOptions{}, false, mynode),
|
||||||
features: csiNodeInfoEnabledFeature,
|
|
||||||
err: "",
|
err: "",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "allowed delete node CSINode - feature enabled",
|
name: "allowed delete node CSINode",
|
||||||
attributes: admission.NewAttributesRecord(nil, nil, csiNodeKind, nodeInfo.Namespace, nodeInfo.Name, csiNodeResource, "", admission.Delete, &metav1.UpdateOptions{}, false, mynode),
|
attributes: admission.NewAttributesRecord(nil, nil, csiNodeKind, nodeInfo.Namespace, nodeInfo.Name, csiNodeResource, "", admission.Delete, &metav1.UpdateOptions{}, false, mynode),
|
||||||
features: csiNodeInfoEnabledFeature,
|
|
||||||
err: "",
|
err: "",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@ -1264,11 +1231,11 @@ func Test_nodePlugin_Admit(t *testing.T) {
|
|||||||
|
|
||||||
func Test_nodePlugin_Admit_OwnerReference(t *testing.T) {
|
func Test_nodePlugin_Admit_OwnerReference(t *testing.T) {
|
||||||
expectedNodeIndex := cache.NewIndexer(cache.MetaNamespaceKeyFunc, nil)
|
expectedNodeIndex := cache.NewIndexer(cache.MetaNamespaceKeyFunc, nil)
|
||||||
expectedNodeIndex.Add(&v1.Node{ObjectMeta: metav1.ObjectMeta{Name: "mynode", UID: "mynode-uid"}})
|
expectedNodeIndex.Add(&corev1.Node{ObjectMeta: metav1.ObjectMeta{Name: "mynode", UID: "mynode-uid"}})
|
||||||
expectedNode := corev1lister.NewNodeLister(expectedNodeIndex)
|
expectedNode := corev1lister.NewNodeLister(expectedNodeIndex)
|
||||||
|
|
||||||
unexpectedNodeIndex := cache.NewIndexer(cache.MetaNamespaceKeyFunc, nil)
|
unexpectedNodeIndex := cache.NewIndexer(cache.MetaNamespaceKeyFunc, nil)
|
||||||
unexpectedNodeIndex.Add(&v1.Node{ObjectMeta: metav1.ObjectMeta{Name: "mynode", UID: "mynode-unexpected-uid"}})
|
unexpectedNodeIndex.Add(&corev1.Node{ObjectMeta: metav1.ObjectMeta{Name: "mynode", UID: "mynode-unexpected-uid"}})
|
||||||
unexpectedNode := corev1lister.NewNodeLister(unexpectedNodeIndex)
|
unexpectedNode := corev1lister.NewNodeLister(unexpectedNodeIndex)
|
||||||
|
|
||||||
noNodesIndex := cache.NewIndexer(cache.MetaNamespaceKeyFunc, nil)
|
noNodesIndex := cache.NewIndexer(cache.MetaNamespaceKeyFunc, nil)
|
||||||
|
@ -16,7 +16,6 @@ go_test(
|
|||||||
embed = [":go_default_library"],
|
embed = [":go_default_library"],
|
||||||
deps = [
|
deps = [
|
||||||
"//pkg/auth/nodeidentifier:go_default_library",
|
"//pkg/auth/nodeidentifier:go_default_library",
|
||||||
"//pkg/features:go_default_library",
|
|
||||||
"//plugin/pkg/auth/authorizer/rbac/bootstrappolicy:go_default_library",
|
"//plugin/pkg/auth/authorizer/rbac/bootstrappolicy:go_default_library",
|
||||||
"//staging/src/k8s.io/api/core/v1:go_default_library",
|
"//staging/src/k8s.io/api/core/v1:go_default_library",
|
||||||
"//staging/src/k8s.io/api/storage/v1:go_default_library",
|
"//staging/src/k8s.io/api/storage/v1:go_default_library",
|
||||||
|
@ -127,10 +127,7 @@ func (r *NodeAuthorizer) Authorize(ctx context.Context, attrs authorizer.Attribu
|
|||||||
case leaseResource:
|
case leaseResource:
|
||||||
return r.authorizeLease(nodeName, attrs)
|
return r.authorizeLease(nodeName, attrs)
|
||||||
case csiNodeResource:
|
case csiNodeResource:
|
||||||
if r.features.Enabled(features.CSINodeInfo) {
|
return r.authorizeCSINode(nodeName, attrs)
|
||||||
return r.authorizeCSINode(nodeName, attrs)
|
|
||||||
}
|
|
||||||
return authorizer.DecisionNoOpinion, fmt.Sprintf("disabled by feature gates %s", features.CSINodeInfo), nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -20,14 +20,13 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
|
"os"
|
||||||
"runtime"
|
"runtime"
|
||||||
"runtime/pprof"
|
"runtime/pprof"
|
||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"os"
|
|
||||||
|
|
||||||
corev1 "k8s.io/api/core/v1"
|
corev1 "k8s.io/api/core/v1"
|
||||||
storagev1 "k8s.io/api/storage/v1"
|
storagev1 "k8s.io/api/storage/v1"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
@ -37,24 +36,9 @@ import (
|
|||||||
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
||||||
"k8s.io/component-base/featuregate"
|
"k8s.io/component-base/featuregate"
|
||||||
"k8s.io/kubernetes/pkg/auth/nodeidentifier"
|
"k8s.io/kubernetes/pkg/auth/nodeidentifier"
|
||||||
"k8s.io/kubernetes/pkg/features"
|
|
||||||
"k8s.io/kubernetes/plugin/pkg/auth/authorizer/rbac/bootstrappolicy"
|
"k8s.io/kubernetes/plugin/pkg/auth/authorizer/rbac/bootstrappolicy"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
|
||||||
csiNodeInfoEnabledFeature = featuregate.NewFeatureGate()
|
|
||||||
csiNodeInfoDisabledFeature = featuregate.NewFeatureGate()
|
|
||||||
)
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
if err := csiNodeInfoEnabledFeature.Add(map[featuregate.Feature]featuregate.FeatureSpec{features.CSINodeInfo: {Default: true}}); err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
if err := csiNodeInfoDisabledFeature.Add(map[featuregate.Feature]featuregate.FeatureSpec{features.CSINodeInfo: {Default: false}}); err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestAuthorizer(t *testing.T) {
|
func TestAuthorizer(t *testing.T) {
|
||||||
g := NewGraph()
|
g := NewGraph()
|
||||||
|
|
||||||
@ -282,82 +266,64 @@ func TestAuthorizer(t *testing.T) {
|
|||||||
},
|
},
|
||||||
// CSINode
|
// CSINode
|
||||||
{
|
{
|
||||||
name: "disallowed CSINode - feature disabled",
|
name: "disallowed CSINode with subresource - feature enabled",
|
||||||
attrs: authorizer.AttributesRecord{User: node0, ResourceRequest: true, Verb: "get", Resource: "csinodes", APIGroup: "storage.k8s.io", Name: "node0"},
|
attrs: authorizer.AttributesRecord{User: node0, ResourceRequest: true, Verb: "get", Resource: "csinodes", Subresource: "csiDrivers", APIGroup: "storage.k8s.io", Name: "node0"},
|
||||||
features: csiNodeInfoDisabledFeature,
|
expect: authorizer.DecisionNoOpinion,
|
||||||
expect: authorizer.DecisionNoOpinion,
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "disallowed CSINode with subresource - feature enabled",
|
name: "disallowed get another node's CSINode",
|
||||||
attrs: authorizer.AttributesRecord{User: node0, ResourceRequest: true, Verb: "get", Resource: "csinodes", Subresource: "csiDrivers", APIGroup: "storage.k8s.io", Name: "node0"},
|
attrs: authorizer.AttributesRecord{User: node0, ResourceRequest: true, Verb: "get", Resource: "csinodes", APIGroup: "storage.k8s.io", Name: "node1"},
|
||||||
features: csiNodeInfoEnabledFeature,
|
expect: authorizer.DecisionNoOpinion,
|
||||||
expect: authorizer.DecisionNoOpinion,
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "disallowed get another node's CSINode - feature enabled",
|
name: "disallowed update another node's CSINode",
|
||||||
attrs: authorizer.AttributesRecord{User: node0, ResourceRequest: true, Verb: "get", Resource: "csinodes", APIGroup: "storage.k8s.io", Name: "node1"},
|
attrs: authorizer.AttributesRecord{User: node0, ResourceRequest: true, Verb: "update", Resource: "csinodes", APIGroup: "storage.k8s.io", Name: "node1"},
|
||||||
features: csiNodeInfoEnabledFeature,
|
expect: authorizer.DecisionNoOpinion,
|
||||||
expect: authorizer.DecisionNoOpinion,
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "disallowed update another node's CSINode - feature enabled",
|
name: "disallowed patch another node's CSINode",
|
||||||
attrs: authorizer.AttributesRecord{User: node0, ResourceRequest: true, Verb: "update", Resource: "csinodes", APIGroup: "storage.k8s.io", Name: "node1"},
|
attrs: authorizer.AttributesRecord{User: node0, ResourceRequest: true, Verb: "patch", Resource: "csinodes", APIGroup: "storage.k8s.io", Name: "node1"},
|
||||||
features: csiNodeInfoEnabledFeature,
|
expect: authorizer.DecisionNoOpinion,
|
||||||
expect: authorizer.DecisionNoOpinion,
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "disallowed patch another node's CSINode - feature enabled",
|
name: "disallowed delete another node's CSINode",
|
||||||
attrs: authorizer.AttributesRecord{User: node0, ResourceRequest: true, Verb: "patch", Resource: "csinodes", APIGroup: "storage.k8s.io", Name: "node1"},
|
attrs: authorizer.AttributesRecord{User: node0, ResourceRequest: true, Verb: "delete", Resource: "csinodes", APIGroup: "storage.k8s.io", Name: "node1"},
|
||||||
features: csiNodeInfoEnabledFeature,
|
expect: authorizer.DecisionNoOpinion,
|
||||||
expect: authorizer.DecisionNoOpinion,
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "disallowed delete another node's CSINode - feature enabled",
|
name: "disallowed list CSINodes",
|
||||||
attrs: authorizer.AttributesRecord{User: node0, ResourceRequest: true, Verb: "delete", Resource: "csinodes", APIGroup: "storage.k8s.io", Name: "node1"},
|
attrs: authorizer.AttributesRecord{User: node0, ResourceRequest: true, Verb: "list", Resource: "csinodes", APIGroup: "storage.k8s.io"},
|
||||||
features: csiNodeInfoEnabledFeature,
|
expect: authorizer.DecisionNoOpinion,
|
||||||
expect: authorizer.DecisionNoOpinion,
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "disallowed list CSINodes - feature enabled",
|
name: "disallowed watch CSINodes",
|
||||||
attrs: authorizer.AttributesRecord{User: node0, ResourceRequest: true, Verb: "list", Resource: "csinodes", APIGroup: "storage.k8s.io"},
|
attrs: authorizer.AttributesRecord{User: node0, ResourceRequest: true, Verb: "watch", Resource: "csinodes", APIGroup: "storage.k8s.io"},
|
||||||
features: csiNodeInfoEnabledFeature,
|
expect: authorizer.DecisionNoOpinion,
|
||||||
expect: authorizer.DecisionNoOpinion,
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "disallowed watch CSINodes - feature enabled",
|
name: "allowed get CSINode",
|
||||||
attrs: authorizer.AttributesRecord{User: node0, ResourceRequest: true, Verb: "watch", Resource: "csinodes", APIGroup: "storage.k8s.io"},
|
attrs: authorizer.AttributesRecord{User: node0, ResourceRequest: true, Verb: "get", Resource: "csinodes", APIGroup: "storage.k8s.io", Name: "node0"},
|
||||||
features: csiNodeInfoEnabledFeature,
|
expect: authorizer.DecisionAllow,
|
||||||
expect: authorizer.DecisionNoOpinion,
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "allowed get CSINode - feature enabled",
|
name: "allowed create CSINode",
|
||||||
attrs: authorizer.AttributesRecord{User: node0, ResourceRequest: true, Verb: "get", Resource: "csinodes", APIGroup: "storage.k8s.io", Name: "node0"},
|
attrs: authorizer.AttributesRecord{User: node0, ResourceRequest: true, Verb: "create", Resource: "csinodes", APIGroup: "storage.k8s.io", Name: "node0"},
|
||||||
features: csiNodeInfoEnabledFeature,
|
expect: authorizer.DecisionAllow,
|
||||||
expect: authorizer.DecisionAllow,
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "allowed create CSINode - feature enabled",
|
name: "allowed update CSINode",
|
||||||
attrs: authorizer.AttributesRecord{User: node0, ResourceRequest: true, Verb: "create", Resource: "csinodes", APIGroup: "storage.k8s.io", Name: "node0"},
|
attrs: authorizer.AttributesRecord{User: node0, ResourceRequest: true, Verb: "update", Resource: "csinodes", APIGroup: "storage.k8s.io", Name: "node0"},
|
||||||
features: csiNodeInfoEnabledFeature,
|
expect: authorizer.DecisionAllow,
|
||||||
expect: authorizer.DecisionAllow,
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "allowed update CSINode - feature enabled",
|
name: "allowed patch CSINode",
|
||||||
attrs: authorizer.AttributesRecord{User: node0, ResourceRequest: true, Verb: "update", Resource: "csinodes", APIGroup: "storage.k8s.io", Name: "node0"},
|
attrs: authorizer.AttributesRecord{User: node0, ResourceRequest: true, Verb: "patch", Resource: "csinodes", APIGroup: "storage.k8s.io", Name: "node0"},
|
||||||
features: csiNodeInfoEnabledFeature,
|
expect: authorizer.DecisionAllow,
|
||||||
expect: authorizer.DecisionAllow,
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "allowed patch CSINode - feature enabled",
|
name: "allowed delete CSINode",
|
||||||
attrs: authorizer.AttributesRecord{User: node0, ResourceRequest: true, Verb: "patch", Resource: "csinodes", APIGroup: "storage.k8s.io", Name: "node0"},
|
attrs: authorizer.AttributesRecord{User: node0, ResourceRequest: true, Verb: "delete", Resource: "csinodes", APIGroup: "storage.k8s.io", Name: "node0"},
|
||||||
features: csiNodeInfoEnabledFeature,
|
expect: authorizer.DecisionAllow,
|
||||||
expect: authorizer.DecisionAllow,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "allowed delete CSINode - feature enabled",
|
|
||||||
attrs: authorizer.AttributesRecord{User: node0, ResourceRequest: true, Verb: "delete", Resource: "csinodes", APIGroup: "storage.k8s.io", Name: "node0"},
|
|
||||||
features: csiNodeInfoEnabledFeature,
|
|
||||||
expect: authorizer.DecisionAllow,
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -74,7 +74,7 @@ func buildControllerRoles() ([]rbacv1.ClusterRole, []rbacv1.ClusterRoleBinding)
|
|||||||
}
|
}
|
||||||
|
|
||||||
role.Rules = append(role.Rules, rbacv1helpers.NewRule("get", "watch", "list").Groups("storage.k8s.io").Resources("csidrivers").RuleOrDie())
|
role.Rules = append(role.Rules, rbacv1helpers.NewRule("get", "watch", "list").Groups("storage.k8s.io").Resources("csidrivers").RuleOrDie())
|
||||||
if utilfeature.DefaultFeatureGate.Enabled(features.CSINodeInfo) && utilfeature.DefaultFeatureGate.Enabled(features.CSIMigration) {
|
if utilfeature.DefaultFeatureGate.Enabled(features.CSIMigration) {
|
||||||
role.Rules = append(role.Rules, rbacv1helpers.NewRule("get", "watch", "list").Groups("storage.k8s.io").Resources("csinodes").RuleOrDie())
|
role.Rules = append(role.Rules, rbacv1helpers.NewRule("get", "watch", "list").Groups("storage.k8s.io").Resources("csinodes").RuleOrDie())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -169,10 +169,8 @@ func NodeRules() []rbacv1.PolicyRule {
|
|||||||
// CSI
|
// CSI
|
||||||
csiDriverRule := rbacv1helpers.NewRule("get", "watch", "list").Groups("storage.k8s.io").Resources("csidrivers").RuleOrDie()
|
csiDriverRule := rbacv1helpers.NewRule("get", "watch", "list").Groups("storage.k8s.io").Resources("csidrivers").RuleOrDie()
|
||||||
nodePolicyRules = append(nodePolicyRules, csiDriverRule)
|
nodePolicyRules = append(nodePolicyRules, csiDriverRule)
|
||||||
if utilfeature.DefaultFeatureGate.Enabled(features.CSINodeInfo) {
|
csiNodeInfoRule := rbacv1helpers.NewRule("get", "create", "update", "patch", "delete").Groups("storage.k8s.io").Resources("csinodes").RuleOrDie()
|
||||||
csiNodeInfoRule := rbacv1helpers.NewRule("get", "create", "update", "patch", "delete").Groups("storage.k8s.io").Resources("csinodes").RuleOrDie()
|
nodePolicyRules = append(nodePolicyRules, csiNodeInfoRule)
|
||||||
nodePolicyRules = append(nodePolicyRules, csiNodeInfoRule)
|
|
||||||
}
|
|
||||||
|
|
||||||
// RuntimeClass
|
// RuntimeClass
|
||||||
nodePolicyRules = append(nodePolicyRules, rbacv1helpers.NewRule("get", "list", "watch").Groups("node.k8s.io").Resources("runtimeclasses").RuleOrDie())
|
nodePolicyRules = append(nodePolicyRules, rbacv1helpers.NewRule("get", "list", "watch").Groups("node.k8s.io").Resources("runtimeclasses").RuleOrDie())
|
||||||
|
@ -55,9 +55,6 @@ func TestNodeAuthorizer(t *testing.T) {
|
|||||||
// Enable DynamicKubeletConfig feature so that Node.Spec.ConfigSource can be set
|
// Enable DynamicKubeletConfig feature so that Node.Spec.ConfigSource can be set
|
||||||
defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.DynamicKubeletConfig, true)()
|
defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.DynamicKubeletConfig, true)()
|
||||||
|
|
||||||
// Enable CSINodeInfo feature so that nodes can create CSINode objects.
|
|
||||||
defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.CSINodeInfo, true)()
|
|
||||||
|
|
||||||
tokenFile, err := ioutil.TempFile("", "kubeconfig")
|
tokenFile, err := ioutil.TempFile("", "kubeconfig")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
|
@ -65,7 +65,6 @@ go_library(
|
|||||||
"//cmd/kube-apiserver/app:go_default_library",
|
"//cmd/kube-apiserver/app:go_default_library",
|
||||||
"//cmd/kube-apiserver/app/options:go_default_library",
|
"//cmd/kube-apiserver/app/options:go_default_library",
|
||||||
"//pkg/controlplane:go_default_library",
|
"//pkg/controlplane:go_default_library",
|
||||||
"//pkg/features:go_default_library",
|
|
||||||
"//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:go_default_library",
|
"//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:go_default_library",
|
||||||
"//staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset:go_default_library",
|
"//staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library",
|
||||||
@ -75,7 +74,6 @@ go_library(
|
|||||||
"//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/apiserver/pkg/server/options:go_default_library",
|
"//staging/src/k8s.io/apiserver/pkg/server/options:go_default_library",
|
||||||
"//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library",
|
|
||||||
"//staging/src/k8s.io/client-go/discovery/cached/memory:go_default_library",
|
"//staging/src/k8s.io/client-go/discovery/cached/memory:go_default_library",
|
||||||
"//staging/src/k8s.io/client-go/dynamic:go_default_library",
|
"//staging/src/k8s.io/client-go/dynamic:go_default_library",
|
||||||
"//staging/src/k8s.io/client-go/kubernetes:go_default_library",
|
"//staging/src/k8s.io/client-go/kubernetes:go_default_library",
|
||||||
|
@ -20,8 +20,6 @@ import (
|
|||||||
apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
|
apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
|
||||||
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"
|
||||||
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
|
||||||
"k8s.io/kubernetes/pkg/features"
|
|
||||||
"k8s.io/kubernetes/test/utils/image"
|
"k8s.io/kubernetes/test/utils/image"
|
||||||
"k8s.io/utils/pointer"
|
"k8s.io/utils/pointer"
|
||||||
)
|
)
|
||||||
@ -538,20 +536,18 @@ func GetEtcdStorageDataForNamespace(namespace string) map[schema.GroupVersionRes
|
|||||||
// --
|
// --
|
||||||
}
|
}
|
||||||
|
|
||||||
// add csinodes if CSINodeInfo feature gate is enabled
|
// add csinodes
|
||||||
if utilfeature.DefaultFeatureGate.Enabled(features.CSINodeInfo) {
|
// k8s.io/kubernetes/pkg/apis/storage/v1beta1
|
||||||
// k8s.io/kubernetes/pkg/apis/storage/v1beta1
|
etcdStorageData[gvr("storage.k8s.io", "v1beta1", "csinodes")] = StorageData{
|
||||||
etcdStorageData[gvr("storage.k8s.io", "v1beta1", "csinodes")] = StorageData{
|
Stub: `{"metadata": {"name": "csini1"}, "spec": {"drivers": [{"name": "test-driver", "nodeID": "localhost", "topologyKeys": ["company.com/zone1", "company.com/zone2"]}]}}`,
|
||||||
Stub: `{"metadata": {"name": "csini1"}, "spec": {"drivers": [{"name": "test-driver", "nodeID": "localhost", "topologyKeys": ["company.com/zone1", "company.com/zone2"]}]}}`,
|
ExpectedEtcdPath: "/registry/csinodes/csini1",
|
||||||
ExpectedEtcdPath: "/registry/csinodes/csini1",
|
ExpectedGVK: gvkP("storage.k8s.io", "v1", "CSINode"),
|
||||||
ExpectedGVK: gvkP("storage.k8s.io", "v1", "CSINode"),
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// k8s.io/kubernetes/pkg/apis/storage/v1
|
// k8s.io/kubernetes/pkg/apis/storage/v1
|
||||||
etcdStorageData[gvr("storage.k8s.io", "v1", "csinodes")] = StorageData{
|
etcdStorageData[gvr("storage.k8s.io", "v1", "csinodes")] = StorageData{
|
||||||
Stub: `{"metadata": {"name": "csini2"}, "spec": {"drivers": [{"name": "test-driver", "nodeID": "localhost", "topologyKeys": ["company.com/zone1", "company.com/zone2"]}]}}`,
|
Stub: `{"metadata": {"name": "csini2"}, "spec": {"drivers": [{"name": "test-driver", "nodeID": "localhost", "topologyKeys": ["company.com/zone1", "company.com/zone2"]}]}}`,
|
||||||
ExpectedEtcdPath: "/registry/csinodes/csini2",
|
ExpectedEtcdPath: "/registry/csinodes/csini2",
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// add csidrivers
|
// add csidrivers
|
||||||
|
@ -211,8 +211,7 @@ func TestPodDeletionWithDswp(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func initCSIObjects(stopCh chan struct{}, informers clientgoinformers.SharedInformerFactory) {
|
func initCSIObjects(stopCh chan struct{}, informers clientgoinformers.SharedInformerFactory) {
|
||||||
if utilfeature.DefaultFeatureGate.Enabled(features.CSIMigration) &&
|
if utilfeature.DefaultFeatureGate.Enabled(features.CSIMigration) {
|
||||||
utilfeature.DefaultFeatureGate.Enabled(features.CSINodeInfo) {
|
|
||||||
go informers.Storage().V1().CSINodes().Informer().Run(stopCh)
|
go informers.Storage().V1().CSINodes().Informer().Run(stopCh)
|
||||||
}
|
}
|
||||||
go informers.Storage().V1().CSIDrivers().Informer().Run(stopCh)
|
go informers.Storage().V1().CSIDrivers().Informer().Run(stopCh)
|
||||||
|
Loading…
Reference in New Issue
Block a user