summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoffrey F <joffrey@docker.com>2017-01-09 15:13:09 -0800
committerJoffrey F <joffrey@docker.com>2017-01-09 15:13:09 -0800
commit40089a781c3e12e628fe1cb8c6d60efa86402cf9 (patch)
tree719b3c61c58a8733e77093107e1cc13095edd97e
parent07b20ce660f4a4b1e64ef3ede346eef9ec08635a (diff)
downloaddocker-py-40089a781c3e12e628fe1cb8c6d60efa86402cf9.tar.gz
Detect mount type in parse_mount_string1376-parse-mount-type
Signed-off-by: Joffrey F <joffrey@docker.com>
-rw-r--r--docker/types/services.py12
-rw-r--r--tests/unit/dockertypes_test.py49
2 files changed, 48 insertions, 13 deletions
diff --git a/docker/types/services.py b/docker/types/services.py
index b52afd2..93503dc 100644
--- a/docker/types/services.py
+++ b/docker/types/services.py
@@ -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):
diff --git a/tests/unit/dockertypes_test.py b/tests/unit/dockertypes_test.py
index 5cf5f4e..d11e4f0 100644
--- a/tests/unit/dockertypes_test.py
+++ b/tests/unit/dockertypes_test.py
@@ -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'