type PluginNameMapper … type PluginManager … // NewPluginManager returns a new PluginManager instance func NewPluginManager(m PluginNameMapper, featureGate featuregate.FeatureGate) PluginManager { … } // IsMigrationCompleteForPlugin indicates whether CSI migration has been completed // for a particular storage plugin. A complete migration will need to: // 1. Enable CSIMigrationXX for the plugin // 2. Unregister the in-tree plugin by setting the InTreePluginXXUnregister feature gate func (pm PluginManager) IsMigrationCompleteForPlugin(pluginName string) bool { … } // IsMigrationEnabledForPlugin indicates whether CSI migration has been enabled // for a particular storage plugin func (pm PluginManager) IsMigrationEnabledForPlugin(pluginName string) bool { … } // IsMigratable indicates whether CSI migration has been enabled for a volume // plugin that the spec refers to func (pm PluginManager) IsMigratable(spec *volume.Spec) (bool, error) { … } type InTreeToCSITranslator … // TranslateInTreeSpecToCSI translates a volume spec (either PV or inline volume) // supported by an in-tree plugin to CSI func TranslateInTreeSpecToCSI(logger klog.Logger, spec *volume.Spec, podNamespace string, translator InTreeToCSITranslator) (*volume.Spec, error) { … } // CheckMigrationFeatureFlags checks the configuration of feature flags related // to CSI Migration is valid. It will return whether the migration is complete // by looking up the pluginUnregister flag func CheckMigrationFeatureFlags(f featuregate.FeatureGate, pluginMigration, pluginUnregister featuregate.Feature) (migrationComplete bool, err error) { … }