diff --git a/cmd/kubelet/app/plugins.go b/cmd/kubelet/app/plugins.go index bb9daed5061..4ec7a295a85 100644 --- a/cmd/kubelet/app/plugins.go +++ b/cmd/kubelet/app/plugins.go @@ -52,6 +52,11 @@ func ProbeVolumePlugins(featureGate featuregate.FeatureGate) ([]volume.VolumePlu // // Kubelet does not currently need to configure volume plugins. // If/when it does, see kube-controller-manager/app/plugins.go for example of using volume.VolumeConfig + var err error + allPlugins, err = appendLegacyProviderVolumes(allPlugins, featureGate) + if err != nil { + return allPlugins, err + } allPlugins = append(allPlugins, emptydir.ProbeVolumePlugins()...) allPlugins = append(allPlugins, git_repo.ProbeVolumePlugins()...) allPlugins = append(allPlugins, hostpath.ProbeVolumePlugins(volume.VolumeConfig{})...) diff --git a/cmd/kubelet/app/plugins_providers.go b/cmd/kubelet/app/plugins_providers.go new file mode 100644 index 00000000000..147125e3a9f --- /dev/null +++ b/cmd/kubelet/app/plugins_providers.go @@ -0,0 +1,69 @@ +/* +Copyright 2019 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package app + +import ( + "k8s.io/component-base/featuregate" + "k8s.io/csi-translation-lib/plugins" + "k8s.io/klog/v2" + "k8s.io/kubernetes/pkg/features" + "k8s.io/kubernetes/pkg/volume" + "k8s.io/kubernetes/pkg/volume/csimigration" + "k8s.io/kubernetes/pkg/volume/portworx" + "k8s.io/kubernetes/pkg/volume/rbd" +) + +type probeFn func() []volume.VolumePlugin + +func appendPluginBasedOnFeatureFlags(plugins []volume.VolumePlugin, inTreePluginName string, + featureGate featuregate.FeatureGate, pluginInfo pluginInfo) ([]volume.VolumePlugin, error) { + _, err := csimigration.CheckMigrationFeatureFlags(featureGate, pluginInfo.pluginMigrationFeature, pluginInfo.pluginUnregisterFeature) + if err != nil { + klog.InfoS("Unexpected CSI Migration Feature Flags combination detected, CSI Migration may not take effect", "err", err) + // TODO: fail and return here once alpha only tests can set the feature flags for a plugin correctly + } + + // Skip appending the in-tree plugin to the list of plugins to be probed/initialized + // if the plugin unregister feature flag is set + if featureGate.Enabled(pluginInfo.pluginUnregisterFeature) { + klog.InfoS("Skipped registration of plugin since feature flag is enabled", "pluginName", inTreePluginName, "featureFlag", pluginInfo.pluginUnregisterFeature) + return plugins, nil + } + + plugins = append(plugins, pluginInfo.pluginProbeFunction()...) + return plugins, nil +} + +type pluginInfo struct { + pluginMigrationFeature featuregate.Feature + pluginUnregisterFeature featuregate.Feature + pluginProbeFunction probeFn +} + +func appendLegacyProviderVolumes(allPlugins []volume.VolumePlugin, featureGate featuregate.FeatureGate) ([]volume.VolumePlugin, error) { + pluginMigrationStatus := make(map[string]pluginInfo) + pluginMigrationStatus[plugins.PortworxVolumePluginName] = pluginInfo{pluginMigrationFeature: features.CSIMigrationPortworx, pluginUnregisterFeature: features.InTreePluginPortworxUnregister, pluginProbeFunction: portworx.ProbeVolumePlugins} + pluginMigrationStatus[plugins.RBDVolumePluginName] = pluginInfo{pluginMigrationFeature: features.CSIMigrationRBD, pluginUnregisterFeature: features.InTreePluginRBDUnregister, pluginProbeFunction: rbd.ProbeVolumePlugins} + var err error + for pluginName, pluginInfo := range pluginMigrationStatus { + allPlugins, err = appendPluginBasedOnFeatureFlags(allPlugins, pluginName, featureGate, pluginInfo) + if err != nil { + return allPlugins, err + } + } + return allPlugins, nil +}