Coverage for ocp_resources/plan.py: 0%

36 statements  

« prev     ^ index     » next       coverage.py v7.6.10, created at 2025-01-30 10:48 +0200

1from __future__ import annotations 

2from typing import Any 

3from ocp_resources.resource import NamespacedResource 

4 

5 

6class Plan(NamespacedResource): 

7 """ 

8 Migration Tool for Virtualization (MTV) Plan Resource. 

9 

10 Args: 

11 source_provider_name (str): MTV Source Provider CR name. 

12 source_provider_namespace (str): MTV Source Provider CR namespace. 

13 destination_provider_name (str): MTV Destination Provider CR name. 

14 destination_provider_namespace (str): MTV Destination Provider CR namespace. 

15 storage_map_name (str): MTV StorageMap CR name. 

16 storage_map_namespace (str): MTV StorageMap CR namespace. 

17 network_map_name (str): MTV NetworkMap CR name. 

18 network_map_namespace (str): MTV NetworkMap CR CR namespace. 

19 virtual_machines_list (list): A List of dicts, each contain 

20 the Name Or Id of the source Virtual Machines to migrate. 

21 Example: [ { "id": "vm-id-x" }, { "name": "vm-name-x" } ] 

22 warm_migration (bool, default: False): Warm (True) or Cold (False) migration. 

23 """ 

24 

25 api_group = NamespacedResource.ApiGroup.FORKLIFT_KONVEYOR_IO 

26 

27 def __init__( 

28 self, 

29 source_provider_name: str | None = None, 

30 source_provider_namespace: str | None = None, 

31 destination_provider_name: str | None = None, 

32 destination_provider_namespace: str | None = None, 

33 storage_map_name: str | None = None, 

34 storage_map_namespace: str | None = None, 

35 network_map_name: str | None = None, 

36 network_map_namespace: str | None = None, 

37 virtual_machines_list: list[Any] | None = None, 

38 target_namespace: str | None = None, 

39 warm_migration: bool = False, 

40 pre_hook_name: str | None = None, 

41 pre_hook_namespace: str | None = None, 

42 after_hook_name: str | None = None, 

43 after_hook_namespace: str | None = None, 

44 **kwargs, 

45 ) -> None: 

46 super().__init__(**kwargs) 

47 self.source_provider_name = source_provider_name 

48 self.source_provider_namespace = source_provider_namespace 

49 self.destination_provider_name = destination_provider_name 

50 self.destination_provider_namespace = destination_provider_namespace 

51 self.storage_map_name = storage_map_name 

52 self.storage_map_namespace = storage_map_namespace 

53 self.network_map_name = network_map_name 

54 self.network_map_namespace = network_map_namespace 

55 self.virtual_machines_list = virtual_machines_list 

56 self.warm_migration = warm_migration 

57 self.pre_hook_name = pre_hook_name 

58 self.pre_hook_namespace = pre_hook_namespace 

59 self.after_hook_name = after_hook_name 

60 self.after_hook_namespace = after_hook_namespace 

61 self.target_namespace = target_namespace or self.namespace 

62 self.hooks_array = [] 

63 

64 if self.pre_hook_name and self.pre_hook_namespace: 

65 self.hooks_array.append( 

66 self._generate_hook_spec( 

67 hook_name=self.pre_hook_name, 

68 hook_namespace=self.pre_hook_namespace, 

69 hook_type="PreHook", 

70 ) 

71 ) 

72 

73 if self.after_hook_name and self.after_hook_namespace: 

74 self.hooks_array.append( 

75 self._generate_hook_spec( 

76 hook_name=self.after_hook_name, 

77 hook_namespace=self.after_hook_namespace, 

78 hook_type="AfterHook", 

79 ) 

80 ) 

81 

82 if self.hooks_array and self.virtual_machines_list: 

83 for vm in self.virtual_machines_list: 

84 vm["hooks"] = self.hooks_array 

85 

86 def to_dict(self) -> None: 

87 super().to_dict() 

88 if not self.kind_dict and not self.yaml_file: 

89 self.res.update({ 

90 "spec": { 

91 "warm": self.warm_migration, 

92 "targetNamespace": self.target_namespace, 

93 "map": { 

94 "storage": { 

95 "name": self.storage_map_name, 

96 "namespace": self.storage_map_namespace, 

97 }, 

98 "network": { 

99 "name": self.network_map_name, 

100 "namespace": self.network_map_namespace, 

101 }, 

102 }, 

103 "vms": self.virtual_machines_list, 

104 "provider": { 

105 "source": { 

106 "name": self.source_provider_name, 

107 "namespace": self.source_provider_namespace, 

108 }, 

109 "destination": { 

110 "name": self.destination_provider_name, 

111 "namespace": self.destination_provider_namespace, 

112 }, 

113 }, 

114 } 

115 }) 

116 

117 def _generate_hook_spec(self, hook_name: str, hook_namespace: str, hook_type: str) -> dict[str, Any]: 

118 return { 

119 "hook": { 

120 "name": hook_name, 

121 "namespace": hook_namespace, 

122 }, 

123 "step": hook_type, 

124 }