code: func (pm *VolumePluginMgr) InitPlugins(plugins []VolumePlugin, prober DynamicPluginProber, host VolumeHost) error {
  	pm.mutex.Lock()
  	defer pm.mutex.Unlock()
  
  	pm.Host = host
  
  	if prober == nil {
  		// Use a dummy prober to prevent nil deference.
  		pm.prober = &dummyPluginProber{}
  	} else {
  		pm.prober = prober
  	}
  	if err := pm.prober.Init(); err != nil {
  		// Prober init failure should not affect the initialization of other plugins.
  		klog.Errorf("Error initializing dynamic plugin prober: %s", err)
  		pm.prober = &dummyPluginProber{}
  	}
  
  	if pm.plugins == nil {
  		pm.plugins = map[string]VolumePlugin{}
  	}
  	if pm.probedPlugins == nil {
  		pm.probedPlugins = map[string]VolumePlugin{}
  	}
  
  	allErrs := []error{}
  	for _, plugin := range plugins {
  		name := plugin.GetPluginName()
  		if errs := validation.IsQualifiedName(name); len(errs) != 0 {
  			allErrs = append(allErrs, fmt.Errorf("volume plugin has invalid name: %q: %s", name, strings.Join(errs, ";")))
  			continue
  		}
  
  		if _, found := pm.plugins[name]; found {
  			allErrs = append(allErrs, fmt.Errorf("volume plugin %q was registered more than once", name))
  			continue
  		}
  		err := plugin.Init(host)
  		if err != nil {
  			klog.Errorf("Failed to load volume plugin %s, error: %s", name, err.Error())
  			allErrs = append(allErrs, err)
  			continue
  		}
  		pm.plugins[name] = plugin
  		klog.V(1).Infof("Loaded volume plugin %q", name)
  	}
  	return utilerrors.NewAggregate(allErrs)
  }
docs: // InitPlugins initializes each plugin.  All plugins must have unique names.
  // This must be called exactly once before any New* methods are called on any
  // plugins.