openshift-python-wrapper 4.11.61__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (132) hide show
  1. ocp_resources/__init__.py +0 -0
  2. ocp_resources/api_service.py +9 -0
  3. ocp_resources/backup.py +52 -0
  4. ocp_resources/benchmark.py +92 -0
  5. ocp_resources/catalog_source.py +63 -0
  6. ocp_resources/catalog_source_config.py +86 -0
  7. ocp_resources/cdi.py +13 -0
  8. ocp_resources/cdi_config.py +52 -0
  9. ocp_resources/chaos_engine.py +30 -0
  10. ocp_resources/chaos_result.py +11 -0
  11. ocp_resources/cluster_operator.py +5 -0
  12. ocp_resources/cluster_role.py +70 -0
  13. ocp_resources/cluster_role_binding.py +36 -0
  14. ocp_resources/cluster_service_version.py +8 -0
  15. ocp_resources/cluster_version.py +5 -0
  16. ocp_resources/configmap.py +37 -0
  17. ocp_resources/console_cli_download.py +9 -0
  18. ocp_resources/console_plugin.py +9 -0
  19. ocp_resources/console_quick_start.py +9 -0
  20. ocp_resources/constants.py +26 -0
  21. ocp_resources/csidriver.py +9 -0
  22. ocp_resources/custom_resource_definition.py +5 -0
  23. ocp_resources/daemonset.py +61 -0
  24. ocp_resources/data_import_cron.py +100 -0
  25. ocp_resources/data_source.py +59 -0
  26. ocp_resources/datavolume.py +275 -0
  27. ocp_resources/deployment.py +65 -0
  28. ocp_resources/destination_rule.py +11 -0
  29. ocp_resources/event.py +114 -0
  30. ocp_resources/forklift_controller.py +10 -0
  31. ocp_resources/gateway.py +11 -0
  32. ocp_resources/hook.py +52 -0
  33. ocp_resources/host.py +64 -0
  34. ocp_resources/hostpath_provisioner.py +50 -0
  35. ocp_resources/hyperconverged.py +43 -0
  36. ocp_resources/image.py +9 -0
  37. ocp_resources/image_content_source_policy.py +9 -0
  38. ocp_resources/image_stream.py +48 -0
  39. ocp_resources/imagestreamtag.py +9 -0
  40. ocp_resources/infrastructure.py +18 -0
  41. ocp_resources/installplan.py +8 -0
  42. ocp_resources/job.py +65 -0
  43. ocp_resources/kube_descheduler.py +65 -0
  44. ocp_resources/kubevirt.py +5 -0
  45. ocp_resources/kubevirt_common_templates_bundle.py +5 -0
  46. ocp_resources/kubevirt_metrics_aggregation.py +5 -0
  47. ocp_resources/kubevirt_node_labeller_bundle.py +5 -0
  48. ocp_resources/kubevirt_template_validaotr.py +5 -0
  49. ocp_resources/logger.py +76 -0
  50. ocp_resources/machine.py +50 -0
  51. ocp_resources/machine_config.py +5 -0
  52. ocp_resources/machine_config_pool.py +9 -0
  53. ocp_resources/machine_health_check.py +76 -0
  54. ocp_resources/machine_set.py +189 -0
  55. ocp_resources/migration.py +63 -0
  56. ocp_resources/migration_policy.py +66 -0
  57. ocp_resources/mtv.py +171 -0
  58. ocp_resources/mutating_webhook_config.py +9 -0
  59. ocp_resources/namespace.py +40 -0
  60. ocp_resources/network.py +5 -0
  61. ocp_resources/network_addons_config.py +9 -0
  62. ocp_resources/network_attachment_definition.py +24 -0
  63. ocp_resources/network_map.py +64 -0
  64. ocp_resources/network_policy.py +9 -0
  65. ocp_resources/nmstate.py +9 -0
  66. ocp_resources/node.py +41 -0
  67. ocp_resources/node_health_check.py +10 -0
  68. ocp_resources/node_maintenance.py +40 -0
  69. ocp_resources/node_network_configuration_enactment.py +20 -0
  70. ocp_resources/node_network_configuration_policy.py +472 -0
  71. ocp_resources/node_network_state.py +121 -0
  72. ocp_resources/oauth.py +9 -0
  73. ocp_resources/operator_condition.py +5 -0
  74. ocp_resources/operator_group.py +37 -0
  75. ocp_resources/operator_hub.py +5 -0
  76. ocp_resources/operator_source.py +50 -0
  77. ocp_resources/package_manifest.py +5 -0
  78. ocp_resources/peer_authentication.py +18 -0
  79. ocp_resources/persistent_volume.py +27 -0
  80. ocp_resources/persistent_volume_claim.py +103 -0
  81. ocp_resources/plan.py +143 -0
  82. ocp_resources/pod.py +175 -0
  83. ocp_resources/pod_disruption_budget.py +53 -0
  84. ocp_resources/priority_class.py +48 -0
  85. ocp_resources/project.py +60 -0
  86. ocp_resources/prometheus.py +9 -0
  87. ocp_resources/prometheus_rule.py +9 -0
  88. ocp_resources/provider.py +59 -0
  89. ocp_resources/replicaset.py +11 -0
  90. ocp_resources/resource.py +1383 -0
  91. ocp_resources/restore.py +52 -0
  92. ocp_resources/role.py +11 -0
  93. ocp_resources/role_binding.py +67 -0
  94. ocp_resources/route.py +76 -0
  95. ocp_resources/secret.py +75 -0
  96. ocp_resources/security_context_constraints.py +9 -0
  97. ocp_resources/service.py +16 -0
  98. ocp_resources/service_account.py +9 -0
  99. ocp_resources/service_mesh_control_plane.py +11 -0
  100. ocp_resources/service_mesh_member_roll.py +14 -0
  101. ocp_resources/service_monitor.py +9 -0
  102. ocp_resources/sriov_network.py +54 -0
  103. ocp_resources/sriov_network_node_policy.py +67 -0
  104. ocp_resources/sriov_network_node_state.py +44 -0
  105. ocp_resources/ssp.py +9 -0
  106. ocp_resources/storage_class.py +47 -0
  107. ocp_resources/storage_map.py +67 -0
  108. ocp_resources/storage_profile.py +7 -0
  109. ocp_resources/subscription.py +66 -0
  110. ocp_resources/tekton_tasks.py +9 -0
  111. ocp_resources/template.py +74 -0
  112. ocp_resources/upload_token_request.py +39 -0
  113. ocp_resources/utils.py +278 -0
  114. ocp_resources/validating_webhook_config.py +9 -0
  115. ocp_resources/virtual_machine.py +177 -0
  116. ocp_resources/virtual_machine_Instance_replica_set.py +9 -0
  117. ocp_resources/virtual_machine_cluster_flavor.py +5 -0
  118. ocp_resources/virtual_machine_flavor.py +5 -0
  119. ocp_resources/virtual_machine_import.py +307 -0
  120. ocp_resources/virtual_machine_instance.py +322 -0
  121. ocp_resources/virtual_machine_instance_migration.py +36 -0
  122. ocp_resources/virtual_machine_instance_preset.py +9 -0
  123. ocp_resources/virtual_machine_restore.py +99 -0
  124. ocp_resources/virtual_machine_snapshot.py +96 -0
  125. ocp_resources/virtual_service.py +11 -0
  126. ocp_resources/vm_import_config.py +9 -0
  127. ocp_resources/volume_snapshot.py +9 -0
  128. ocp_resources/volume_snapshot_class.py +9 -0
  129. openshift_python_wrapper-4.11.61.dist-info/LICENSE +201 -0
  130. openshift_python_wrapper-4.11.61.dist-info/METADATA +188 -0
  131. openshift_python_wrapper-4.11.61.dist-info/RECORD +132 -0
  132. openshift_python_wrapper-4.11.61.dist-info/WHEEL +4 -0
