in pkg/transformer/kubernetes/kubernetes.go [830:958]
func (k *Kubernetes) ConfigVolumes(name string, service kobject.ServiceConfig) ([]api.VolumeMount, []api.Volume, []*api.PersistentVolumeClaim, []*api.ConfigMap, error) {
volumeMounts := []api.VolumeMount{}
volumes := []api.Volume{}
var PVCs []*api.PersistentVolumeClaim
var cms []*api.ConfigMap
var volumeName string
// Set a var based on if the user wants to use empty volumes
// as opposed to persistent volumes and volume claims
useEmptyVolumes := k.Opt.EmptyVols
useHostPath := k.Opt.Volumes == "hostPath"
useConfigMap := k.Opt.Volumes == "configMap"
if k.Opt.Volumes == "emptyDir" {
useEmptyVolumes = true
}
// Override volume type if specified in service labels.
if vt, ok := service.Labels["kompose.volume.type"]; ok {
if _, okk := ValidVolumeSet[vt]; !okk {
return nil, nil, nil, nil, fmt.Errorf("invalid volume type %s specified in label 'kompose.volume.type' in service %s", vt, service.Name)
}
useEmptyVolumes = vt == "emptyDir"
useHostPath = vt == "hostPath"
useConfigMap = vt == "configMap"
}
// config volumes from secret if present
secretsVolumeMounts, secretsVolumes := k.ConfigSecretVolumes(name, service)
volumeMounts = append(volumeMounts, secretsVolumeMounts...)
volumes = append(volumes, secretsVolumes...)
var count int
//iterating over array of `Vols` struct as it contains all necessary information about volumes
for _, volume := range service.Volumes {
// check if ro/rw mode is defined, default rw
readonly := len(volume.Mode) > 0 && volume.Mode == "ro"
if volume.VolumeName == "" {
if useEmptyVolumes {
volumeName = strings.Replace(volume.PVCName, "claim", "empty", 1)
} else if useHostPath {
volumeName = strings.Replace(volume.PVCName, "claim", "hostpath", 1)
} else if useConfigMap {
volumeName = strings.Replace(volume.PVCName, "claim", "cm", 1)
} else {
volumeName = volume.PVCName
}
// to support service group bases on volume, we need use the new group name to replace the origin service name
// in volume name. For normal service, this should have no effect
volumeName = strings.Replace(volumeName, service.Name, name, 1)
count++
} else {
volumeName = volume.VolumeName
}
volMount := api.VolumeMount{
Name: volumeName,
ReadOnly: readonly,
MountPath: volume.Container,
}
// Get a volume source based on the type of volume we are using
// For PVC we will also create a PVC object and add to list
var volsource *api.VolumeSource
if useEmptyVolumes {
volsource = k.ConfigEmptyVolumeSource("volume")
} else if useHostPath {
source, err := k.ConfigHostPathVolumeSource(volume.Host)
if err != nil {
return nil, nil, nil, nil, errors.Wrap(err, "k.ConfigHostPathVolumeSource failed")
}
volsource = source
} else if useConfigMap {
log.Debugf("Use configmap volume")
if cm, err := k.IntiConfigMapFromFileOrDir(name, volumeName, volume.Host, service); err != nil {
return nil, nil, nil, nil, err
} else {
cms = append(cms, cm)
volsource = k.ConfigConfigMapVolumeSource(volumeName, volume.Container, cm)
if useSubPathMount(cm) {
volMount.SubPath = volsource.ConfigMap.Items[0].Path
}
}
} else {
volsource = k.ConfigPVCVolumeSource(volumeName, readonly)
if volume.VFrom == "" {
var storageClassName string
defaultSize := PVCRequestSize
if k.Opt.PVCRequestSize != "" {
defaultSize = k.Opt.PVCRequestSize
}
if len(volume.PVCSize) > 0 {
defaultSize = volume.PVCSize
} else {
for key, value := range service.Labels {
if key == "kompose.volume.size" {
defaultSize = value
} else if key == "kompose.volume.storage-class-name" {
storageClassName = value
}
}
}
createdPVC, err := k.CreatePVC(volumeName, volume.Mode, defaultSize, volume.SelectorValue, storageClassName)
if err != nil {
return nil, nil, nil, nil, errors.Wrap(err, "k.CreatePVC failed")
}
PVCs = append(PVCs, createdPVC)
}
}
volumeMounts = append(volumeMounts, volMount)
// create a new volume object using the volsource and add to list
vol := api.Volume{
Name: volumeName,
VolumeSource: *volsource,
}
volumes = append(volumes, vol)
if len(volume.Host) > 0 && (!useHostPath && !useConfigMap) {
log.Warningf("Volume mount on the host %q isn't supported - ignoring path on the host", volume.Host)
}
}
return volumeMounts, volumes, PVCs, cms, nil
}