# Copyright (c) 2014 - I.T. Dev Ltd
#
# This file is part of MCVirt.
#
# MCVirt is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
#
# MCVirt is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with MCVirt. If not, see <http://www.gnu.org/licenses/>
import unittest
import time
from mcvirt.virtual_machine.hard_drive.drbd import DrbdConnectionState
from mcvirt.exceptions import DrbdVolumeNotInSyncException
from mcvirt.system import System
from mcvirt.test.test_base import TestBase, skip_drbd
[docs]class DrbdTests(TestBase):
"""Provides unit tests for the Drbd hard drive class"""
@staticmethod
[docs] def suite():
"""Return a test suite of the Virtual Machine tests"""
suite = unittest.TestSuite()
suite.addTest(DrbdTests('test_verify'))
return suite
@skip_drbd(True)
def test_verify(self):
"""Test the Drbd verification for both in-sync and out-of-sync Drbd volumes"""
# Create Virtual machine
test_vm_object = self.create_vm('TEST_VM_1', 'Drbd')
self.assertTrue(self.vm_factory.check_exists(self.test_vms['TEST_VM_1']['name']))
# Wait for 10 seconds after creation to ensure that Drbd
# goes into connection -> Resyncing state
time.sleep(10)
# Wait until the Drbd resource is synced
for disk_object in test_vm_object.getHardDriveObjects():
self.rpc.annotate_object(disk_object)
wait_timeout = 6
while disk_object.drbdGetConnectionState() != DrbdConnectionState.CONNECTED:
# If the Drbd volume has not connected within 1 minute, throw an exception
if not wait_timeout:
raise DrbdVolumeNotInSyncException('Wait for Drbd connection timed out')
time.sleep(10)
wait_timeout -= 1
# Perform verification on VM, using the argument parser
self.parser.parse_arguments('verify %s' % self.test_vms['TEST_VM_1']['name'])
# Ensure the disks are in-sync
for disk_object in test_vm_object.getHardDriveObjects():
self.rpc_annotate_object(disk_object)
self.assertTrue(disk_object._isInSync())
# Obtain the Drbd raw volume for the VM and write random data to it
for disk_object in test_vm_object.getHardDriveObjects():
self.rpc.annotate_object(disk_object)
drbd_raw_suffix = disk_object.Drbd_RAW_SUFFIX
raw_logical_volume_name = disk_object._getLogicalVolumeName(drbd_raw_suffix)
raw_logical_volume_path = disk_object._getLogicalVolumePath(raw_logical_volume_name)
System.runCommand(['dd', 'if=/dev/urandom',
'of=%s' % raw_logical_volume_path,
'bs=1M', 'count=8'])
System.runCommand(['sync'])
# Perform another verification and ensure that an exception is raised
with self.assertRaises(DrbdVolumeNotInSyncException):
self.parser.parse_arguments('verify %s' % self.test_vms['TEST_VM_1']['name'])
# Attempt to start the VM, ensuring an exception is raised
with self.assertRaises(DrbdVolumeNotInSyncException):
test_vm_object.start()