func parseWindowsVolume()

in pkg/transformer/utils.go [131:196]


func parseWindowsVolume(volume string) (name, host, container, mode string, err error) {
	var (
		buffer, volumePaths []string
		volumeStrings       = strings.Split(volume, ":")
	)

	// extract path and leave order
	for _, fragment := range volumeStrings {
		switch {
		case containWindowsPath(fragment):
			if len(buffer) == 0 {
				err = fmt.Errorf("invalid windows volume %s", volume)
				return
			}

			driveLetter := buffer[len(buffer)-1]
			if len(driveLetter) != 1 {
				err = fmt.Errorf("invalid windows volume %s", volume)
				return
			}
			volumePaths = append(volumePaths, driveLetter+":"+fragment)
			buffer = buffer[:len(buffer)-1]

		case isPath(fragment):
			volumePaths = append(volumePaths, fragment)
		default:
			buffer = append(buffer, fragment)
		}
	}

	// set name and mode if exist
	if len(buffer) == 1 {
		if volumeStrings[0] == buffer[0] {
			name = buffer[0]
		} else if volumeStrings[len(volumeStrings)-1] == buffer[0] {
			mode = buffer[0]
		}
	} else if len(buffer) == 2 {
		name = buffer[0]
		mode = buffer[1]
	} else if len(buffer) > 2 {
		err = fmt.Errorf("invalid windows volume %s", volume)
		return
	}

	// Support in pass time
	// Check to see if :Z or :z exists. We do not support SELinux relabeling at the moment.
	// See https://github.com/kubernetes/kompose/issues/176
	// Otherwise, check to see if "rw" or "ro" has been passed
	if mode == "z" || mode == "Z" {
		log.Warnf("Volume mount \"%s\" will be mounted without labeling support. :z or :Z not supported", volume)
		mode = ""
	}

	// Set host and container if exist
	if len(volumePaths) == 1 {
		container = volumePaths[0]
	} else if len(volumePaths) == 2 {
		host = volumePaths[0]
		container = volumePaths[1]
	} else {
		err = fmt.Errorf("invalid windows volume %s", volume)
		return
	}
	return
}