Refactor: Extract ParseIDMap func to idtools package
where it belongs. I have noticed that this parsing gets spread across projects. Basically, the very same method is present in libpod, buildah, and cri-o projects. We better start re-using this code from single place or soon everyone has its own version. Signed-off-by: Šimon Lukašík <slukasik@redhat.com>
This commit is contained in:
parent
faa0af096d
commit
e21bdabbab
|
@ -6,8 +6,6 @@ import (
|
|||
"io"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"github.com/containers/storage"
|
||||
"github.com/containers/storage/opts"
|
||||
|
@ -50,52 +48,6 @@ func paramIDMapping() (*storage.IDMappingOptions, error) {
|
|||
if paramSubUIDMap == "" && paramSubGIDMap != "" {
|
||||
paramSubUIDMap = paramSubGIDMap
|
||||
}
|
||||
nonDigitsToWhitespace := func(r rune) rune {
|
||||
if strings.IndexRune("0123456789", r) == -1 {
|
||||
return ' '
|
||||
} else {
|
||||
return r
|
||||
}
|
||||
}
|
||||
parseTriple := func(spec []string) (container, host, size uint32, err error) {
|
||||
cid, err := strconv.ParseUint(spec[0], 10, 32)
|
||||
if err != nil {
|
||||
return 0, 0, 0, fmt.Errorf("error parsing id map value %q: %v", spec[0], err)
|
||||
}
|
||||
hid, err := strconv.ParseUint(spec[1], 10, 32)
|
||||
if err != nil {
|
||||
return 0, 0, 0, fmt.Errorf("error parsing id map value %q: %v", spec[1], err)
|
||||
}
|
||||
sz, err := strconv.ParseUint(spec[2], 10, 32)
|
||||
if err != nil {
|
||||
return 0, 0, 0, fmt.Errorf("error parsing id map value %q: %v", spec[2], err)
|
||||
}
|
||||
return uint32(cid), uint32(hid), uint32(sz), nil
|
||||
}
|
||||
parseIDMap := func(idMapSpec, mapType string) (idmap []idtools.IDMap, err error) {
|
||||
if len(idMapSpec) > 0 {
|
||||
idSpec := strings.Fields(strings.Map(nonDigitsToWhitespace, idMapSpec))
|
||||
if len(idSpec)%3 != 0 {
|
||||
return nil, fmt.Errorf("%s map is malformed", mapType)
|
||||
}
|
||||
for i := range idSpec {
|
||||
if i%3 != 0 {
|
||||
continue
|
||||
}
|
||||
cid, hid, size, err := parseTriple(idSpec[i : i+3])
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("%s map is malformed", mapType)
|
||||
}
|
||||
mapping := idtools.IDMap{
|
||||
ContainerID: int(cid),
|
||||
HostID: int(hid),
|
||||
Size: int(size),
|
||||
}
|
||||
idmap = append(idmap, mapping)
|
||||
}
|
||||
}
|
||||
return idmap, nil
|
||||
}
|
||||
if paramSubUIDMap != "" && paramSubGIDMap != "" {
|
||||
mappings, err := idtools.NewIDMappings(paramSubUIDMap, paramSubGIDMap)
|
||||
if err != nil {
|
||||
|
@ -104,11 +56,11 @@ func paramIDMapping() (*storage.IDMappingOptions, error) {
|
|||
options.UIDMap = mappings.UIDs()
|
||||
options.GIDMap = mappings.GIDs()
|
||||
}
|
||||
parsedUIDMap, err := parseIDMap(paramUIDMap, "uid")
|
||||
parsedUIDMap, err := idtools.ParseIDMap(paramUIDMap, "uid")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
parsedGIDMap, err := parseIDMap(paramGIDMap, "gid")
|
||||
parsedGIDMap, err := idtools.ParseIDMap(paramGIDMap, "gid")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
|
|
@ -0,0 +1,56 @@
|
|||
package idtools
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func nonDigitsToWhitespace(r rune) rune {
|
||||
if !strings.ContainsRune("0123456789", r) {
|
||||
return ' '
|
||||
}
|
||||
return r
|
||||
}
|
||||
|
||||
func parseTriple(spec []string) (container, host, size uint32, err error) {
|
||||
cid, err := strconv.ParseUint(spec[0], 10, 32)
|
||||
if err != nil {
|
||||
return 0, 0, 0, fmt.Errorf("error parsing id map value %q: %v", spec[0], err)
|
||||
}
|
||||
hid, err := strconv.ParseUint(spec[1], 10, 32)
|
||||
if err != nil {
|
||||
return 0, 0, 0, fmt.Errorf("error parsing id map value %q: %v", spec[1], err)
|
||||
}
|
||||
sz, err := strconv.ParseUint(spec[2], 10, 32)
|
||||
if err != nil {
|
||||
return 0, 0, 0, fmt.Errorf("error parsing id map value %q: %v", spec[2], err)
|
||||
}
|
||||
return uint32(cid), uint32(hid), uint32(sz), nil
|
||||
}
|
||||
|
||||
// ParseIDMap parses idmap triples from string.
|
||||
func ParseIDMap(idMapSpec, mapSetting string) (idmap []IDMap, err error) {
|
||||
if len(idMapSpec) > 0 {
|
||||
idSpec := strings.Fields(strings.Map(nonDigitsToWhitespace, idMapSpec))
|
||||
if len(idSpec)%3 != 0 {
|
||||
return nil, fmt.Errorf("error initializing ID mappings: %s setting is malformed", mapSetting)
|
||||
}
|
||||
for i := range idSpec {
|
||||
if i%3 != 0 {
|
||||
continue
|
||||
}
|
||||
cid, hid, size, err := parseTriple(idSpec[i : i+3])
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("error initializing ID mappings: %s setting is malformed", mapSetting)
|
||||
}
|
||||
mapping := IDMap{
|
||||
ContainerID: int(cid),
|
||||
HostID: int(hid),
|
||||
Size: int(size),
|
||||
}
|
||||
idmap = append(idmap, mapping)
|
||||
}
|
||||
}
|
||||
return idmap, nil
|
||||
}
|
|
@ -8,7 +8,6 @@ import (
|
|||
"os"
|
||||
"path/filepath"
|
||||
"reflect"
|
||||
"strconv"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
|
@ -3203,56 +3202,19 @@ func ReloadConfigurationFile(configFile string, storeOptions *StoreOptions) {
|
|||
storeOptions.UIDMap = mappings.UIDs()
|
||||
storeOptions.GIDMap = mappings.GIDs()
|
||||
}
|
||||
nonDigitsToWhitespace := func(r rune) rune {
|
||||
if strings.IndexRune("0123456789", r) == -1 {
|
||||
return ' '
|
||||
} else {
|
||||
return r
|
||||
}
|
||||
|
||||
uidmap, err := idtools.ParseIDMap(config.Storage.Options.RemapUIDs, "remap-uids")
|
||||
if err != nil {
|
||||
fmt.Print(err)
|
||||
} else {
|
||||
storeOptions.UIDMap = append(storeOptions.UIDMap, uidmap...)
|
||||
}
|
||||
parseTriple := func(spec []string) (container, host, size uint32, err error) {
|
||||
cid, err := strconv.ParseUint(spec[0], 10, 32)
|
||||
if err != nil {
|
||||
return 0, 0, 0, fmt.Errorf("error parsing id map value %q: %v", spec[0], err)
|
||||
}
|
||||
hid, err := strconv.ParseUint(spec[1], 10, 32)
|
||||
if err != nil {
|
||||
return 0, 0, 0, fmt.Errorf("error parsing id map value %q: %v", spec[1], err)
|
||||
}
|
||||
sz, err := strconv.ParseUint(spec[2], 10, 32)
|
||||
if err != nil {
|
||||
return 0, 0, 0, fmt.Errorf("error parsing id map value %q: %v", spec[2], err)
|
||||
}
|
||||
return uint32(cid), uint32(hid), uint32(sz), nil
|
||||
gidmap, err := idtools.ParseIDMap(config.Storage.Options.RemapGIDs, "remap-gids")
|
||||
if err != nil {
|
||||
fmt.Print(err)
|
||||
} else {
|
||||
storeOptions.GIDMap = append(storeOptions.GIDMap, gidmap...)
|
||||
}
|
||||
parseIDMap := func(idMapSpec, mapSetting string) (idmap []idtools.IDMap) {
|
||||
if len(idMapSpec) > 0 {
|
||||
idSpec := strings.Fields(strings.Map(nonDigitsToWhitespace, idMapSpec))
|
||||
if len(idSpec)%3 != 0 {
|
||||
fmt.Printf("Error initializing ID mappings: %s setting is malformed.\n", mapSetting)
|
||||
return nil
|
||||
}
|
||||
for i := range idSpec {
|
||||
if i%3 != 0 {
|
||||
continue
|
||||
}
|
||||
cid, hid, size, err := parseTriple(idSpec[i : i+3])
|
||||
if err != nil {
|
||||
fmt.Printf("Error initializing ID mappings: %s setting is malformed.\n", mapSetting)
|
||||
return nil
|
||||
}
|
||||
mapping := idtools.IDMap{
|
||||
ContainerID: int(cid),
|
||||
HostID: int(hid),
|
||||
Size: int(size),
|
||||
}
|
||||
idmap = append(idmap, mapping)
|
||||
}
|
||||
}
|
||||
return idmap
|
||||
}
|
||||
storeOptions.UIDMap = append(storeOptions.UIDMap, parseIDMap(config.Storage.Options.RemapUIDs, "remap-uids")...)
|
||||
storeOptions.GIDMap = append(storeOptions.GIDMap, parseIDMap(config.Storage.Options.RemapGIDs, "remap-gids")...)
|
||||
if os.Getenv("STORAGE_DRIVER") != "" {
|
||||
storeOptions.GraphDriverName = os.Getenv("STORAGE_DRIVER")
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue