# -*- coding: utf-8 -*-
from kubernetes.dynamic.exceptions import ResourceNotFoundError
from ocp_resources.constants import PROTOCOL_ERROR_EXCEPTION_DICT, TIMEOUT_4MINUTES
from ocp_resources.resource import NamespacedResource
from ocp_resources.utils import TimeoutSampler, TimeoutWatch
from ocp_resources.virtual_machine import VirtualMachine
[docs]class VirtualMachineRestore(NamespacedResource):
"""
VirtualMachineRestore object.
"""
api_group = NamespacedResource.ApiGroup.SNAPSHOT_KUBEVIRT_IO
def __init__(
self,
name=None,
namespace=None,
vm_name=None,
snapshot_name=None,
client=None,
teardown=True,
yaml_file=None,
delete_timeout=TIMEOUT_4MINUTES,
**kwargs,
):
super().__init__(
name=name,
namespace=namespace,
client=client,
teardown=teardown,
yaml_file=yaml_file,
delete_timeout=delete_timeout,
**kwargs,
)
self.vm_name = vm_name
self.snapshot_name = snapshot_name
[docs] def to_dict(self):
super().to_dict()
if not self.yaml_file:
spec = self.res.setdefault("spec", {})
spec.setdefault("target", {})[
"apiGroup"
] = NamespacedResource.ApiGroup.KUBEVIRT_IO
spec["target"]["kind"] = VirtualMachine.kind
spec["target"]["name"] = self.vm_name
spec["virtualMachineSnapshotName"] = self.snapshot_name
[docs] def wait_complete(self, status=True, timeout=TIMEOUT_4MINUTES):
"""
Wait for VirtualMachineRestore to be in status complete
Args:
status: Expected status: True for a completed restore operation, False otherwise.
timeout (int): Time to wait.
Raises:
TimeoutExpiredError: If timeout reached.
"""
self.logger.info(
f"Wait for {self.kind} {self.name} status to be complete = {status}"
)
timeout_watcher = TimeoutWatch(timeout=timeout)
for sample in TimeoutSampler(
wait_timeout=timeout,
sleep=1,
func=lambda: self.exists,
):
if sample:
break
samples = TimeoutSampler(
wait_timeout=timeout_watcher.remaining_time(),
sleep=1,
exceptions_dict=PROTOCOL_ERROR_EXCEPTION_DICT,
func=lambda: self.instance.get("status", {}).get("complete") == status,
)
for sample in samples:
if sample:
return
[docs] def wait_restore_done(self, timeout=TIMEOUT_4MINUTES):
"""
Wait for the the restore to be done. This check 2 parameters, the restore status to be complete
and the VM status restoreInProgress to be None.
Args:
timeout (int): Time to wait.
Raises:
TimeoutExpiredError: If timeout reached.
"""
self.wait_complete(timeout=timeout)
vm = VirtualMachine(
client=self.client,
namespace=self.namespace,
name=self.vm_name,
)
if vm.exists:
return vm.wait_for_status_none(status="restoreInProgress", timeout=timeout)
raise ResourceNotFoundError(f"VirtualMachine: {vm.name} not found")