// +build linux package volume import ( "fmt" "strings" mounttypes "github.com/docker/docker/api/types/mount" ) // ConvertTmpfsOptions converts *mounttypes.TmpfsOptions to the raw option string // for mount(2). // The logic is copy-pasted from daemon/cluster/executer/container.getMountMask. // It will be deduplicated when we migrated the cluster to the new mount scheme. func ConvertTmpfsOptions(opt *mounttypes.TmpfsOptions) (string, error) { if opt == nil { return "", nil } var rawOpts []string if opt.Mode != 0 { rawOpts = append(rawOpts, fmt.Sprintf("mode=%o", opt.Mode)) } if opt.SizeBytes != 0 { // calculate suffix here, making this linux specific, but that is // okay, since API is that way anyways. // we do this by finding the suffix that divides evenly into the // value, returing the value itself, with no suffix, if it fails. // // For the most part, we don't enforce any semantic to this values. // The operating system will usually align this and enforce minimum // and maximums. var ( size = opt.SizeBytes suffix string ) for _, r := range []struct { suffix string divisor int64 }{ {"g", 1 << 30}, {"m", 1 << 20}, {"k", 1 << 10}, } { if size%r.divisor == 0 { size = size / r.divisor suffix = r.suffix break } } rawOpts = append(rawOpts, fmt.Sprintf("size=%d%s", size, suffix)) } return strings.Join(rawOpts, ","), nil }