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

1from timeout_sampler import TimeoutExpiredError, TimeoutSampler 

2 

3 

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 "" 

8 

9 return log_msg 

10 

11 

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 """ 

23 

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 

31 

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 

39 

40 if self.__class__.__name__ == "MTV": 

41 raise TypeError("MTV is not a Resource. Please Use one of its successors.") 

42 

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." 

54 

55 class ConditionCategory: 

56 CRITICAL = "Critical" 

57 

58 class ConditionType: 

59 SUCCEEDED = "Succeeded" 

60 FAILED = "Failed" 

61 TARGET_NAME_NOT_VALID = "TargetNameNotValid" 

62 VM_ALREADY_EXISTS = "VMAlreadyExists" 

63 

64 class ProviderType: 

65 VSPHERE = "vsphere" 

66 OPENSHIFT = "openshift" 

67 RHV = "ovirt" 

68 OVA = "ova" 

69 

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 """ 

82 

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 ) 

92 

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 

114 

115 except TimeoutExpiredError: 

116 self.logger.error(msg=(f"Last Status Condition of {self.kind} {self.name} was: {last_condition}")) 

117 raise 

118 

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 ) 

126 

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 ) 

134 

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 }