import re
import os
import logging
import aexpect
from avocado.utils import process
from virttest import virt_vm
from virttest import data_dir
from virttest import remote
from virttest import utils_test
def prepare_attached_device(test, guestfs, device):
"""
Prepare attached device for block test.
:param guestfs: instance of GuestfishTools
:param device: attached device
"""
list_dev_result = guestfs.list_devices()
logging.debug(list_dev_result)
if list_dev_result.exit_status:
guestfs.close_session()
test.fail("List devices failed")
else:
if not re.search(device, list_dev_result.stdout):
guestfs.close_session()
test.fail("Did not find additional device.")
logging.info("List devices successfully.")
creates, createo = guestfs.create_msdos_part(device)
if creates is False:
guestfs.close_session()
test.fail(createo)
logging.info("Create partition successfully.")
return "%s%s" % (device, createo)
def test_create_vol_group(test, vm, params):
"""
1) Fall into guestfish session w/ inspector
2) Do some necessary check
3) Format additional disk with part-add
4) Create a volume group
5) Check volume group in guestfish with vgs
6) Login vm to check whether volume group is ok
"""
add_device = params.get("gf_additional_device", "/dev/vdb")
device_in_gf = process.run("echo %s | sed -e 's/vd/sd/g'" % add_device,
ignore_status=True, shell=True).stdout_text.strip()
vt = utils_test.libguestfs.VirtTools(vm, params)
vt.update_vm_disk()
params['libvirt_domain'] = vt.newvm.name
params['gf_inspector'] = True
gf = utils_test.libguestfs.GuestfishTools(params)
part_name = prepare_attached_device(test, gf, device_in_gf)
groupname = params.get("gf_volume_group_name", "VolGroupTest")
vgcreate_result = gf.vgcreate(groupname, part_name)
logging.info(vgcreate_result)
if vgcreate_result.exit_status:
gf.close_session()
test.fail("Create volume group failed.")
logging.info("Create volume group successfully.")
vgs_result = gf.vgs()
gf.close_session()
logging.info(vgs_result)
if vgs_result.exit_status:
test.fail("List volume groups failed.")
else:
if not re.search(groupname, vgs_result.stdout):
test.fail("Can't get volume group %s." % groupname)
logging.info("Got volume group %s", groupname)
attached_vm = vt.newvm
try:
attached_vm.start()
session = attached_vm.wait_for_login()
if session.cmd_status("which vgs"):
logging.error("Did not find command 'vgs' in guest, SKIP...")
attached_vm.destroy()
attached_vm.wait_for_shutdown()
return
except (virt_vm.VMError, remote.LoginError) as detail:
attached_vm.destroy()
test.fail(str(detail))
try:
vgs = session.cmd_output("vgs --all", timeout=5)
logging.debug(vgs)
attached_vm.destroy()
attached_vm.wait_for_shutdown()
except (virt_vm.VMError, remote.LoginError, aexpect.ShellError) as detail:
if attached_vm.is_alive():
attached_vm.destroy()
test.fail(str(detail))
if not re.search("\s%s\s" % groupname, vgs):
test.fail("Get volume group %s in vm failed" % groupname)
logging.info("Get volume group %s in guest.", groupname)
def test_rename_vol_group(test, vm, params):
"""
1) Fall into guestfish session w/ inspector
2) Do some necessary check
3) Format additional disk with part-add
4) Create a volume group
5) Check volume group in guestfish with vgs
6) Rename volume group
7) Login vm to check whether volume group is ok
"""
add_device = params.get("gf_additional_device", "/dev/vdb")
device_in_gf = process.run("echo %s | sed -e 's/vd/sd/g'" % add_device,
ignore_status=True, shell=True).stdout_text.strip()
vt = utils_test.libguestfs.VirtTools(vm, params)
vt.update_vm_disk()
params['libvirt_domain'] = vt.newvm.name
params['gf_inspector'] = True
gf = utils_test.libguestfs.GuestfishTools(params)
part_name = prepare_attached_device(gf, device_in_gf)
groupname = params.get("gf_volume_group_name", "VolGroupTest")
vgcreate_result = gf.vgcreate(groupname, part_name)
logging.info(vgcreate_result)
if vgcreate_result.exit_status:
gf.close_session()
test.fail("Create volume group failed.")
logging.info("Create volume group successfully.")
vgs_result = gf.vgs()
logging.info(vgs_result)
if vgs_result.exit_status:
gf.close_session()
test.fail("List volume groups failed.")
else:
if not re.search(groupname, vgs_result.stdout):
gf.close_session()
test.fail("Can't get volume group %s." % groupname)
logging.info("Got volume group %s", groupname)
newgroupname = "%sRename" % groupname
vgrename_result = gf.vgrename(groupname, newgroupname)
gf.close_session()
logging.info(vgrename_result)
if vgrename_result.exit_status:
test.fail("Rename volume group failed.")
logging.info("Rename volume group %s successfully", groupname)
attached_vm = vt.newvm
try:
attached_vm.start()
session = attached_vm.wait_for_login()
if session.cmd_status("which vgs"):
logging.error("Did not find command 'vgs' in guest, SKIP...")
attached_vm.destroy()
attached_vm.wait_for_shutdown()
return
except (virt_vm.VMError, remote.LoginError) as detail:
attached_vm.destroy()
test.fail(str(detail))
try:
vgs = session.cmd_output("vgs --all", timeout=5)
logging.debug(vgs)
attached_vm.destroy()
attached_vm.wait_for_shutdown()
except (virt_vm.VMError, remote.LoginError, aexpect.ShellError) as detail:
if attached_vm.is_alive():
attached_vm.destroy()
test.fail(str(detail))
if not re.search("\s%s\s" % newgroupname, str(vgs)):
test.fail("Get volume group %s in vm failed" % newgroupname)
logging.info("Get volume group %s in guest.", newgroupname)
def test_remove_vol_group(test, vm, params):
"""
1) Fall into guestfish session w/ inspector
2) Do some necessary check
3) Format additional disk with part-add
4) Create a volume group
5) Check volume group exist in guestfish with vgs
6) Remove created volume group
7) Check volume group not exist in guestfish with vgs
"""
add_device = params.get("gf_additional_device", "/dev/vdb")
device_in_gf = process.run("echo %s | sed -e 's/vd/sd/g'" % add_device,
ignore_status=True, shell=True).stdout_text.strip()
vt = utils_test.libguestfs.VirtTools(vm, params)
vt.update_vm_disk()
params['libvirt_domain'] = vt.newvm.name
params['gf_inspector'] = True
gf = utils_test.libguestfs.GuestfishTools(params)
part_name = prepare_attached_device(gf, device_in_gf)
groupname = params.get("gf_volume_group_name", "VolGroupTest")
vgcreate_result = gf.vgcreate(groupname, part_name)
logging.info(vgcreate_result)
if vgcreate_result.exit_status:
gf.close_session()
test.fail("Create volume group failed.")
logging.info("Create volume group successfully.")
vgs_result = gf.vgs()
logging.info(vgs_result)
if vgs_result.exit_status:
gf.close_session()
test.fail("List volume groups failed.")
else:
if not re.search(groupname, vgs_result.stdout):
gf.close_session()
test.fail("Can't get volume group %s." % groupname)
logging.info("Got volume group %s", groupname)
vgremove_result = gf.vgremove(groupname)
logging.info(vgremove_result)
if vgremove_result.exit_status:
gf.close_session()
test.fail("Remove volume group failed.")
logging.info("Remove volume group %s successfully", groupname)
vgs_result = gf.vgs()
logging.info(vgs_result)
gf.close_session()
if vgs_result.exit_status:
test.fail("List volume groups failed.")
else:
if re.search(groupname, vgs_result.stdout):
test.fail("Are you sure volume group %s deleted "
"successfully?" % groupname)
logging.info("Volume group %s did not deleted as expected!", groupname)
def test_create_volume(test, vm, params):
"""
1) Fall into guestfish session w/ inspector
2) Do some necessary check
3) Format additional disk with part-add
4) Create a volume group
5) Create a volume in created volume group
6) Get volume infomation with lvxxx commands
7) Login vm to check whether volume is ok
"""
add_device = params.get("gf_additional_device", "/dev/vdb")
device_in_gf = process.run("echo %s | sed -e 's/vd/sd/g'" % add_device,
ignore_status=True, shell=True).stdout_text.strip()
vt = utils_test.libguestfs.VirtTools(vm, params)
vt.update_vm_disk()
params['libvirt_domain'] = vt.newvm.name
params['gf_inspector'] = True
gf = utils_test.libguestfs.GuestfishTools(params)
part_name = prepare_attached_device(gf, device_in_gf)
groupname = params.get("gf_volume_group_name", "VolGroupTest")
vgcreate_result = gf.vgcreate(groupname, part_name)
logging.info(vgcreate_result)
if vgcreate_result.exit_status:
gf.close_session()
test.fail("Create volume group failed.")
logging.info("Create volume group successfully.")
vgs_result = gf.vgs()
logging.info(vgs_result)
if vgs_result.exit_status:
gf.close_session()
test.fail("List volume groups failed.")
else:
if not re.search(groupname, vgs_result.stdout):
gf.close_session()
test.fail("Can't get volume group %s." % groupname)
logging.info("Got volume group %s", groupname)
volumename = params.get("gf_volume_name", "VolTest")
lv_device = "/dev/%s/%s" % (groupname, volumename)
volumesize = params.get("gf_volume_size", "40")
lvcreate_result = gf.lvcreate(volumename, groupname, volumesize)
logging.info(lvcreate_result)
if lvcreate_result.exit_status:
gf.close_session()
test.fail("Create volume failed.")
logging.info("Create volume successfully.")
lvs_result = gf.lvs()
logging.info(lvs_result)
if lvs_result.exit_status:
gf.close_session()
test.fail("List volume groups failed.")
else:
if not re.search(volumename, lvs_result.stdout):
gf.close_session()
test.fail("Can't get volume %s." % volumename)
logging.info("Got volume %s", volumename)
lvuuid_result = gf.lvuuid(lv_device)
logging.debug(lvuuid_result)
if lvuuid_result.exit_status:
gf.close_session()
test.fail("Get volume uuid failed.")
logging.info("Get volume uuid successfully.")
canon_lv_name_result = gf.lvm_canonical_lv_name(lv_device)
logging.debug(canon_lv_name_result)
gf.close_session()
if canon_lv_name_result.exit_status:
test.fail("Get canonical volume name failed.")
logging.info("Get canonical volume name successfully.")
attached_vm = vt.newvm
try:
attached_vm.start()
session = attached_vm.wait_for_login()
if session.cmd_status("which lvs"):
logging.error("Did not find command 'lvs' in guest, SKIP...")
attached_vm.destroy()
attached_vm.wait_for_shutdown()
return
except (virt_vm.VMError, remote.LoginError) as detail:
attached_vm.destroy()
test.fail(str(detail))
try:
lvs = session.cmd_output("lvs --all", timeout=5)
logging.debug(lvs)
attached_vm.destroy()
attached_vm.wait_for_shutdown()
except (virt_vm.VMError, remote.LoginError, aexpect.ShellError) as detail:
if attached_vm.is_alive():
attached_vm.destroy()
test.fail(str(detail))
if not re.search("\s%s\s" % volumename, lvs):
test.fail("Get volume %s in vm failed" % volumename)
logging.info("Get volume %s in guest.", volumename)
def test_delete_volume(test, vm, params):
"""
1) Fall into guestfish session w/ inspector
2) Do some necessary check
3) Format additional disk with part-add
4) Create a volume group
5) Create a volume in created volume group
6) Delete created volume
"""
add_device = params.get("gf_additional_device", "/dev/vdb")
device_in_gf = process.run("echo %s | sed -e 's/vd/sd/g'" % add_device,
ignore_status=True, shell=True).stdout_text.strip()
vt = utils_test.libguestfs.VirtTools(vm, params)
vt.update_vm_disk()
params['libvirt_domain'] = vt.newvm.name
params['gf_inspector'] = True
gf = utils_test.libguestfs.GuestfishTools(params)
part_name = prepare_attached_device(gf, device_in_gf)
groupname = params.get("gf_volume_group_name", "VolGroupTest")
vgcreate_result = gf.vgcreate(groupname, part_name)
logging.info(vgcreate_result)
if vgcreate_result.exit_status:
gf.close_session()
test.fail("Create volume group failed.")
logging.info("Create volume group successfully.")
vgs_result = gf.vgs()
logging.info(vgs_result)
if vgs_result.exit_status:
gf.close_session()
test.fail("List volume groups failed.")
else:
if not re.search(groupname, vgs_result.stdout):
gf.close_session()
test.fail("Can't get volume group %s." % groupname)
logging.info("Got volume group %s", groupname)
volumename = params.get("gf_volume_name", "VolTest")
lv_device = "/dev/%s/%s" % (groupname, volumename)
volumesize = params.get("gf_volume_size", "40")
lvcreate_result = gf.lvcreate(volumename, groupname, volumesize)
logging.info(lvcreate_result)
if lvcreate_result.exit_status:
gf.close_session()
test.fail("Create volume failed.")
logging.info("Create volume successfully.")
lvs_result = gf.lvs()
logging.info(lvs_result)
if lvs_result.exit_status:
gf.close_session()
test.fail("List volume groups failed.")
else:
if not re.search(volumename, lvs_result.stdout):
gf.close_session()
test.fail("Can't get volume %s." % volumename)
logging.info("Got volume %s", volumename)
lvremove_result = gf.lvremove(lv_device)
logging.info(lvremove_result)
if lvremove_result.exit_status:
gf.close_session()
test.fail("Remove volume failed.")
logging.info("Remove volume successfully.")
lvs_result = gf.lvs()
logging.info(lvs_result)
gf.close_session()
if lvs_result.exit_status:
test.fail("List volume groups failed.")
else:
if re.search(volumename, lvs_result.stdout):
test.fail("Are you sure volume %s removed as "
"expected?" % volumename)
def test_shrink_volume(test, vm, params):
"""
1) Fall into guestfish session w/ inspector
2) Do some necessary check
3) Format additional disk with part-add
4) Create a volume group
5) Create a volume in created volume group
6) Format volume device
7) Login vm to dd a image file and get md5 value
8) Refall into guestfish session w/ inspector
9) Shrink volume size
10) Try to get md5 again
"""
add_device = params.get("gf_additional_device", "/dev/vdb")
device_in_gf = process.run("echo %s | sed -e 's/vd/sd/g'" % add_device,
ignore_status=True, shell=True).stdout_text.strip()
vt = utils_test.libguestfs.VirtTools(vm, params)
vt.update_vm_disk()
params['libvirt_domain'] = vt.newvm.name
params['gf_inspector'] = True
gf = utils_test.libguestfs.GuestfishTools(params)
part_name = prepare_attached_device(gf, device_in_gf)
groupname = params.get("gf_volume_group_name", "VolGroupTest")
vgcreate_result = gf.vgcreate(groupname, part_name)
logging.info(vgcreate_result)
if vgcreate_result.exit_status:
gf.close_session()
test.fail("Create volume group failed.")
logging.info("Create volume group successfully.")
vgs_result = gf.vgs()
logging.info(vgs_result)
if vgs_result.exit_status:
gf.close_session()
test.fail("List volume groups failed.")
else:
if not re.search(groupname, vgs_result.stdout):
gf.close_session()
test.fail("Can't get volume group %s." % groupname)
logging.info("Got volume group %s", groupname)
volumename = params.get("gf_volume_name", "VolTest")
lv_device = "/dev/%s/%s" % (groupname, volumename)
volumesize = params.get("gf_volume_size", "40")
lvcreate_result = gf.lvcreate(volumename, groupname, volumesize)
logging.info(lvcreate_result)
if lvcreate_result.exit_status:
gf.close_session()
test.fail("Create volume failed.")
logging.info("Create volume successfully.")
lvs_result = gf.lvs()
logging.info(lvs_result)
if lvs_result.exit_status:
gf.close_session()
test.fail("List volume groups failed.")
else:
if not re.search(volumename, lvs_result.stdout):
gf.close_session()
test.fail("Can't get volume %s." % volumename)
logging.info("Got volume %s", volumename)
mkfs_result = gf.mkfs("ext3", lv_device)
logging.debug(mkfs_result)
gf.close_session()
if mkfs_result.exit_status:
test.fail("Format %s Failed" % lv_device)
logging.info("Format %s successfully.", lv_device)
attached_vm = vt.newvm
try:
attached_vm.start()
session = attached_vm.wait_for_login()
if session.cmd_status("which vgs"):
attached_vm.destroy()
attached_vm.wait_for_shutdown()
test.cancel("Can not use volume group in guest,"
"SKIP THIS CASE...")
except (virt_vm.VMError, remote.LoginError) as detail:
attached_vm.destroy()
test.fail(str(detail))
mountpoint = params.get("gf_mountpoint", "/mnt")
file_path = "%s/test_shrink_volume.img" % mountpoint
try:
dd_size1 = int(volumesize) / 2
logging.debug(session.cmd_output("ls /dev/"))
status, output = session.cmd_status_output("mount %s %s" % (lv_device,
mountpoint), timeout=10)
if status:
raise utils_test.libguestfs.VTMountError("", output)
else:
output = session.cmd_output("df", timeout=10)
logging.debug(output)
if not re.search(mountpoint, str(output)):
raise utils_test.libguestfs.VTMountError("df", output)
output = session.cmd_output("dd if=/dev/zero of=%s bs=1M "
"count=%s" % (file_path, dd_size1),
timeout=5)
logging.debug(output)
md51 = session.cmd_output("md5sum %s" % file_path)
logging.debug(md51)
attached_vm.destroy()
attached_vm.wait_for_shutdown()
except (virt_vm.VMError, remote.LoginError, aexpect.ShellError,
utils_test.libguestfs.VTMountError) as detail:
if attached_vm.is_alive():
attached_vm.destroy()
test.fail(str(detail))
gf = utils_test.libguestfs.GuestfishTools(params)
size2 = int(volumesize) / 2 - 5
lvresize_result = gf.lvresize(lv_device, size2)
logging.debug(lvresize_result)
if lvresize_result.exit_status:
gf.close_session()
test.fail("Resize volume %s failed." % lv_device)
logging.info("Resize %s successfully", lv_device)
mount_result = gf.mount(lv_device, mountpoint)
logging.debug(mount_result)
if mount_result.exit_status:
gf.close_session()
test.fail("Mount %s Failed" % lv_device)
logging.info("Mount %s successfully.", lv_device)
list_df_result = gf.df()
logging.debug(list_df_result)
if list_df_result.exit_status:
gf.close_session()
test.fail("Df failed")
else:
if not re.search(volumename, list_df_result.stdout):
gf.close_session()
test.fail("Did not find mounted device.")
logging.info("Df successfully.")
md5s, md5o = gf.get_md5(file_path)
logging.debug(md5o)
gf.close_session()
if md5s is True:
if re.search(md5o, md51):
test.fail("Got same md5 after shrinking volume.")
test.fail("Get md5 successfully, but not expected.")
logging.info("Did not get md5 as expected.")
def test_expand_volume(test, vm, params):
"""
1) Fall into guestfish session w/ inspector
2) Do some necessary check
3) Format additional disk with part-add
4) Create a volume group
5) Create a volume in created volume group
6) Format volume device
7) Login vm to dd a image file and get md5 value
8) Refall into guestfish session w/ inspector
9) Expand volume size
10) Try to get md5 again
"""
add_device = params.get("gf_additional_device", "/dev/vdb")
device_in_gf = process.run("echo %s | sed -e 's/vd/sd/g'" % add_device,
ignore_status=True, shell=True).stdout_text.strip()
vt = utils_test.libguestfs.VirtTools(vm, params)
vt.update_vm_disk()
params['libvirt_domain'] = vt.newvm.name
params['gf_inspector'] = True
gf = utils_test.libguestfs.GuestfishTools(params)
part_name = prepare_attached_device(gf, device_in_gf)
groupname = params.get("gf_volume_group_name", "VolGroupTest")
vgcreate_result = gf.vgcreate(groupname, part_name)
logging.info(vgcreate_result)
if vgcreate_result.exit_status:
gf.close_session()
test.fail("Create volume group failed.")
logging.info("Create volume group successfully.")
vgs_result = gf.vgs()
logging.info(vgs_result)
if vgs_result.exit_status:
gf.close_session()
test.fail("List volume groups failed.")
else:
if not re.search(groupname, vgs_result.stdout):
gf.close_session()
test.fail("Can't get volume group %s." % groupname)
logging.info("Got volume group %s", groupname)
volumename = params.get("gf_volume_name", "VolTest")
lv_device = "/dev/%s/%s" % (groupname, volumename)
volumesize = params.get("gf_volume_size", "40")
lvcreate_result = gf.lvcreate(volumename, groupname, volumesize)
logging.info(lvcreate_result)
if lvcreate_result.exit_status:
gf.close_session()
test.fail("Create volume failed.")
logging.info("Create volume successfully.")
lvs_result = gf.lvs()
logging.info(lvs_result)
if lvs_result.exit_status:
gf.close_session()
test.fail("List volume groups failed.")
else:
if not re.search(volumename, lvs_result.stdout):
gf.close_session()
test.fail("Can't get volume %s." % volumename)
logging.info("Got volume %s", volumename)
mkfs_result = gf.mkfs("ext3", lv_device)
logging.debug(mkfs_result)
gf.close_session()
if mkfs_result.exit_status:
test.fail("Format %s Failed" % lv_device)
logging.info("Format %s successfully.", lv_device)
attached_vm = vt.newvm
try:
attached_vm.start()
session = attached_vm.wait_for_login()
if session.cmd_status("which vgs"):
attached_vm.destroy()
attached_vm.wait_for_shutdown()
test.cancel("Can not use volume group in guest,"
"SKIP THIS CASE...")
except (virt_vm.VMError, remote.LoginError) as detail:
attached_vm.destroy()
test.fail(str(detail))
mountpoint = params.get("gf_mountpoint", "/mnt")
file_path = "%s/test_expand_volume.img" % mountpoint
try:
dd_size1 = int(volumesize) / 2
status, output = session.cmd_status_output("mount %s %s" % (lv_device,
mountpoint), timeout=20)
if status:
raise utils_test.libguestfs.VTMountError("", output)
else:
output = session.cmd_output("df", timeout=10)
logging.debug(output)
if not re.search(mountpoint, str(output)):
raise utils_test.libguestfs.VTMountError("df", output)
output = session.cmd_output("dd if=/dev/zero of=%s bs=1M "
"count=%s" % (file_path, dd_size1),
timeout=5)
logging.debug(output)
md51 = session.cmd_output("md5sum %s" % file_path)
logging.debug("Original md5:%s", md51)
attached_vm.destroy()
attached_vm.wait_for_shutdown()
except (virt_vm.VMError, remote.LoginError, aexpect.ShellError,
utils_test.libguestfs.VTMountError) as detail:
if attached_vm.is_alive():
attached_vm.destroy()
test.fail(str(detail))
gf = utils_test.libguestfs.GuestfishTools(params)
size2 = int(volumesize) + 5
lvresize_result = gf.lvresize(lv_device, size2)
logging.debug(lvresize_result)
if lvresize_result.exit_status:
gf.close_session()
test.fail("Resize volume %s failed." % lv_device)
logging.info("Resize %s successfully", lv_device)
mount_result = gf.mount(lv_device, mountpoint)
logging.debug(mount_result)
if mount_result.exit_status:
gf.close_session()
test.fail("Mount %s Failed" % lv_device)
logging.info("Mount %s successfully.", lv_device)
list_df_result = gf.df()
logging.debug(list_df_result)
if list_df_result.exit_status:
gf.close_session()
test.fail("Df failed")
else:
if not re.search(volumename, list_df_result.stdout):
gf.close_session()
test.fail("Did not find mounted device.")
logging.info("Df successfully.")
md5s, md5o = gf.get_md5(file_path)
logging.debug("Current md5:%s", md5o)
gf.close_session()
if md5s is False:
test.fail("Get md5 failed.")
else:
if not re.search(md5o, md51):
test.fail("Got different md5 after expanding volume.")
logging.info("Get correct md5 as expected.")
def run(test, params, env):
"""
Test guestfs with volume commands.
"""
vm_name = params.get("main_vm")
new_vm_name = params.get("gf_updated_new_vm")
vm = env.get_vm(vm_name)
if vm.is_alive():
vm.destroy()
operation = params.get("gf_volume_operation")
testcase = globals()["test_%s" % operation]
try:
utils_test.libguestfs.define_new_vm(vm_name, new_vm_name)
testcase(test, vm, params)
finally:
disk_path = os.path.join(data_dir.get_tmp_dir(),
params.get("gf_updated_target_dev", "vdb"))
utils_test.libguestfs.cleanup_vm(new_vm_name, disk_path)