|
2 | 2 | import pytest
|
3 | 3 | import time
|
4 | 4 |
|
5 |
| -from .conftest import LINSTOR_PACKAGE |
| 5 | +from .conftest import GROUP_NAME, LINSTOR_PACKAGE |
6 | 6 | from lib.commands import SSHCommandFailed
|
7 | 7 | from lib.common import wait_for, vm_image
|
8 | 8 | from tests.storage import vdi_is_open
|
@@ -86,6 +86,59 @@ def test_snapshot(self, vm_on_linstor_sr):
|
86 | 86 | finally:
|
87 | 87 | vm.shutdown(verify=True)
|
88 | 88 |
|
| 89 | + @pytest.mark.small_vm |
| 90 | + def test_linstor_sr_expand_disk(self, linstor_sr, provisioning_type, storage_pool_name, |
| 91 | + pytestconfig, vm_on_linstor_sr): |
| 92 | + """ |
| 93 | + Identify hosts within the same pool, detect free disks, create LVM, and integrate it into LINSTOR SR. |
| 94 | + """ |
| 95 | + sr = linstor_sr |
| 96 | + vm = vm_on_linstor_sr |
| 97 | + vm.start() |
| 98 | + sr_size = sr.pool.master.xe('sr-param-get', {'uuid': sr.uuid, 'param-name': 'physical-size'}) |
| 99 | + resized = False |
| 100 | + disks = [] |
| 101 | + for h in sr.pool.hosts: |
| 102 | + logging.info("Checking on {}".format(h.hostname_or_ip)) |
| 103 | + available_disks = h.available_disks() |
| 104 | + # We need the disk to be "raw" (non LVM_member etc) to use |
| 105 | + available_disks = [disk for disk in available_disks if h.raw_disk_is_available(disk)] |
| 106 | + exapnsion_sr_disk = pytestconfig.getoption("expansion_sr_disk") |
| 107 | + if exapnsion_sr_disk: |
| 108 | + assert len(exapnsion_sr_disk) == 1, "This test requires only one --expansion-sr-disk parameter" |
| 109 | + if "auto" == exapnsion_sr_disk[0]: |
| 110 | + disks = available_disks |
| 111 | + else: |
| 112 | + assert exapnsion_sr_disk[0] in available_disks, "The expansion-sr-disk seems unavailable" |
| 113 | + disks = exapnsion_sr_disk |
| 114 | + else: |
| 115 | + disks = available_disks |
| 116 | + for disk in disks: |
| 117 | + logging.info("Found Disk {}".format(disk)) |
| 118 | + device = '/dev/' + disk |
| 119 | + try: |
| 120 | + h.ssh(['pvcreate', '-ff', '-y', device]) |
| 121 | + h.ssh(['vgextend', GROUP_NAME, device]) |
| 122 | + if provisioning_type == "thin": |
| 123 | + h.ssh(['lvextend', '-l', '+100%FREE', storage_pool_name]) |
| 124 | + else: # Needed service restart for thick pool sr scan |
| 125 | + h.ssh('systemctl restart linstor-satellite.service') |
| 126 | + resized = True |
| 127 | + logging.info("Successfully expanded LVM on %s with %s", h.hostname_or_ip, device) |
| 128 | + except SSHCommandFailed as e: |
| 129 | + raise e |
| 130 | + |
| 131 | + # Need to ensure that linstor is healthy/up-to-date before moving ahead. |
| 132 | + time.sleep(30) # Wait time for Linstor node communications to restore. |
| 133 | + sr.scan() |
| 134 | + new_sr_size = sr.pool.master.xe('sr-param-get', {'uuid': sr.uuid, 'param-name': 'physical-size'}) |
| 135 | + assert int(new_sr_size) > int(sr_size) and resized is True, \ |
| 136 | + f"Expected SR size to increase but got old size: {sr_size}, new size: {new_sr_size}" |
| 137 | + logging.info("SR expansion completed") |
| 138 | + vm.shutdown(verify=True) |
| 139 | + # Ensure VM is able to start and shutdown on expanded SR |
| 140 | + self.test_start_and_shutdown_VM(vm) |
| 141 | + |
89 | 142 | # *** tests with reboots (longer tests).
|
90 | 143 |
|
91 | 144 | @pytest.mark.reboot
|
|
0 commit comments