Coverage for ocp_resources/mtv.py: 0%
71 statements
« prev ^ index » next coverage.py v7.6.9, created at 2024-12-18 18:22 +0200
« prev ^ index » next coverage.py v7.6.9, created at 2024-12-18 18:22 +0200
1from timeout_sampler import TimeoutExpiredError, TimeoutSampler
4def _get_status_condition_log_message(**status_condition):
5 log_msg = "Waiting For: \n"
6 for status_condition_name, status_condition in status_condition.items():
7 log_msg += f"{status_condition_name}->{status_condition} \n" if status_condition else ""
9 return log_msg
12class MTV:
13 """
14 Abstract Class for all Migration ToolKit For Virtualization (MTV) Resources:
15 Provider
16 Plan
17 Migration
18 StorageMap
19 NetworkMap
20 Host
21 ForkliftController
22 """
24 def __init__(self):
25 self.api = None
26 self.name = None
27 self.namespace = None
28 self.kind = None
29 self.Condition = None
30 self.Status = None
32 self.condition_message_ready = None
33 self.condition_message_succeeded = None
34 self.mapping = None
35 self.source_provider_name = None
36 self.source_provider_namespace = None
37 self.destination_provider_name = None
38 self.destination_provider_namespace = None
40 if self.__class__.__name__ == "MTV":
41 raise TypeError("MTV is not a Resource. Please Use one of its successors.")
43 class ConditionMessage:
44 PROVIDER_READY = "The provider is ready."
45 NETWORK_MAP_READY = "The network map is ready."
46 STORAGE_MAP_READY = "The storage map is ready."
47 PLAN_READY = "The migration plan is ready."
48 PLAN_SUCCEEDED = "The plan execution has SUCCEEDED."
49 PLAN_FAILED = "The plan execution has FAILED."
50 MIGRATION_READY = "The migration is ready."
51 MIGRATION_RUNNING = "The migration is RUNNING"
52 MIGRATION_SUCCEEDED = "The migration has SUCCEEDED."
53 HOST_READY = "The host is ready."
55 class ConditionCategory:
56 CRITICAL = "Critical"
58 class ConditionType:
59 SUCCEEDED = "Succeeded"
60 FAILED = "Failed"
61 TARGET_NAME_NOT_VALID = "TargetNameNotValid"
62 VM_ALREADY_EXISTS = "VMAlreadyExists"
64 class ProviderType:
65 VSPHERE = "vsphere"
66 OPENSHIFT = "openshift"
67 RHV = "ovirt"
68 OVA = "ova"
70 def wait_for_resource_status(
71 self,
72 condition_status,
73 condition_type,
74 condition_message=None,
75 condition_reason=None,
76 condition_category=None,
77 wait_timeout=600,
78 ):
79 """
80 Wait for MTV Resource Status Conditions.
81 """
83 self.logger.info(
84 _get_status_condition_log_message(
85 condition_status=condition_status,
86 condition_type=condition_type,
87 condition_message=condition_message,
88 condition_reason=condition_reason,
89 condition_category=condition_category,
90 )
91 )
93 samples = TimeoutSampler(
94 wait_timeout=wait_timeout,
95 sleep=1,
96 func=self.api.get,
97 field_selector=f"metadata.name=={self.name}",
98 namespace=self.namespace,
99 )
100 last_condition = None
101 try:
102 for sample in samples:
103 current_conditions = (
104 sample.items[0].status.get("conditions") if sample.items and sample.items[0].status else []
105 )
106 for condition in current_conditions:
107 last_condition = condition
108 valid_status_type = condition_status == condition.status and condition_type == condition.type
109 valid_message = condition_message == condition.message or condition_message is None
110 valid_reason = condition_reason == condition.reason or condition_reason is None
111 valid_category = condition_category == condition.category or condition_category is None
112 if all([valid_status_type, valid_message, valid_reason, valid_category]):
113 return
115 except TimeoutExpiredError:
116 self.logger.error(msg=(f"Last Status Condition of {self.kind} {self.name} was: {last_condition}"))
117 raise
119 def wait_for_condition_ready(self, wait_timeout=360):
120 self.wait_for_resource_status(
121 condition_message=self.condition_message_ready,
122 condition_status=self.Condition.Status.TRUE,
123 condition_type=self.Condition.READY,
124 wait_timeout=wait_timeout,
125 )
127 def wait_for_condition_succeeded(self, wait_timeout=600):
128 self.wait_for_resource_status(
129 condition_type=self.Status.SUCCEEDED,
130 condition_message=self.condition_message_succeeded,
131 condition_status=self.Condition.Status.TRUE,
132 wait_timeout=wait_timeout,
133 )
135 @property
136 def map_to_dict(self):
137 return {
138 "spec": {
139 "map": self.mapping,
140 "provider": {
141 "source": {
142 "name": self.source_provider_name,
143 "namespace": self.source_provider_namespace,
144 },
145 "destination": {
146 "name": self.destination_provider_name,
147 "namespace": self.destination_provider_namespace,
148 },
149 },
150 }
151 }