summaryrefslogtreecommitdiff
path: root/nova/tests/unit/image/test_transfer_modules.py
diff options
context:
space:
mode:
Diffstat (limited to 'nova/tests/unit/image/test_transfer_modules.py')
-rw-r--r--nova/tests/unit/image/test_transfer_modules.py101
1 files changed, 101 insertions, 0 deletions
diff --git a/nova/tests/unit/image/test_transfer_modules.py b/nova/tests/unit/image/test_transfer_modules.py
new file mode 100644
index 0000000000..51920c36aa
--- /dev/null
+++ b/nova/tests/unit/image/test_transfer_modules.py
@@ -0,0 +1,101 @@
+# All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+import urlparse
+
+import mock
+
+from nova import exception
+from nova.image.download import file as tm_file
+from nova import test
+
+
+class TestFileTransferModule(test.NoDBTestCase):
+
+ @mock.patch('nova.virt.libvirt.utils.copy_image')
+ def test_filesystem_success(self, copy_mock):
+ self.flags(allowed_direct_url_schemes=['file'], group='glance')
+ self.flags(group='image_file_url', filesystems=['gluster'])
+
+ mountpoint = '/gluster'
+ url = 'file:///gluster/my/image/path'
+ url_parts = urlparse.urlparse(url)
+ fs_id = 'someid'
+ loc_meta = {
+ 'id': fs_id,
+ 'mountpoint': mountpoint
+ }
+ dst_file = mock.MagicMock()
+
+ tm = tm_file.FileTransfer()
+
+ # NOTE(Jbresnah) The following options must be added after the module
+ # has added the specific groups.
+ self.flags(group='image_file_url:gluster', id=fs_id)
+ self.flags(group='image_file_url:gluster', mountpoint=mountpoint)
+
+ tm.download(mock.sentinel.ctx, url_parts, dst_file, loc_meta)
+ copy_mock.assert_called_once_with('/gluster/my/image/path', dst_file)
+
+ @mock.patch('nova.virt.libvirt.utils.copy_image')
+ def test_filesystem_mismatched_mountpoint(self, copy_mock):
+ self.flags(allowed_direct_url_schemes=['file'], group='glance')
+ self.flags(group='image_file_url', filesystems=['gluster'])
+
+ mountpoint = '/gluster'
+ # Should include the mountpoint before my/image/path
+ url = 'file:///my/image/path'
+ url_parts = urlparse.urlparse(url)
+ fs_id = 'someid'
+ loc_meta = {
+ 'id': fs_id,
+ 'mountpoint': mountpoint
+ }
+ dst_file = mock.MagicMock()
+
+ tm = tm_file.FileTransfer()
+
+ self.flags(group='image_file_url:gluster', id=fs_id)
+ self.flags(group='image_file_url:gluster', mountpoint=mountpoint)
+
+ self.assertRaises(exception.ImageDownloadModuleMetaDataError,
+ tm.download, mock.sentinel.ctx, url_parts,
+ dst_file, loc_meta)
+ self.assertFalse(copy_mock.called)
+
+ @mock.patch('nova.virt.libvirt.utils.copy_image')
+ def test_filesystem_mismatched_filesystem(self, copy_mock):
+ self.flags(allowed_direct_url_schemes=['file'], group='glance')
+ self.flags(group='image_file_url', filesystems=['gluster'])
+
+ mountpoint = '/gluster'
+ # Should include the mountpoint before my/image/path
+ url = 'file:///my/image/path'
+ url_parts = urlparse.urlparse(url)
+ fs_id = 'someid'
+ loc_meta = {
+ 'id': 'funky',
+ 'mountpoint': mountpoint
+ }
+ dst_file = mock.MagicMock()
+
+ tm = tm_file.FileTransfer()
+
+ self.flags(group='image_file_url:gluster', id=fs_id)
+ self.flags(group='image_file_url:gluster', mountpoint=mountpoint)
+
+ self.assertRaises(exception.ImageDownloadModuleError,
+ tm.download, mock.sentinel.ctx, url_parts,
+ dst_file, loc_meta)
+ self.assertFalse(copy_mock.called)