mirror of
https://github.com/ansible-collections/community.general.git
synced 2025-07-04 15:40:20 -07:00
[cloud][ovirt] Fix waiting to down state of stateless VM (#21246)
This patch enhances waiting operation of stateless VM to be down. Because stateless VM creates a snapshot and removes it after the VM is shutdown, we must wait until the VM is really prepared to start again.
This commit is contained in:
parent
80c3087977
commit
fd899c0339
1 changed files with 56 additions and 6 deletions
|
@ -665,6 +665,46 @@ class VmsModule(BaseModule):
|
||||||
timeout=self.param('timeout'),
|
timeout=self.param('timeout'),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def wait_for_down(self, vm):
|
||||||
|
"""
|
||||||
|
This function will first wait for the status DOWN of the VM.
|
||||||
|
Then it will find the active snapshot and wait until it's state is OK for
|
||||||
|
stateless VMs and statless snaphot is removed.
|
||||||
|
"""
|
||||||
|
vm_service = self._service.vm_service(vm.id)
|
||||||
|
wait(
|
||||||
|
service=vm_service,
|
||||||
|
condition=lambda vm: vm.status == otypes.VmStatus.DOWN,
|
||||||
|
wait=self.param('wait'),
|
||||||
|
timeout=self.param('timeout'),
|
||||||
|
)
|
||||||
|
if vm.stateless:
|
||||||
|
snapshots_service = vm_service.snapshots_service()
|
||||||
|
snapshots = snapshots_service.list()
|
||||||
|
snap_active = [
|
||||||
|
snap for snap in snapshots
|
||||||
|
if snap.snapshot_type == otypes.SnapshotType.ACTIVE
|
||||||
|
][0]
|
||||||
|
snap_stateless = [
|
||||||
|
snap for snap in snapshots
|
||||||
|
if snap.snapshot_type == otypes.SnapshotType.STATELESS
|
||||||
|
]
|
||||||
|
# Stateless snapshot may be already removed:
|
||||||
|
if snap_stateless:
|
||||||
|
wait(
|
||||||
|
service=snapshots_service.snapshot_service(snap_stateless[0].id),
|
||||||
|
condition=lambda snap: snap is None,
|
||||||
|
wait=self.param('wait'),
|
||||||
|
timeout=self.param('timeout'),
|
||||||
|
)
|
||||||
|
wait(
|
||||||
|
service=snapshots_service.snapshot_service(snap_active.id),
|
||||||
|
condition=lambda snap: snap.snapshot_status == otypes.SnapshotStatus.OK,
|
||||||
|
wait=self.param('wait'),
|
||||||
|
timeout=self.param('timeout'),
|
||||||
|
)
|
||||||
|
return True
|
||||||
|
|
||||||
def __attach_disks(self, entity):
|
def __attach_disks(self, entity):
|
||||||
disks_service = self._connection.system_service().disks_service()
|
disks_service = self._connection.system_service().disks_service()
|
||||||
|
|
||||||
|
@ -729,7 +769,6 @@ class VmsModule(BaseModule):
|
||||||
|
|
||||||
def __attach_nics(self, entity):
|
def __attach_nics(self, entity):
|
||||||
# Attach NICs to VM, if specified:
|
# Attach NICs to VM, if specified:
|
||||||
vnic_profiles_service = self._connection.system_service().vnic_profiles_service()
|
|
||||||
nics_service = self._service.service(entity.id).nics_service()
|
nics_service = self._service.service(entity.id).nics_service()
|
||||||
for nic in self.param('nics'):
|
for nic in self.param('nics'):
|
||||||
if search_by_name(nics_service, nic.get('name')) is None:
|
if search_by_name(nics_service, nic.get('name')) is None:
|
||||||
|
@ -923,6 +962,7 @@ def main():
|
||||||
clone=module.params['clone'],
|
clone=module.params['clone'],
|
||||||
clone_permissions=module.params['clone_permissions'],
|
clone_permissions=module.params['clone_permissions'],
|
||||||
)
|
)
|
||||||
|
initialization = _get_initialization(sysprep, cloud_init, cloud_init_nics)
|
||||||
ret = vms_module.action(
|
ret = vms_module.action(
|
||||||
action='start',
|
action='start',
|
||||||
post_action=vms_module._post_start_action,
|
post_action=vms_module._post_start_action,
|
||||||
|
@ -944,13 +984,23 @@ def main():
|
||||||
placement_policy=otypes.VmPlacementPolicy(
|
placement_policy=otypes.VmPlacementPolicy(
|
||||||
hosts=[otypes.Host(name=module.params['host'])]
|
hosts=[otypes.Host(name=module.params['host'])]
|
||||||
) if module.params['host'] else None,
|
) if module.params['host'] else None,
|
||||||
initialization=_get_initialization(sysprep, cloud_init, cloud_init_nics),
|
initialization=initialization,
|
||||||
os=otypes.OperatingSystem(
|
os=otypes.OperatingSystem(
|
||||||
cmdline=module.params.get('kernel_params'),
|
cmdline=module.params.get('kernel_params'),
|
||||||
initrd=module.params.get('initrd_path'),
|
initrd=module.params.get('initrd_path'),
|
||||||
kernel=module.params.get('kernel_path'),
|
kernel=module.params.get('kernel_path'),
|
||||||
),
|
) if (
|
||||||
),
|
module.params.get('kernel_params')
|
||||||
|
or module.params.get('initrd_path')
|
||||||
|
or module.params.get('kernel_path')
|
||||||
|
) else None,
|
||||||
|
) if (
|
||||||
|
module.params.get('kernel_params')
|
||||||
|
or module.params.get('initrd_path')
|
||||||
|
or module.params.get('kernel_path')
|
||||||
|
or module.params.get('host')
|
||||||
|
or initialization
|
||||||
|
) else None,
|
||||||
)
|
)
|
||||||
|
|
||||||
if state == 'next_run':
|
if state == 'next_run':
|
||||||
|
@ -974,7 +1024,7 @@ def main():
|
||||||
action='stop',
|
action='stop',
|
||||||
post_action=vms_module._attach_cd,
|
post_action=vms_module._attach_cd,
|
||||||
action_condition=lambda vm: vm.status != otypes.VmStatus.DOWN,
|
action_condition=lambda vm: vm.status != otypes.VmStatus.DOWN,
|
||||||
wait_condition=lambda vm: vm.status == otypes.VmStatus.DOWN,
|
wait_condition=vms_module.wait_for_down,
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
ret = vms_module.action(
|
ret = vms_module.action(
|
||||||
|
@ -982,7 +1032,7 @@ def main():
|
||||||
pre_action=vms_module._pre_shutdown_action,
|
pre_action=vms_module._pre_shutdown_action,
|
||||||
post_action=vms_module._attach_cd,
|
post_action=vms_module._attach_cd,
|
||||||
action_condition=lambda vm: vm.status != otypes.VmStatus.DOWN,
|
action_condition=lambda vm: vm.status != otypes.VmStatus.DOWN,
|
||||||
wait_condition=lambda vm: vm.status == otypes.VmStatus.DOWN,
|
wait_condition=vms_module.wait_for_down,
|
||||||
)
|
)
|
||||||
elif state == 'suspended':
|
elif state == 'suspended':
|
||||||
vms_module.create(
|
vms_module.create(
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue