Kaydet (Commit) 05267f63 authored tarafından Joffrey F's avatar Joffrey F

Modify unit tests suite to allow mock routes to optionally be method-aware

Added mock API routes for volumes API
Add unit tests and integration tests for volume API
Signed-off-by: 's avatarJoffrey F <joffrey@docker.com>
üst 46eb23b4
......@@ -27,7 +27,7 @@ class VolumeApiMixin(object):
@check_api_version
def create_volume(self, name, driver=None, driver_opts=None):
url = self._url('/volumes')
if not isinstance(driver_opts, dict):
if driver_opts is not None and not isinstance(driver_opts, dict):
raise TypeError('driver_opts must be a dictionary')
data = {
......@@ -35,7 +35,7 @@ class VolumeApiMixin(object):
'Driver': driver,
'DriverOpts': driver_opts,
}
return self._result(self._post(url, data=data), True)
return self._result(self._post_json(url, data=data), True)
@check_api_version
def inspect_volume(self, name):
......@@ -45,4 +45,6 @@ class VolumeApiMixin(object):
@check_api_version
def remove_volume(self, name):
url = self._url('/volumes/{0}', name)
return self._result(self._delete(url), True)
resp = self._delete(url)
self._raise_for_status(resp)
return True
......@@ -13,8 +13,9 @@
# limitations under the License.
from . import fake_stat
from docker import constants
CURRENT_VERSION = 'v1.19'
CURRENT_VERSION = 'v{0}'.format(constants.DEFAULT_DOCKER_API_VERSION)
FAKE_CONTAINER_ID = '3cc2351ab11b'
FAKE_IMAGE_ID = 'e9aa60c60128'
......@@ -26,6 +27,7 @@ FAKE_TAG_NAME = 'tag'
FAKE_FILE_NAME = 'file'
FAKE_URL = 'myurl'
FAKE_PATH = '/path'
FAKE_VOLUME_NAME = 'perfectcherryblossom'
# Each method is prefixed with HTTP method (get, post...)
# for clarity and readability
......@@ -380,6 +382,38 @@ def get_fake_stats():
response = fake_stat.OBJ
return status_code, response
def get_fake_volume_list():
status_code = 200
response = {
'Volumes': [
{
'Name': 'perfectcherryblossom',
'Driver': 'local',
'Mountpoint': '/var/lib/docker/volumes/perfectcherryblossom'
}, {
'Name': 'subterraneananimism',
'Driver': 'local',
'Mountpoint': '/var/lib/docker/volumes/subterraneananimism'
}
]
}
return status_code, response
def get_fake_volume():
status_code = 200
response = {
'Name': 'perfectcherryblossom',
'Driver': 'local',
'Mountpoint': '/var/lib/docker/volumes/perfectcherryblossom'
}
return status_code, response
def fake_remove_volume():
return 204, None
# Maps real api url to fake response callback
prefix = 'http+docker://localunixsocket'
fake_responses = {
......@@ -463,5 +497,17 @@ fake_responses = {
'{1}/{0}/build'.format(CURRENT_VERSION, prefix):
post_fake_build_container,
'{1}/{0}/events'.format(CURRENT_VERSION, prefix):
get_fake_events
get_fake_events,
('{1}/{0}/volumes'.format(CURRENT_VERSION, prefix), 'GET'):
get_fake_volume_list,
('{1}/{0}/volumes'.format(CURRENT_VERSION, prefix), 'POST'):
get_fake_volume,
('{1}/{0}/volumes/{2}'.format(
CURRENT_VERSION, prefix, FAKE_VOLUME_NAME
), 'GET'):
get_fake_volume,
('{1}/{0}/volumes/{2}'.format(
CURRENT_VERSION, prefix, FAKE_VOLUME_NAME
), 'DELETE'):
fake_remove_volume,
}
......@@ -77,6 +77,7 @@ class BaseTestCase(unittest.TestCase):
tmp_imgs = []
tmp_containers = []
tmp_folders = []
tmp_volumes = []
def setUp(self):
if six.PY2:
......@@ -101,6 +102,13 @@ class BaseTestCase(unittest.TestCase):
pass
for folder in self.tmp_folders:
shutil.rmtree(folder)
for volume in self.tmp_volumes:
try:
self.client.remove_volume(volume)
except docker.errors.APIError:
pass
self.client.close()
#########################
......@@ -223,6 +231,8 @@ class TestCreateContainerWithBinds(BaseTestCase):
if six.PY3:
logs = logs.decode('utf-8')
self.assertIn(filename, logs)
# FIXME: format changes in API version >= 1.20
inspect_data = self.client.inspect_container(container_id)
self.assertIn('Volumes', inspect_data)
self.assertIn(mount_dest, inspect_data['Volumes'])
......@@ -265,6 +275,8 @@ class TestCreateContainerWithRoBinds(BaseTestCase):
if six.PY3:
logs = logs.decode('utf-8')
self.assertIn(filename, logs)
# FIXME: format changes in API version >= 1.20
inspect_data = self.client.inspect_container(container_id)
self.assertIn('Volumes', inspect_data)
self.assertIn(mount_dest, inspect_data['Volumes'])
......@@ -1370,9 +1382,65 @@ class TestImportFromURL(ImportTestCase):
#################
# BUILDER TESTS #
# VOLUMES TESTS #
#################
@pytest.mark.skipif(docker.utils.compare_version(
'1.21', docker.constants.DEFAULT_DOCKER_API_VERSION
) < 0, reason="Volume API available for version >=1.21")
class TestVolumes(BaseTestCase):
def test_create_volume(self):
name = 'perfectcherryblossom'
result = self.client.create_volume(name)
self.tmp_volumes.append(name)
self.assertIn('Name', result)
self.assertEqual(result['Name'], name)
self.assertIn('Driver', result)
self.assertEqual(result['Driver'], 'local')
def test_create_volume_invalid_driver(self):
driver_name = 'invalid.driver'
with pytest.raises(docker.errors.NotFound):
self.client.create_volume('perfectcherryblossom', driver_name)
def test_list_volumes(self):
name = 'imperishablenight'
volume_info = self.client.create_volume(name)
self.tmp_volumes.append(name)
result = self.client.volumes()
self.assertIn('Volumes', result)
volumes = result['Volumes']
self.assertIn(volume_info, volumes)
def test_inspect_volume(self):
name = 'embodimentofscarletdevil'
volume_info = self.client.create_volume(name)
self.tmp_volumes.append(name)
result = self.client.inspect_volume(name)
self.assertEqual(volume_info, result)
def test_inspect_nonexistent_volume(self):
name = 'embodimentofscarletdevil'
with pytest.raises(docker.errors.NotFound):
self.client.inspect_volume(name)
def test_remove_volume(self):
name = 'shootthebullet'
self.client.create_volume(name)
self.tmp_volumes.append(name)
result = self.client.remove_volume(name)
self.assertTrue(result)
def test_remove_nonexistent_volume(self):
name = 'shootthebullet'
with pytest.raises(docker.errors.NotFound):
self.client.remove_volume(name)
#################
# BUILDER TESTS #
#################
class TestBuild(BaseTestCase):
def runTest(self):
......
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment