1
0
Fork 0
mirror of https://github.com/moby/moby.git synced 2022-11-09 12:21:53 -05:00

Merge pull request #38414 from thaJeztah/minor_volume_tweaks

Some minor tweaks/refactoring of local volumes
This commit is contained in:
Brian Goff 2018-12-24 08:29:39 -08:00 committed by GitHub
commit 3587efed6b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 137 additions and 38 deletions

View file

@ -1828,6 +1828,32 @@ func (s *DockerSuite) TestContainersAPICreateMountsValidation(c *check.C) {
}...)
}
if DaemonIsWindows() {
cases = append(cases, []testCase{
{
config: containertypes.Config{
Image: "busybox",
},
hostConfig: containertypes.HostConfig{
Mounts: []mounttypes.Mount{
{
Type: "volume",
Source: "not-supported-on-windows",
Target: destPath,
VolumeOptions: &mounttypes.VolumeOptions{
DriverConfig: &mounttypes.Driver{
Name: "local",
Options: map[string]string{"type": "tmpfs"},
},
},
},
},
},
msg: `options are not supported on this platform`,
},
}...)
}
if DaemonIsLinux() {
cases = append(cases, []testCase{
{
@ -1835,14 +1861,83 @@ func (s *DockerSuite) TestContainersAPICreateMountsValidation(c *check.C) {
Image: "busybox",
},
hostConfig: containertypes.HostConfig{
Mounts: []mounttypes.Mount{{
Type: "volume",
Source: "hello3",
Target: destPath,
VolumeOptions: &mounttypes.VolumeOptions{
DriverConfig: &mounttypes.Driver{
Name: "local",
Options: map[string]string{"o": "size=1"}}}}}},
Mounts: []mounttypes.Mount{
{
Type: "volume",
Source: "missing-device-opt",
Target: destPath,
VolumeOptions: &mounttypes.VolumeOptions{
DriverConfig: &mounttypes.Driver{
Name: "local",
Options: map[string]string{"foobar": "foobaz"},
},
},
},
},
},
msg: `invalid option: "foobar"`,
},
{
config: containertypes.Config{
Image: "busybox",
},
hostConfig: containertypes.HostConfig{
Mounts: []mounttypes.Mount{
{
Type: "volume",
Source: "missing-device-opt",
Target: destPath,
VolumeOptions: &mounttypes.VolumeOptions{
DriverConfig: &mounttypes.Driver{
Name: "local",
Options: map[string]string{"type": "tmpfs"},
},
},
},
},
},
msg: `missing required option: "device"`,
},
{
config: containertypes.Config{
Image: "busybox",
},
hostConfig: containertypes.HostConfig{
Mounts: []mounttypes.Mount{
{
Type: "volume",
Source: "missing-type-opt",
Target: destPath,
VolumeOptions: &mounttypes.VolumeOptions{
DriverConfig: &mounttypes.Driver{
Name: "local",
Options: map[string]string{"device": "tmpfs"},
},
},
},
},
},
msg: `missing required option: "type"`,
},
{
config: containertypes.Config{
Image: "busybox",
},
hostConfig: containertypes.HostConfig{
Mounts: []mounttypes.Mount{
{
Type: "volume",
Source: "hello4",
Target: destPath,
VolumeOptions: &mounttypes.VolumeOptions{
DriverConfig: &mounttypes.Driver{
Name: "local",
Options: map[string]string{"o": "size=1", "type": "tmpfs", "device": "tmpfs"},
},
},
},
},
},
msg: "",
},
{
@ -1869,7 +1964,6 @@ func (s *DockerSuite) TestContainersAPICreateMountsValidation(c *check.C) {
}}}},
msg: "",
},
{
config: containertypes.Config{
Image: "busybox",
@ -1888,6 +1982,7 @@ func (s *DockerSuite) TestContainersAPICreateMountsValidation(c *check.C) {
c.Assert(err, checker.IsNil)
defer cli.Close()
// TODO add checks for statuscode returned by API
for i, x := range cases {
c.Logf("case %d", i)
_, err = cli.ContainerCreate(context.Background(), &x.config, &x.hostConfig, &networktypes.NetworkingConfig{}, "")

View file

@ -248,20 +248,12 @@ func (r *Root) Scope() string {
return volume.LocalScope
}
type validationError string
func (e validationError) Error() string {
return string(e)
}
func (e validationError) InvalidParameter() {}
func (r *Root) validateName(name string) error {
if len(name) == 1 {
return validationError("volume name is too short, names should be at least two alphanumeric characters")
return errdefs.InvalidParameter(errors.New("volume name is too short, names should be at least two alphanumeric characters"))
}
if !volumeNameRegex.MatchString(name) {
return validationError(fmt.Sprintf("%q includes invalid characters for a local volume name, only %q are allowed. If you intended to pass a host directory, use absolute path", name, names.RestrictedNameChars))
return errdefs.InvalidParameter(errors.Errorf("%q includes invalid characters for a local volume name, only %q are allowed. If you intended to pass a host directory, use absolute path", name, names.RestrictedNameChars))
}
return nil
}
@ -352,15 +344,6 @@ func (v *localVolume) unmount() error {
return nil
}
func validateOpts(opts map[string]string) error {
for opt := range opts {
if !validOpts[opt] {
return validationError(fmt.Sprintf("invalid option key: %q", opt))
}
}
return nil
}
func (v *localVolume) Status() map[string]interface{} {
return nil
}

View file

@ -14,18 +14,22 @@ import (
"syscall"
"time"
"github.com/pkg/errors"
"github.com/docker/docker/errdefs"
"github.com/docker/docker/pkg/mount"
"github.com/pkg/errors"
)
var (
oldVfsDir = filepath.Join("vfs", "dir")
validOpts = map[string]bool{
"type": true, // specify the filesystem type for mount, e.g. nfs
"o": true, // generic mount options
"device": true, // device to mount from
validOpts = map[string]struct{}{
"type": {}, // specify the filesystem type for mount, e.g. nfs
"o": {}, // generic mount options
"device": {}, // device to mount from
}
mandatoryOpts = map[string]struct{}{
"device": {},
"type": {},
}
)
@ -71,6 +75,23 @@ func setOpts(v *localVolume, opts map[string]string) error {
return nil
}
func validateOpts(opts map[string]string) error {
if len(opts) == 0 {
return nil
}
for opt := range opts {
if _, ok := validOpts[opt]; !ok {
return errdefs.InvalidParameter(errors.Errorf("invalid option: %q", opt))
}
}
for opt := range mandatoryOpts {
if _, ok := opts[opt]; !ok {
return errdefs.InvalidParameter(errors.Errorf("missing required option: %q", opt))
}
}
return nil
}
func (v *localVolume) mount() error {
if v.opts.MountDevice == "" {
return fmt.Errorf("missing device in volume options")

View file

@ -4,18 +4,18 @@
package local // import "github.com/docker/docker/volume/local"
import (
"fmt"
"os"
"path/filepath"
"strings"
"syscall"
"time"
"github.com/docker/docker/errdefs"
"github.com/pkg/errors"
)
type optsConfig struct{}
var validOpts map[string]bool
// scopedPath verifies that the path where the volume is located
// is under Docker's root and the valid local paths.
func (r *Root) scopedPath(realPath string) bool {
@ -27,7 +27,7 @@ func (r *Root) scopedPath(realPath string) bool {
func setOpts(v *localVolume, opts map[string]string) error {
if len(opts) > 0 {
return fmt.Errorf("options are not supported on this platform")
return errdefs.InvalidParameter(errors.New("options are not supported on this platform"))
}
return nil
}