code: func (v *sioVolume) setSioMgrFromSpec() error {
  	klog.V(4).Info(log("setting sio manager from spec"))
  	if v.sioMgr == nil {
  		// get config data form spec volume source
  		configData := map[string]string{}
  		mapVolumeSpec(configData, v.spec)
  
  		// additional config
  		configData[confKey.secretNamespace] = v.secretNamespace
  		configData[confKey.secretName] = v.secretName
  		configData[confKey.volSpecName] = v.volSpecName
  
  		if err := validateConfigs(configData); err != nil {
  			klog.Error(log("config setup failed: %s", err))
  			return err
  		}
  
  		// attach secret object to config data
  		if err := attachSecret(v.plugin, v.secretNamespace, configData); err != nil {
  			klog.Error(log("failed to load secret: %v", err))
  			return err
  		}
  
  		mgr, err := newSioMgr(configData, v.plugin.host.GetExec(v.plugin.GetPluginName()))
  
  		if err != nil {
  			klog.Error(log("failed to reset sio manager: %v", err))
  			return err
  		}
  		v.sioMgr = mgr
  	}
  	return nil
  }
docs: // setSioMgrFromSpec sets the scaleio manager from a spec object.
  // The spec may be complete or incomplete depending on lifecycle phase.