// newMounterInternal is the internal mounter routine to build the volume. func (plugin *flexVolumePlugin) newMounterInternal(spec *volume.Spec, pod *api.Pod, manager flexVolumeManager, mounter mount.Interface, runner exec.Interface, secrets map[string]string) (volume.Mounter, error) { source, _, err := getVolumeSource(spec) if err != nil { return nil, err } return &flexVolumeMounter{ flexVolumeDisk: &flexVolumeDisk{ podUID: pod.UID, podNamespace: pod.Namespace, podName: pod.Name, volName: spec.Name(), driverName: source.Driver, execPath: plugin.getExecutable(), mounter: mounter, plugin: plugin, secrets: secrets, }, fsType: source.FSType, readOnly: source.ReadOnly, options: source.Options, runner: runner, manager: manager, blockDeviceMounter: &mount.SafeFormatAndMount{Interface: mounter, Runner: runner}, }, nil }
func (plugin *configMapPlugin) NewMounter(spec *volume.Spec, pod *api.Pod, opts volume.VolumeOptions) (volume.Mounter, error) { return &configMapVolumeMounter{ configMapVolume: &configMapVolume{spec.Name(), pod.UID, plugin, plugin.host.GetMounter(), plugin.host.GetWriter(), volume.MetricsNil{}}, source: *spec.Volume.ConfigMap, pod: *pod, opts: &opts}, nil }
func newDeleter(spec *volume.Spec, host volume.VolumeHost) (volume.Deleter, error) { if spec.PersistentVolume != nil && spec.PersistentVolume.Spec.HostPath == nil { return nil, fmt.Errorf("spec.PersistentVolumeSource.HostPath is nil") } path := spec.PersistentVolume.Spec.HostPath.Path return &hostPathDeleter{name: spec.Name(), path: path, host: host}, nil }
func (plugin *gcePersistentDiskPlugin) newMounterInternal(spec *volume.Spec, podUID types.UID, manager pdManager, mounter mount.Interface) (volume.Mounter, error) { // GCEPDs used directly in a pod have a ReadOnly flag set by the pod author. // GCEPDs used as a PersistentVolume gets the ReadOnly flag indirectly through the persistent-claim volume used to mount the PV volumeSource, readOnly, err := getVolumeSource(spec) if err != nil { return nil, err } pdName := volumeSource.PDName partition := "" if volumeSource.Partition != 0 { partition = strconv.Itoa(int(volumeSource.Partition)) } return &gcePersistentDiskMounter{ gcePersistentDisk: &gcePersistentDisk{ podUID: podUID, volName: spec.Name(), pdName: pdName, partition: partition, mounter: mounter, manager: manager, plugin: plugin, MetricsProvider: volume.NewMetricsStatFS(getPath(podUID, spec.Name(), plugin.host)), }, readOnly: readOnly}, nil }
func (plugin *emptyDirPlugin) GetVolumeName(spec *volume.Spec) (string, error) { volumeSource, _ := getVolumeSource(spec) if volumeSource == nil { return "", fmt.Errorf("Spec does not reference an EmptyDir volume type") } // Return user defined volume name, since this is an ephemeral volume type return spec.Name(), nil }
func (plugin *gcePersistentDiskPlugin) newDeleterInternal(spec *volume.Spec, manager pdManager) (volume.Deleter, error) { if spec.PersistentVolume != nil && spec.PersistentVolume.Spec.GCEPersistentDisk == nil { return nil, fmt.Errorf("spec.PersistentVolumeSource.GCEPersistentDisk is nil") } return &gcePersistentDiskDeleter{ gcePersistentDisk: &gcePersistentDisk{ volName: spec.Name(), pdName: spec.PersistentVolume.Spec.GCEPersistentDisk.PDName, manager: manager, plugin: plugin, }}, nil }
func (dsw *desiredStateOfWorld) AddPodToVolume( podName types.UniquePodName, pod *api.Pod, volumeSpec *volume.Spec, outerVolumeSpecName string, volumeGidValue string) (api.UniqueVolumeName, error) { dsw.Lock() defer dsw.Unlock() volumePlugin, err := dsw.volumePluginMgr.FindPluginBySpec(volumeSpec) if err != nil || volumePlugin == nil { return "", fmt.Errorf( "failed to get Plugin from volumeSpec for volume %q err=%v", volumeSpec.Name(), err) } volumeName, err := volumehelper.GetUniqueVolumeNameFromSpec(volumePlugin, volumeSpec) if err != nil { return "", fmt.Errorf( "failed to GetUniqueVolumeNameFromSpec for volumeSpec %q using volume plugin %q err=%v", volumeSpec.Name(), volumePlugin.GetPluginName(), err) } volumeObj, volumeExists := dsw.volumesToMount[volumeName] if !volumeExists { volumeObj = volumeToMount{ volumeName: volumeName, podsToMount: make(map[types.UniquePodName]podToMount), pluginIsAttachable: dsw.isAttachableVolume(volumeSpec), volumeGidValue: volumeGidValue, reportedInUse: false, } dsw.volumesToMount[volumeName] = volumeObj } // Create new podToMount object. If it already exists, it is refreshed with // updated values (this is required for volumes that require remounting on // pod update, like Downward API volumes). dsw.volumesToMount[volumeName].podsToMount[podName] = podToMount{ podName: podName, pod: pod, spec: volumeSpec, outerVolumeSpecName: outerVolumeSpecName, } return volumeName, nil }
func newRecycler(pvName string, spec *volume.Spec, host volume.VolumeHost, config volume.VolumeConfig) (volume.Recycler, error) { if spec.PersistentVolume == nil || spec.PersistentVolume.Spec.HostPath == nil { return nil, fmt.Errorf("spec.PersistentVolumeSource.HostPath is nil") } path := spec.PersistentVolume.Spec.HostPath.Path return &hostPathRecycler{ name: spec.Name(), path: path, host: host, config: config, timeout: volume.CalculateTimeoutForVolume(config.RecyclerMinimumTimeout, config.RecyclerTimeoutIncrement, spec.PersistentVolume), pvName: pvName, }, nil }
func (plugin *glusterfsPlugin) newMounterInternal(spec *volume.Spec, ep *api.Endpoints, pod *api.Pod, mounter mount.Interface, exe exec.Interface) (volume.Mounter, error) { source, readOnly := plugin.getGlusterVolumeSource(spec) return &glusterfsMounter{ glusterfs: &glusterfs{ volName: spec.Name(), mounter: mounter, pod: pod, plugin: plugin, }, hosts: ep, path: source.Path, readOnly: readOnly, exe: exe}, nil }
func (plugin *emptyDirPlugin) newMounterInternal(spec *volume.Spec, pod *api.Pod, mounter mount.Interface, mountDetector mountDetector, opts volume.VolumeOptions) (volume.Mounter, error) { medium := api.StorageMediumDefault if spec.Volume.EmptyDir != nil { // Support a non-specified source as EmptyDir. medium = spec.Volume.EmptyDir.Medium } return &emptyDir{ pod: pod, volName: spec.Name(), medium: medium, mounter: mounter, mountDetector: mountDetector, plugin: plugin, rootContext: plugin.host.GetRootContext(), MetricsProvider: volume.NewMetricsDu(getPath(pod.UID, spec.Name(), plugin.host)), }, nil }
func (plugin *cephfsPlugin) newMounterInternal(spec *volume.Spec, podUID types.UID, mounter mount.Interface, secret string) (volume.Mounter, error) { cephvs, _, err := getVolumeSource(spec) if err != nil { return nil, err } id := cephvs.User if id == "" { id = "admin" } path := cephvs.Path if path == "" { path = "/" } if !strings.HasPrefix(path, "/") { path = "/" + path } secret_file := cephvs.SecretFile if secret_file == "" { secret_file = "/etc/ceph/" + id + ".secret" } return &cephfsMounter{ cephfs: &cephfs{ podUID: podUID, volName: spec.Name(), mon: cephvs.Monitors, path: path, secret: secret, id: id, secret_file: secret_file, readonly: cephvs.ReadOnly, mounter: mounter, plugin: plugin}, }, nil }
func (attacher *gcePersistentDiskAttacher) MountDevice(spec *volume.Spec, devicePath string, deviceMountPath string) error { // Only mount the PD globally once. mounter := attacher.host.GetMounter() notMnt, err := mounter.IsLikelyNotMountPoint(deviceMountPath) if err != nil { if os.IsNotExist(err) { if err := os.MkdirAll(deviceMountPath, 0750); err != nil { return err } notMnt = true } else { return err } } volumeSource, readOnly, err := getVolumeSource(spec) if err != nil { return err } options := []string{} if readOnly { options = append(options, "ro") } if notMnt { diskMounter := &mount.SafeFormatAndMount{Interface: mounter, Runner: exec.New()} err = diskMounter.FormatAndMount(devicePath, deviceMountPath, volumeSource.FSType, options) if err != nil { os.Remove(deviceMountPath) return err } glog.V(4).Infof("formatting spec %v devicePath %v deviceMountPath %v fs %v with options %+v", spec.Name(), devicePath, deviceMountPath, volumeSource.FSType, options) } return nil }