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.
- ocp_resources/__init__.py +0 -0
- ocp_resources/api_service.py +9 -0
- ocp_resources/backup.py +52 -0
- ocp_resources/benchmark.py +92 -0
- ocp_resources/catalog_source.py +63 -0
- ocp_resources/catalog_source_config.py +86 -0
- ocp_resources/cdi.py +13 -0
- ocp_resources/cdi_config.py +52 -0
- ocp_resources/chaos_engine.py +30 -0
- ocp_resources/chaos_result.py +11 -0
- ocp_resources/cluster_operator.py +5 -0
- ocp_resources/cluster_role.py +70 -0
- ocp_resources/cluster_role_binding.py +36 -0
- ocp_resources/cluster_service_version.py +8 -0
- ocp_resources/cluster_version.py +5 -0
- ocp_resources/configmap.py +37 -0
- ocp_resources/console_cli_download.py +9 -0
- ocp_resources/console_plugin.py +9 -0
- ocp_resources/console_quick_start.py +9 -0
- ocp_resources/constants.py +26 -0
- ocp_resources/csidriver.py +9 -0
- ocp_resources/custom_resource_definition.py +5 -0
- ocp_resources/daemonset.py +61 -0
- ocp_resources/data_import_cron.py +100 -0
- ocp_resources/data_source.py +59 -0
- ocp_resources/datavolume.py +275 -0
- ocp_resources/deployment.py +65 -0
- ocp_resources/destination_rule.py +11 -0
- ocp_resources/event.py +114 -0
- ocp_resources/forklift_controller.py +10 -0
- ocp_resources/gateway.py +11 -0
- ocp_resources/hook.py +52 -0
- ocp_resources/host.py +64 -0
- ocp_resources/hostpath_provisioner.py +50 -0
- ocp_resources/hyperconverged.py +43 -0
- ocp_resources/image.py +9 -0
- ocp_resources/image_content_source_policy.py +9 -0
- ocp_resources/image_stream.py +48 -0
- ocp_resources/imagestreamtag.py +9 -0
- ocp_resources/infrastructure.py +18 -0
- ocp_resources/installplan.py +8 -0
- ocp_resources/job.py +65 -0
- ocp_resources/kube_descheduler.py +65 -0
- ocp_resources/kubevirt.py +5 -0
- ocp_resources/kubevirt_common_templates_bundle.py +5 -0
- ocp_resources/kubevirt_metrics_aggregation.py +5 -0
- ocp_resources/kubevirt_node_labeller_bundle.py +5 -0
- ocp_resources/kubevirt_template_validaotr.py +5 -0
- ocp_resources/logger.py +76 -0
- ocp_resources/machine.py +50 -0
- ocp_resources/machine_config.py +5 -0
- ocp_resources/machine_config_pool.py +9 -0
- ocp_resources/machine_health_check.py +76 -0
- ocp_resources/machine_set.py +189 -0
- ocp_resources/migration.py +63 -0
- ocp_resources/migration_policy.py +66 -0
- ocp_resources/mtv.py +171 -0
- ocp_resources/mutating_webhook_config.py +9 -0
- ocp_resources/namespace.py +40 -0
- ocp_resources/network.py +5 -0
- ocp_resources/network_addons_config.py +9 -0
- ocp_resources/network_attachment_definition.py +24 -0
- ocp_resources/network_map.py +64 -0
- ocp_resources/network_policy.py +9 -0
- ocp_resources/nmstate.py +9 -0
- ocp_resources/node.py +41 -0
- ocp_resources/node_health_check.py +10 -0
- ocp_resources/node_maintenance.py +40 -0
- ocp_resources/node_network_configuration_enactment.py +20 -0
- ocp_resources/node_network_configuration_policy.py +472 -0
- ocp_resources/node_network_state.py +121 -0
- ocp_resources/oauth.py +9 -0
- ocp_resources/operator_condition.py +5 -0
- ocp_resources/operator_group.py +37 -0
- ocp_resources/operator_hub.py +5 -0
- ocp_resources/operator_source.py +50 -0
- ocp_resources/package_manifest.py +5 -0
- ocp_resources/peer_authentication.py +18 -0
- ocp_resources/persistent_volume.py +27 -0
- ocp_resources/persistent_volume_claim.py +103 -0
- ocp_resources/plan.py +143 -0
- ocp_resources/pod.py +175 -0
- ocp_resources/pod_disruption_budget.py +53 -0
- ocp_resources/priority_class.py +48 -0
- ocp_resources/project.py +60 -0
- ocp_resources/prometheus.py +9 -0
- ocp_resources/prometheus_rule.py +9 -0
- ocp_resources/provider.py +59 -0
- ocp_resources/replicaset.py +11 -0
- ocp_resources/resource.py +1383 -0
- ocp_resources/restore.py +52 -0
- ocp_resources/role.py +11 -0
- ocp_resources/role_binding.py +67 -0
- ocp_resources/route.py +76 -0
- ocp_resources/secret.py +75 -0
- ocp_resources/security_context_constraints.py +9 -0
- ocp_resources/service.py +16 -0
- ocp_resources/service_account.py +9 -0
- ocp_resources/service_mesh_control_plane.py +11 -0
- ocp_resources/service_mesh_member_roll.py +14 -0
- ocp_resources/service_monitor.py +9 -0
- ocp_resources/sriov_network.py +54 -0
- ocp_resources/sriov_network_node_policy.py +67 -0
- ocp_resources/sriov_network_node_state.py +44 -0
- ocp_resources/ssp.py +9 -0
- ocp_resources/storage_class.py +47 -0
- ocp_resources/storage_map.py +67 -0
- ocp_resources/storage_profile.py +7 -0
- ocp_resources/subscription.py +66 -0
- ocp_resources/tekton_tasks.py +9 -0
- ocp_resources/template.py +74 -0
- ocp_resources/upload_token_request.py +39 -0
- ocp_resources/utils.py +278 -0
- ocp_resources/validating_webhook_config.py +9 -0
- ocp_resources/virtual_machine.py +177 -0
- ocp_resources/virtual_machine_Instance_replica_set.py +9 -0
- ocp_resources/virtual_machine_cluster_flavor.py +5 -0
- ocp_resources/virtual_machine_flavor.py +5 -0
- ocp_resources/virtual_machine_import.py +307 -0
- ocp_resources/virtual_machine_instance.py +322 -0
- ocp_resources/virtual_machine_instance_migration.py +36 -0
- ocp_resources/virtual_machine_instance_preset.py +9 -0
- ocp_resources/virtual_machine_restore.py +99 -0
- ocp_resources/virtual_machine_snapshot.py +96 -0
- ocp_resources/virtual_service.py +11 -0
- ocp_resources/vm_import_config.py +9 -0
- ocp_resources/volume_snapshot.py +9 -0
- ocp_resources/volume_snapshot_class.py +9 -0
- openshift_python_wrapper-4.11.61.dist-info/LICENSE +201 -0
- openshift_python_wrapper-4.11.61.dist-info/METADATA +188 -0
- openshift_python_wrapper-4.11.61.dist-info/RECORD +132 -0
- 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,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,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,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
|
+
)
|