@@ -0,0 +1,121 @@
1
+ import time
2
+
3
+ from openshift.dynamic.exceptions import ConflictError
4
+
5
+ from ocp_resources.constants import TIMEOUT_4MINUTES
6
+ from ocp_resources.resource import Resource
7
+ from ocp_resources.utils import TimeoutSampler
8
+
9
+
10
+ SLEEP = 1
11
+
12
+
13
+ class NodeNetworkState(Resource):
14
+ api_group = Resource.ApiGroup.NMSTATE_IO
15
+
16
+ def __init__(
17
+ self,
18
+ name=None,
19
+ client=None,
20
+ teardown=True,
21
+ yaml_file=None,
22
+ delete_timeout=TIMEOUT_4MINUTES,
23
+ **kwargs,
24
+ ):
25
+ super().__init__(
26
+ name=name,
27
+ client=client,
28
+ teardown=teardown,
29
+ yaml_file=yaml_file,
30
+ delete_timeout=delete_timeout,
31
+ **kwargs,
32
+ )
33
+ status = self.instance.to_dict()["status"]
34
+ self.desired_state = status.get("desiredState", {"interfaces": []})
35
+
36
+ def set_interface(self, interface):
37
+ # First drop the interface is's already in the list
38
+ interfaces = [
39
+ iface
40
+ for iface in self.desired_state["interfaces"]
41
+ if iface["name"] != interface["name"]
42
+ ]
43
+
44
+ # Add the interface
45
+ interfaces.append(interface)
46
+ self.desired_state["interfaces"] = interfaces
47
+
48
+ def to_dict(self):
49
+ super().to_dict()
50
+ if not self.yaml_file:
51
+ self.res.update(
52
+ {
53
+ "spec": {
54
+ "nodeName": self.name,
55
+ "managed": True,
56
+ "desiredState": self.desired_state,
57
+ }
58
+ }
59
+ )
60
+
61
+ def apply(self):
62
+ retries_on_conflict = 3
63
+ while True:
64
+ try:
65
+ self.res["metadata"] = self.instance.to_dict()["metadata"]
66
+ self.update(self.res)
67
+ break
68
+ except ConflictError as e:
69
+ retries_on_conflict -= 1
70
+ if retries_on_conflict == 0:
71
+ raise e
72
+ time.sleep(1)
73
+
74
+ def wait_until_up(self, name):
75
+ def _find_up_interface():
76
+ iface = self.get_interface(name=name)
77
+ if iface.get("state") == self.Interface.State.UP:
78
+ return iface
79
+
80
+ return None
81
+
82
+ self.logger.info(f"Checking if interface {name} is up -- {self.name}")
83
+ samples = TimeoutSampler(
84
+ wait_timeout=TIMEOUT_4MINUTES, sleep=SLEEP, func=_find_up_interface
85
+ )
86
+ for sample in samples:
87
+ if sample:
88
+ return
89
+
90
+ def wait_until_deleted(self, name):
91
+ self.logger.info(f"Checking if interface {name} is deleted -- {self.name}")
92
+ samples = TimeoutSampler(
93
+ wait_timeout=self.delete_timeout,
94
+ sleep=SLEEP,
95
+ func=self.get_interface,
96
+ name=name,
97
+ )
98
+ for sample in samples:
99
+ if not sample:
100
+ return
101
+
102
+ @property
103
+ def interfaces(self):
104
+ return self.instance.to_dict()["status"]["currentState"]["interfaces"]
105
+
106
+ @property
107
+ def routes(self):
108
+ return self.instance.status.currentState.routes
109
+
110
+ def ipv4(self, iface):
111
+ for interface in self.interfaces:
112
+ if interface["name"] == iface:
113
+ addresses = interface["ipv4"]["address"]
114
+ if addresses:
115
+ return interface["ipv4"]["address"][0]["ip"]
116
+
117
+ def get_interface(self, name):
118
+ for interface in self.interfaces:
119
+ if interface["name"] == name:
120
+ return interface
121
+ return {}
ocp_resources/oauth.py ADDED
@@ -0,0 +1,9 @@
1
+ from ocp_resources.resource import Resource
2
+
3
+
4
+ class OAuth(Resource):
5
+ """
6
+ OAuth object.
7
+ """
8
+
9
+ api_group = Resource.ApiGroup.CONFIG_OPENSHIFT_IO
@@ -0,0 +1,5 @@
1
+ from ocp_resources.resource import NamespacedResource
2
+
3
+
4
+ class OperatorCondition(NamespacedResource):
5
+ api_group = NamespacedResource.ApiGroup.OPERATORS_COREOS_COM
@@ -0,0 +1,37 @@
1
+ from ocp_resources.constants import TIMEOUT_4MINUTES
2
+ from ocp_resources.resource import NamespacedResource
3
+
4
+
5
+ class OperatorGroup(NamespacedResource):
6
+ api_group = NamespacedResource.ApiGroup.OPERATORS_COREOS_COM
7
+
8
+ def __init__(
9
+ self,
10
+ name=None,
11
+ namespace=None,
12
+ target_namespaces=None,
13
+ teardown=True,
14
+ client=None,
15
+ yaml_file=None,
16
+ delete_timeout=TIMEOUT_4MINUTES,
17
+ **kwargs,
18
+ ):
19
+ """
20
+ Args:
21
+ target_namespaces(list): namespaces in which to generate required RBAC access for its member Operators.
22
+ """
23
+ super().__init__(
24
+ name=name,
25
+ namespace=namespace,
26
+ client=client,
27
+ teardown=teardown,
28
+ yaml_file=yaml_file,
29
+ delete_timeout=delete_timeout,
30
+ **kwargs,
31
+ )
32
+ self.target_namespaces = target_namespaces
33
+
34
+ def to_dict(self):
35
+ super().to_dict()
36
+ if not self.yaml_file:
37
+ self.res.update({"spec": {"targetNamespaces": self.target_namespaces}})
@@ -0,0 +1,5 @@
1
+ from ocp_resources.resource import Resource
2
+
3
+
4
+ class OperatorHub(Resource):
5
+ api_group = Resource.ApiGroup.CONFIG_OPENSHIFT_IO
@@ -0,0 +1,50 @@
1
+ from ocp_resources.constants import TIMEOUT_4MINUTES
2
+ from ocp_resources.resource import NamespacedResource
3
+
4
+
5
+ class OperatorSource(NamespacedResource):
6
+ api_group = NamespacedResource.ApiGroup.OPERATORS_COREOS_COM
7
+
8
+ def __init__(
9
+ self,
10
+ name=None,
11
+ namespace=None,
12
+ registry_namespace=None,
13
+ display_name=None,
14
+ publisher=None,
15
+ secret=None,
16
+ client=None,
17
+ teardown=True,
18
+ yaml_file=None,
19
+ delete_timeout=TIMEOUT_4MINUTES,
20
+ **kwargs,
21
+ ):
22
+ super().__init__(
23
+ name=name,
24
+ namespace=namespace,
25
+ client=client,
26
+ teardown=teardown,
27
+ yaml_file=yaml_file,
28
+ delete_timeout=delete_timeout,
29
+ **kwargs,
30
+ )
31
+ self.registry_namespace = registry_namespace
32
+ self.display_name = display_name
33
+ self.publisher = publisher
34
+ self.secret = secret
35
+
36
+ def to_dict(self):
37
+ super().to_dict()
38
+ if not self.yaml_file:
39
+ self.res.update(
40
+ {
41
+ "spec": {
42
+ "type": "appregistry",
43
+ "endpoint": "https://quay.io/cnr",
44
+ "registryNamespace": self.registry_namespace,
45
+ "displayName": self.display_name,
46
+ "publisher": self.publisher,
47
+ "authorizationToken": {"secretName": self.secret},
48
+ }
49
+ }
50
+ )
@@ -0,0 +1,5 @@
1
+ from ocp_resources.resource import NamespacedResource
2
+
3
+
4
+ class PackageManifest(NamespacedResource):
5
+ api_group = NamespacedResource.ApiGroup.PACKAGES_OPERATORS_COREOS_COM
@@ -0,0 +1,18 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ from ocp_resources.resource import NamespacedResource
4
+
5
+
6
+ class PeerAuthentication(NamespacedResource):
7
+ """
8
+ Peer Authentication object.
9
+ """
10
+
11
+ api_group = NamespacedResource.ApiGroup.SECURITY_ISTIO_IO
12
+
13
+ class MtlsMode:
14
+ """
15
+ mTLS Traffic Mode object.
16
+ """
17
+
18
+ STRICT = "STRICT"
@@ -0,0 +1,27 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ from ocp_resources.resource import Resource
4
+
5
+
6
+ class PersistentVolume(Resource):
7
+ """
8
+ PersistentVolume object
9
+ """
10
+
11
+ api_version = Resource.ApiVersion.V1
12
+
13
+ class Status(Resource.Status):
14
+ RELEASED = "Released"
15
+
16
+ @property
17
+ def max_available_pvs(self):
18
+ """
19
+ Returns the maximum number (int) of PV's which are in 'Available' state
20
+ """
21
+ return len(
22
+ [
23
+ pv
24
+ for pv in self.api.get()["items"]
25
+ if pv.status.phase == Resource.Condition.AVAILABLE
26
+ ]
27
+ )
@@ -0,0 +1,103 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ from ocp_resources.constants import TIMEOUT_4MINUTES
4
+ from ocp_resources.resource import NamespacedResource
5
+
6
+
7
+ class PersistentVolumeClaim(NamespacedResource):
8
+ """
9
+ PersistentVolumeClaim object
10
+ """
11
+
12
+ api_version = NamespacedResource.ApiVersion.V1
13
+
14
+ class Status(NamespacedResource.Status):
15
+ BOUND = "Bound"
16
+
17
+ class AccessMode:
18
+ """
19
+ AccessMode object.
20
+ """
21
+
22
+ RWO = "ReadWriteOnce"
23
+ ROX = "ReadOnlyMany"
24
+ RWX = "ReadWriteMany"
25
+
26
+ class VolumeMode:
27
+ """
28
+ VolumeMode object
29
+ """
30
+
31
+ BLOCK = "Block"
32
+ FILE = "Filesystem"
33
+
34
+ def __init__(
35
+ self,
36
+ name=None,
37
+ namespace=None,
38
+ client=None,
39
+ storage_class=None,
40
+ accessmodes=None,
41
+ volume_mode=VolumeMode.FILE,
42
+ size=None,
43
+ hostpath_node=None,
44
+ teardown=True,
45
+ yaml_file=None,
46
+ delete_timeout=TIMEOUT_4MINUTES,
47
+ **kwargs,
48
+ ):
49
+ super().__init__(
50
+ name=name,
51
+ namespace=namespace,
52
+ client=client,
53
+ teardown=teardown,
54
+ yaml_file=yaml_file,
55
+ delete_timeout=delete_timeout,
56
+ **kwargs,
57
+ )
58
+ self.accessmodes = accessmodes
59
+ self.volume_mode = volume_mode
60
+ self.size = size
61
+ self.hostpath_node = hostpath_node
62
+ self.storage_class = storage_class
63
+
64
+ def to_dict(self):
65
+ super().to_dict()
66
+ if not self.yaml_file:
67
+ self.res.update(
68
+ {
69
+ "spec": {
70
+ "volumeMode": self.volume_mode,
71
+ "accessModes": [self.accessmodes],
72
+ "resources": {"requests": {"storage": self.size}},
73
+ }
74
+ }
75
+ )
76
+ """
77
+ Hostpath-provisioner is "node aware", when using it,
78
+ a node attribute on the claim must be introduced as follows.
79
+ annotations:
80
+ kubevirt.io/provisionOnNode: <specified_node_name>
81
+ """
82
+ if self.hostpath_node:
83
+ self.res["metadata"]["annotations"] = {
84
+ "kubevirt.io/provisionOnNode": self.hostpath_node
85
+ }
86
+ if self.storage_class:
87
+ self.res["spec"]["storageClassName"] = self.storage_class
88
+
89
+ def bound(self):
90
+ """
91
+ Check if PVC is bound
92
+
93
+ Returns:
94
+ bool: True if bound else False
95
+ """
96
+ self.logger.info(f"Check if {self.kind} {self.name} is bound")
97
+ return self.status == self.Status.BOUND
98
+
99
+ @property
100
+ def selected_node(self):
101
+ return self.instance.metadata.annotations.get(
102
+ "volume.kubernetes.io/selected-node"
103
+ )
ocp_resources/plan.py ADDED
@@ -0,0 +1,143 @@
1
+ from ocp_resources.constants import TIMEOUT_4MINUTES
2
+ from ocp_resources.mtv import MTV
3
+ from ocp_resources.resource import NamespacedResource
4
+
5
+
6
+ class Plan(NamespacedResource, MTV):
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
+ name=None,
30
+ namespace=None,
31
+ source_provider_name=None,
32
+ source_provider_namespace=None,
33
+ destination_provider_name=None,
34
+ destination_provider_namespace=None,
35
+ storage_map_name=None,
36
+ storage_map_namespace=None,
37
+ network_map_name=None,
38
+ network_map_namespace=None,
39
+ virtual_machines_list=None,
40
+ target_namespace=None,
41
+ warm_migration=False,
42
+ pre_hook_name=None,
43
+ pre_hook_namespace=None,
44
+ after_hook_name=None,
45
+ after_hook_namespace=None,
46
+ client=None,
47
+ teardown=True,
48
+ yaml_file=None,
49
+ delete_timeout=TIMEOUT_4MINUTES,
50
+ **kwargs,
51
+ ):
52
+ super().__init__(
53
+ name=name,
54
+ namespace=namespace,
55
+ client=client,
56
+ teardown=teardown,
57
+ yaml_file=yaml_file,
58
+ delete_timeout=delete_timeout,
59
+ **kwargs,
60
+ )
61
+ self.source_provider_name = source_provider_name
62
+ self.source_provider_namespace = source_provider_namespace
63
+ self.destination_provider_name = destination_provider_name
64
+ self.destination_provider_namespace = destination_provider_namespace
65
+ self.storage_map_name = storage_map_name
66
+ self.storage_map_namespace = storage_map_namespace
67
+ self.network_map_name = network_map_name
68
+ self.network_map_namespace = network_map_namespace
69
+ self.virtual_machines_list = virtual_machines_list
70
+ self.warm_migration = warm_migration
71
+ self.pre_hook_name = pre_hook_name
72
+ self.pre_hook_namespace = pre_hook_namespace
73
+ self.after_hook_name = after_hook_name
74
+ self.after_hook_namespace = after_hook_namespace
75
+ self.target_namespace = target_namespace or self.namespace
76
+ self.condition_message_ready = self.ConditionMessage.PLAN_READY
77
+ self.condition_message_succeeded = self.ConditionMessage.PLAN_SUCCEEDED
78
+
79
+ def generate_hook_spec(hook_name, hook_namespace, hook_type):
80
+ hook = {
81
+ "hook": {
82
+ "name": hook_name,
83
+ "namespace": hook_namespace,
84
+ },
85
+ "step": hook_type,
86
+ }
87
+ return hook
88
+
89
+ hooks_array = []
90
+ if self.pre_hook_name and self.pre_hook_namespace:
91
+ hooks_array.append(
92
+ generate_hook_spec(
93
+ hook_name=self.pre_hook_name,
94
+ hook_namespace=self.pre_hook_namespace,
95
+ hook_type="PreHook",
96
+ )
97
+ )
98
+
99
+ if self.after_hook_name and self.after_hook_namespace:
100
+ hooks_array.append(
101
+ generate_hook_spec(
102
+ hook_name=self.after_hook_name,
103
+ hook_namespace=self.after_hook_namespace,
104
+ hook_type="AfterHook",
105
+ )
106
+ )
107
+
108
+ if hooks_array:
109
+ for vm in self.virtual_machines_list:
110
+ vm["hooks"] = hooks_array
111
+
112
+ def to_dict(self):
113
+ super().to_dict()
114
+ if not self.yaml_file:
115
+ self.res.update(
116
+ {
117
+ "spec": {
118
+ "warm": self.warm_migration,
119
+ "targetNamespace": self.target_namespace,
120
+ "map": {
121
+ "storage": {
122
+ "name": self.storage_map_name,
123
+ "namespace": self.storage_map_namespace,
124
+ },
125
+ "network": {
126
+ "name": self.network_map_name,
127
+ "namespace": self.network_map_namespace,
128
+ },
129
+ },
130
+ "vms": self.virtual_machines_list,
131
+ "provider": {
132
+ "source": {
133
+ "name": self.source_provider_name,
134
+ "namespace": self.source_provider_namespace,
135
+ },
136
+ "destination": {
137
+ "name": self.destination_provider_name,
138
+ "namespace": self.destination_provider_namespace,
139
+ },
140
+ },
141
+ }
142
+ }
143
+ )