mirror of
https://github.com/containers/skopeo.git
synced 2025-09-22 02:18:41 +00:00
Vendor c/image after merging vrothberg/image:regsv2-docker
Also update the user and tests for the API change.
This commit is contained in:
163
vendor/github.com/containers/storage/store.go
generated
vendored
163
vendor/github.com/containers/storage/store.go
generated
vendored
@@ -8,7 +8,6 @@ import (
|
||||
"os"
|
||||
"path/filepath"
|
||||
"reflect"
|
||||
"strconv"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
@@ -22,9 +21,11 @@ import (
|
||||
"github.com/containers/storage/pkg/directory"
|
||||
"github.com/containers/storage/pkg/idtools"
|
||||
"github.com/containers/storage/pkg/ioutils"
|
||||
"github.com/containers/storage/pkg/parsers"
|
||||
"github.com/containers/storage/pkg/stringid"
|
||||
"github.com/containers/storage/pkg/stringutils"
|
||||
digest "github.com/opencontainers/go-digest"
|
||||
"github.com/opencontainers/selinux/go-selinux/label"
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
||||
@@ -251,6 +252,8 @@ type Store interface {
|
||||
|
||||
// Mount attempts to mount a layer, image, or container for access, and
|
||||
// returns the pathname if it succeeds.
|
||||
// Note if the mountLabel == "", the default label for the container
|
||||
// will be used.
|
||||
//
|
||||
// Note that we do some of this work in a child process. The calling
|
||||
// process's main() function needs to import our pkg/reexec package and
|
||||
@@ -497,6 +500,9 @@ type ContainerOptions struct {
|
||||
// container's layer will inherit settings from the image's top layer
|
||||
// or, if it is not being created based on an image, the Store object.
|
||||
IDMappingOptions
|
||||
LabelOpts []string
|
||||
Flags map[string]interface{}
|
||||
MountOpts []string
|
||||
}
|
||||
|
||||
type store struct {
|
||||
@@ -1064,7 +1070,7 @@ func (s *store) imageTopLayerForMapping(image *Image, ristore ROImageStore, read
|
||||
}
|
||||
mappedLayer, _, err := rlstore.Put("", parentLayer, nil, layer.MountLabel, nil, &layerOptions, false, nil, rc)
|
||||
if err != nil {
|
||||
return nil, errors.Wrapf(err, "error creating ID-mapped copy of layer %q")
|
||||
return nil, errors.Wrapf(err, "error creating ID-mapped copy of layer %q", parentLayer.ID)
|
||||
}
|
||||
if err = istore.addMappedTopLayer(image.ID, mappedLayer.ID); err != nil {
|
||||
if err2 := rlstore.Delete(mappedLayer.ID); err2 != nil {
|
||||
@@ -1175,7 +1181,26 @@ func (s *store) CreateContainer(id string, names []string, image, layer, metadat
|
||||
},
|
||||
}
|
||||
}
|
||||
clayer, err := rlstore.Create(layer, imageTopLayer, nil, "", nil, layerOptions, true)
|
||||
if options.Flags == nil {
|
||||
options.Flags = make(map[string]interface{})
|
||||
}
|
||||
plabel, _ := options.Flags["ProcessLabel"].(string)
|
||||
mlabel, _ := options.Flags["MountLabel"].(string)
|
||||
if (plabel == "" && mlabel != "") ||
|
||||
(plabel != "" && mlabel == "") {
|
||||
return nil, errors.Errorf("ProcessLabel and Mountlabel must either not be specified or both specified")
|
||||
}
|
||||
|
||||
if plabel == "" {
|
||||
processLabel, mountLabel, err := label.InitLabels(options.LabelOpts)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
options.Flags["ProcessLabel"] = processLabel
|
||||
options.Flags["MountLabel"] = mountLabel
|
||||
}
|
||||
|
||||
clayer, err := rlstore.Create(layer, imageTopLayer, nil, options.Flags["MountLabel"].(string), nil, layerOptions, true)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -1189,13 +1214,11 @@ func (s *store) CreateContainer(id string, names []string, image, layer, metadat
|
||||
if modified, err := rcstore.Modified(); modified || err != nil {
|
||||
rcstore.Load()
|
||||
}
|
||||
options = &ContainerOptions{
|
||||
IDMappingOptions: IDMappingOptions{
|
||||
HostUIDMapping: len(options.UIDMap) == 0,
|
||||
HostGIDMapping: len(options.GIDMap) == 0,
|
||||
UIDMap: copyIDMap(options.UIDMap),
|
||||
GIDMap: copyIDMap(options.GIDMap),
|
||||
},
|
||||
options.IDMappingOptions = IDMappingOptions{
|
||||
HostUIDMapping: len(options.UIDMap) == 0,
|
||||
HostGIDMapping: len(options.GIDMap) == 0,
|
||||
UIDMap: copyIDMap(options.UIDMap),
|
||||
GIDMap: copyIDMap(options.GIDMap),
|
||||
}
|
||||
container, err := rcstore.Create(id, names, imageID, layer, metadata, options)
|
||||
if err != nil || container == nil {
|
||||
@@ -2123,21 +2146,20 @@ func (s *store) DeleteContainer(id string) error {
|
||||
if err = rlstore.Delete(container.LayerID); err != nil {
|
||||
return err
|
||||
}
|
||||
if err = rcstore.Delete(id); err != nil {
|
||||
return err
|
||||
}
|
||||
middleDir := s.graphDriverName + "-containers"
|
||||
gcpath := filepath.Join(s.GraphRoot(), middleDir, container.ID)
|
||||
if err = os.RemoveAll(gcpath); err != nil {
|
||||
return err
|
||||
}
|
||||
rcpath := filepath.Join(s.RunRoot(), middleDir, container.ID)
|
||||
if err = os.RemoveAll(rcpath); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
return ErrNotALayer
|
||||
if err = rcstore.Delete(id); err != nil {
|
||||
return err
|
||||
}
|
||||
middleDir := s.graphDriverName + "-containers"
|
||||
gcpath := filepath.Join(s.GraphRoot(), middleDir, container.ID)
|
||||
if err = os.RemoveAll(gcpath); err != nil {
|
||||
return err
|
||||
}
|
||||
rcpath := filepath.Join(s.RunRoot(), middleDir, container.ID)
|
||||
if err = os.RemoveAll(rcpath); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
}
|
||||
return ErrNotAContainer
|
||||
@@ -2258,10 +2280,14 @@ func (s *store) Version() ([][2]string, error) {
|
||||
|
||||
func (s *store) Mount(id, mountLabel string) (string, error) {
|
||||
container, err := s.Container(id)
|
||||
var uidMap, gidMap []idtools.IDMap
|
||||
var (
|
||||
uidMap, gidMap []idtools.IDMap
|
||||
mountOpts []string
|
||||
)
|
||||
if err == nil {
|
||||
uidMap, gidMap = container.UIDMap, container.GIDMap
|
||||
id = container.LayerID
|
||||
mountOpts = container.MountOpts()
|
||||
}
|
||||
rlstore, err := s.LayerStore()
|
||||
if err != nil {
|
||||
@@ -2273,7 +2299,13 @@ func (s *store) Mount(id, mountLabel string) (string, error) {
|
||||
rlstore.Load()
|
||||
}
|
||||
if rlstore.Exists(id) {
|
||||
return rlstore.Mount(id, mountLabel, uidMap, gidMap)
|
||||
options := drivers.MountOpts{
|
||||
MountLabel: mountLabel,
|
||||
UidMaps: uidMap,
|
||||
GidMaps: gidMap,
|
||||
Options: mountOpts,
|
||||
}
|
||||
return rlstore.Mount(id, options)
|
||||
}
|
||||
return "", ErrLayerUnknown
|
||||
}
|
||||
@@ -3176,56 +3208,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([]string{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([]string{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")
|
||||
}
|
||||
@@ -3244,3 +3239,23 @@ func init() {
|
||||
|
||||
ReloadConfigurationFile(defaultConfigFile, &DefaultStoreOptions)
|
||||
}
|
||||
|
||||
func GetDefaultMountOptions() ([]string, error) {
|
||||
mountOpts := []string{
|
||||
".mountopt",
|
||||
fmt.Sprintf("%s.mountopt", DefaultStoreOptions.GraphDriverName),
|
||||
}
|
||||
for _, option := range DefaultStoreOptions.GraphDriverOptions {
|
||||
key, val, err := parsers.ParseKeyValueOpt(option)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
key = strings.ToLower(key)
|
||||
for _, m := range mountOpts {
|
||||
if m == key {
|
||||
return strings.Split(val, ","), nil
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil, nil
|
||||
}
|
||||
|
Reference in New Issue
Block a user