83 lines
3.0 KiB
Python
83 lines
3.0 KiB
Python
# Copyright 2019 Cloudbase Solutions Srl
|
|
# 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 os
|
|
import tempfile
|
|
|
|
from os_win import constants
|
|
from os_win.tests.functional import test_base
|
|
from os_win import utilsfactory
|
|
|
|
|
|
class VhdUtilsTestCase(test_base.OsWinBaseFunctionalTestCase):
|
|
def setUp(self):
|
|
super(VhdUtilsTestCase, self).setUp()
|
|
self._vhdutils = utilsfactory.get_vhdutils()
|
|
self._diskutils = utilsfactory.get_diskutils()
|
|
self._pathutils = utilsfactory.get_pathutils()
|
|
|
|
def _create_temp_vhd(self, size_mb=32,
|
|
vhd_type=constants.VHD_TYPE_DYNAMIC):
|
|
f = tempfile.TemporaryFile(suffix='.vhdx', prefix='oswin_vhdtest_')
|
|
f.close()
|
|
|
|
self._vhdutils.create_vhd(f.name, vhd_type,
|
|
max_internal_size=size_mb << 20)
|
|
self.addCleanup(os.unlink, f.name)
|
|
return f.name
|
|
|
|
def _create_temp_symlink(self, target, target_is_dir):
|
|
f = tempfile.TemporaryFile(prefix='oswin_vhdtest_link_')
|
|
f.close()
|
|
|
|
self._pathutils.create_sym_link(f.name, target, target_is_dir)
|
|
if target_is_dir:
|
|
self.addCleanup(os.rmdir, f.name)
|
|
else:
|
|
self.addCleanup(os.unlink, f.name)
|
|
|
|
return f.name
|
|
|
|
def test_attach_detach(self):
|
|
vhd_path = self._create_temp_vhd()
|
|
# We'll make sure that we can detect attached vhds, even when the
|
|
# paths contain symlinks.
|
|
vhd_link = self._create_temp_symlink(vhd_path, target_is_dir=False)
|
|
vhd_dir_link = self._create_temp_symlink(os.path.dirname(vhd_path),
|
|
target_is_dir=True)
|
|
# A second, indirect link.
|
|
vhd_link2 = os.path.join(vhd_dir_link,
|
|
os.path.basename(vhd_path))
|
|
|
|
def _check_attached(expect_attached):
|
|
# Let's try both approaches and all paths pointing to our image.
|
|
paths = [vhd_path, vhd_link, vhd_link2]
|
|
for path in paths:
|
|
self.assertEqual(
|
|
expect_attached,
|
|
self._vhdutils.is_virtual_disk_file_attached(path))
|
|
self.assertEqual(
|
|
expect_attached,
|
|
self._diskutils.is_virtual_disk_file_attached(path))
|
|
|
|
_check_attached(False)
|
|
|
|
try:
|
|
self._vhdutils.attach_virtual_disk(vhd_path)
|
|
_check_attached(True)
|
|
finally:
|
|
self._vhdutils.detach_virtual_disk(vhd_path)
|
|
_check_attached(False)
|