mirror of https://github.com/docker/docker-py.git
Merge pull request #1385 from docker/1376-parse-mount-type
Detect mount type in parse_mount_string
This commit is contained in:
commit
56cfe0bf09
|
@ -1,6 +1,7 @@
|
|||
import six
|
||||
|
||||
from .. import errors
|
||||
from ..constants import IS_WINDOWS_PLATFORM
|
||||
from ..utils import format_environment, split_command
|
||||
|
||||
|
||||
|
@ -175,8 +176,17 @@ class Mount(dict):
|
|||
else:
|
||||
target = parts[1]
|
||||
source = parts[0]
|
||||
mount_type = 'volume'
|
||||
if source.startswith('/') or (
|
||||
IS_WINDOWS_PLATFORM and source[0].isalpha() and
|
||||
source[1] == ':'
|
||||
):
|
||||
# FIXME: That windows condition will fail earlier since we
|
||||
# split on ':'. We should look into doing a smarter split
|
||||
# if we detect we are on Windows.
|
||||
mount_type = 'bind'
|
||||
read_only = not (len(parts) == 2 or parts[2] == 'rw')
|
||||
return cls(target, source, read_only=read_only)
|
||||
return cls(target, source, read_only=read_only, type=mount_type)
|
||||
|
||||
|
||||
class Resources(dict):
|
||||
|
|
|
@ -10,6 +10,11 @@ from docker.types import (
|
|||
EndpointConfig, HostConfig, IPAMConfig, IPAMPool, LogConfig, Mount, Ulimit,
|
||||
)
|
||||
|
||||
try:
|
||||
from unittest import mock
|
||||
except:
|
||||
import mock
|
||||
|
||||
|
||||
def create_host_config(*args, **kwargs):
|
||||
return HostConfig(*args, **kwargs)
|
||||
|
@ -258,28 +263,48 @@ class IPAMConfigTest(unittest.TestCase):
|
|||
class TestMounts(unittest.TestCase):
|
||||
def test_parse_mount_string_ro(self):
|
||||
mount = Mount.parse_mount_string("/foo/bar:/baz:ro")
|
||||
self.assertEqual(mount['Source'], "/foo/bar")
|
||||
self.assertEqual(mount['Target'], "/baz")
|
||||
self.assertEqual(mount['ReadOnly'], True)
|
||||
assert mount['Source'] == "/foo/bar"
|
||||
assert mount['Target'] == "/baz"
|
||||
assert mount['ReadOnly'] is True
|
||||
|
||||
def test_parse_mount_string_rw(self):
|
||||
mount = Mount.parse_mount_string("/foo/bar:/baz:rw")
|
||||
self.assertEqual(mount['Source'], "/foo/bar")
|
||||
self.assertEqual(mount['Target'], "/baz")
|
||||
self.assertEqual(mount['ReadOnly'], False)
|
||||
assert mount['Source'] == "/foo/bar"
|
||||
assert mount['Target'] == "/baz"
|
||||
assert not mount['ReadOnly']
|
||||
|
||||
def test_parse_mount_string_short_form(self):
|
||||
mount = Mount.parse_mount_string("/foo/bar:/baz")
|
||||
self.assertEqual(mount['Source'], "/foo/bar")
|
||||
self.assertEqual(mount['Target'], "/baz")
|
||||
self.assertEqual(mount['ReadOnly'], False)
|
||||
assert mount['Source'] == "/foo/bar"
|
||||
assert mount['Target'] == "/baz"
|
||||
assert not mount['ReadOnly']
|
||||
|
||||
def test_parse_mount_string_no_source(self):
|
||||
mount = Mount.parse_mount_string("foo/bar")
|
||||
self.assertEqual(mount['Source'], None)
|
||||
self.assertEqual(mount['Target'], "foo/bar")
|
||||
self.assertEqual(mount['ReadOnly'], False)
|
||||
assert mount['Source'] is None
|
||||
assert mount['Target'] == "foo/bar"
|
||||
assert not mount['ReadOnly']
|
||||
|
||||
def test_parse_mount_string_invalid(self):
|
||||
with pytest.raises(InvalidArgument):
|
||||
Mount.parse_mount_string("foo:bar:baz:rw")
|
||||
|
||||
def test_parse_mount_named_volume(self):
|
||||
mount = Mount.parse_mount_string("foobar:/baz")
|
||||
assert mount['Source'] == 'foobar'
|
||||
assert mount['Target'] == '/baz'
|
||||
assert mount['Type'] == 'volume'
|
||||
|
||||
def test_parse_mount_bind(self):
|
||||
mount = Mount.parse_mount_string('/foo/bar:/baz')
|
||||
assert mount['Source'] == "/foo/bar"
|
||||
assert mount['Target'] == "/baz"
|
||||
assert mount['Type'] == 'bind'
|
||||
|
||||
@pytest.mark.xfail
|
||||
def test_parse_mount_bind_windows(self):
|
||||
with mock.patch('docker.types.services.IS_WINDOWS_PLATFORM', True):
|
||||
mount = Mount.parse_mount_string('C:/foo/bar:/baz')
|
||||
assert mount['Source'] == "C:/foo/bar"
|
||||
assert mount['Target'] == "/baz"
|
||||
assert mount['Type'] == 'bind'
|
||||
|
|
Loading…
Reference in New Issue