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,11 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ from ocp_resources.resource import NamespacedResource
4
+
5
+
6
+ class Gateway(NamespacedResource):
7
+ """
8
+ Gateway object.
9
+ """
10
+
11
+ api_group = NamespacedResource.ApiGroup.NETWORKING_ISTIO_IO
ocp_resources/hook.py ADDED
@@ -0,0 +1,52 @@
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 Hook(NamespacedResource, MTV):
7
+ """
8
+ Migration Tool for Virtualization (MTV) Plan's Hook Resource.
9
+ """
10
+
11
+ api_group = NamespacedResource.ApiGroup.FORKLIFT_KONVEYOR_IO
12
+
13
+ def __init__(
14
+ self,
15
+ name=None,
16
+ namespace=None,
17
+ image="quay.io/konveyor/hook-runner:latest",
18
+ playbook=None,
19
+ client=None,
20
+ teardown=True,
21
+ yaml_file=None,
22
+ delete_timeout=TIMEOUT_4MINUTES,
23
+ **kwargs,
24
+ ):
25
+ """
26
+ Args:
27
+ image (str): Path to an ansible image
28
+ playbook (str): Ansible playbook to be performed
29
+ """
30
+ super().__init__(
31
+ name=name,
32
+ namespace=namespace,
33
+ client=client,
34
+ teardown=teardown,
35
+ yaml_file=yaml_file,
36
+ delete_timeout=delete_timeout,
37
+ **kwargs,
38
+ )
39
+ self.image = image
40
+ self.playbook = playbook
41
+
42
+ def to_dict(self):
43
+ super().to_dict()
44
+ if not self.yaml_file:
45
+ self.res.update(
46
+ {
47
+ "spec": {
48
+ "image": self.image,
49
+ "playbook": self.playbook,
50
+ },
51
+ }
52
+ )
ocp_resources/host.py ADDED
@@ -0,0 +1,64 @@
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 Host(NamespacedResource, MTV):
7
+ """
8
+ Migration Toolkit For Virtualization (MTV) Host resource.
9
+ """
10
+
11
+ api_group = NamespacedResource.ApiGroup.FORKLIFT_KONVEYOR_IO
12
+
13
+ def __init__(
14
+ self,
15
+ name=None,
16
+ namespace=None,
17
+ host_id=None,
18
+ ip_address=None,
19
+ provider_name=None,
20
+ provider_namespace=None,
21
+ secret_name=None,
22
+ secret_namespace=None,
23
+ client=None,
24
+ teardown=True,
25
+ yaml_file=None,
26
+ delete_timeout=TIMEOUT_4MINUTES,
27
+ **kwargs,
28
+ ):
29
+ super().__init__(
30
+ name=name,
31
+ namespace=namespace,
32
+ client=client,
33
+ teardown=teardown,
34
+ yaml_file=yaml_file,
35
+ delete_timeout=delete_timeout,
36
+ **kwargs,
37
+ )
38
+ self.host_id = host_id
39
+ self.ip_address = ip_address
40
+ self.provider_name = provider_name
41
+ self.provider_namespace = provider_namespace
42
+ self.secret_name = secret_name or f"{self.name}-secret"
43
+ self.secret_namespace = secret_namespace or self.namespace
44
+ self.condition_message_ready = self.ConditionMessage.HOST_READY
45
+
46
+ def to_dict(self):
47
+ super().to_dict()
48
+ if not self.yaml_file:
49
+ self.res.update(
50
+ {
51
+ "spec": {
52
+ "id": self.host_id,
53
+ "ipAddress": self.ip_address,
54
+ "secret": {
55
+ "name": self.secret_name,
56
+ "namespace": self.secret_namespace,
57
+ },
58
+ "provider": {
59
+ "name": self.provider_name,
60
+ "namespace": self.provider_namespace,
61
+ },
62
+ }
63
+ }
64
+ )
@@ -0,0 +1,50 @@
1
+ # -*- coding: utf-8 -*-
2
+ from ocp_resources.constants import TIMEOUT_4MINUTES
3
+ from ocp_resources.resource import Resource
4
+
5
+
6
+ class HostPathProvisioner(Resource):
7
+ """
8
+ HostPathProvisioner Custom Resource Object.
9
+ """
10
+
11
+ api_group = Resource.ApiGroup.HOSTPATHPROVISIONER_KUBEVIRT_IO
12
+
13
+ class Name:
14
+ HOSTPATH_PROVISIONER = "hostpath-provisioner"
15
+
16
+ def __init__(
17
+ self,
18
+ name=None,
19
+ path=None,
20
+ image_pull_policy=None,
21
+ client=None,
22
+ teardown=True,
23
+ yaml_file=None,
24
+ delete_timeout=TIMEOUT_4MINUTES,
25
+ **kwargs,
26
+ ):
27
+ super().__init__(
28
+ name=name,
29
+ client=client,
30
+ teardown=teardown,
31
+ yaml_file=yaml_file,
32
+ delete_timeout=delete_timeout,
33
+ **kwargs,
34
+ )
35
+ self.path = path
36
+ self.image_pull_policy = image_pull_policy
37
+
38
+ def to_dict(self):
39
+ super().to_dict()
40
+ if not self.yaml_file:
41
+ spec = self.res.setdefault("spec", {})
42
+ path_config = spec.setdefault("pathConfig", {})
43
+ if self.path:
44
+ path_config["path"] = self.path
45
+ if self.image_pull_policy:
46
+ spec["imagePullPolicy"] = self.image_pull_policy
47
+
48
+ @property
49
+ def volume_path(self):
50
+ return self.instance.spec.pathConfig.path
@@ -0,0 +1,43 @@
1
+ from ocp_resources.constants import TIMEOUT_4MINUTES
2
+ from ocp_resources.resource import NamespacedResource
3
+
4
+
5
+ class HyperConverged(NamespacedResource):
6
+ api_group = NamespacedResource.ApiGroup.HCO_KUBEVIRT_IO
7
+
8
+ def __init__(
9
+ self,
10
+ name=None,
11
+ namespace=None,
12
+ client=None,
13
+ infra=None,
14
+ workloads=None,
15
+ teardown=True,
16
+ yaml_file=None,
17
+ delete_timeout=TIMEOUT_4MINUTES,
18
+ **kwargs,
19
+ ):
20
+ super().__init__(
21
+ name=name,
22
+ namespace=namespace,
23
+ client=client,
24
+ teardown=teardown,
25
+ yaml_file=yaml_file,
26
+ delete_timeout=delete_timeout,
27
+ **kwargs,
28
+ )
29
+ self.infra = infra
30
+ self.workloads = workloads
31
+
32
+ def to_dict(self):
33
+ super().to_dict()
34
+ if not self.yaml_file:
35
+ if self.infra:
36
+ self.res.setdefault("spec", {}).setdefault("infra", {}).update(
37
+ self.infra
38
+ )
39
+
40
+ if self.workloads:
41
+ self.res.setdefault("spec", {}).setdefault("workloads", {}).update(
42
+ self.workloads
43
+ )
ocp_resources/image.py ADDED
@@ -0,0 +1,9 @@
1
+ from ocp_resources.resource import Resource
2
+
3
+
4
+ class Image(Resource):
5
+ """
6
+ Image object.
7
+ """
8
+
9
+ api_group = Resource.ApiGroup.IMAGE_OPENSHIFT_IO
@@ -0,0 +1,9 @@
1
+ from ocp_resources.resource import Resource
2
+
3
+
4
+ class ImageContentSourcePolicy(Resource):
5
+ """
6
+ ICSP object, inherited from Resource.
7
+ """
8
+
9
+ api_group = Resource.ApiGroup.OPERATOR_OPENSHIFT_IO
@@ -0,0 +1,48 @@
1
+ from ocp_resources.constants import TIMEOUT_4MINUTES
2
+ from ocp_resources.resource import NamespacedResource
3
+
4
+
5
+ class ImageStream(NamespacedResource):
6
+ """
7
+ ImageStream object.
8
+ """
9
+
10
+ api_group = NamespacedResource.ApiGroup.IMAGE_OPENSHIFT_IO
11
+
12
+ def __init__(
13
+ self,
14
+ name=None,
15
+ namespace=None,
16
+ client=None,
17
+ lookup_policy=False,
18
+ tags=None,
19
+ teardown=True,
20
+ privileged_client=None,
21
+ yaml_file=None,
22
+ delete_timeout=TIMEOUT_4MINUTES,
23
+ **kwargs,
24
+ ):
25
+ super().__init__(
26
+ name=name,
27
+ namespace=namespace,
28
+ client=client,
29
+ teardown=teardown,
30
+ privileged_client=privileged_client,
31
+ yaml_file=yaml_file,
32
+ delete_timeout=delete_timeout,
33
+ **kwargs,
34
+ )
35
+ self.tags = tags
36
+ self.lookup_policy = lookup_policy
37
+
38
+ def to_dict(self):
39
+ super().to_dict()
40
+ if not self.yaml_file:
41
+ self.res.update(
42
+ {
43
+ "spec": {
44
+ "lookupPolicy": {"local": self.lookup_policy},
45
+ "tags": self.tags,
46
+ }
47
+ }
48
+ )
@@ -0,0 +1,9 @@
1
+ from ocp_resources.resource import NamespacedResource
2
+
3
+
4
+ class ImageStreamTag(NamespacedResource):
5
+ """
6
+ ImageStreamTag object.
7
+ """
8
+
9
+ api_group = NamespacedResource.ApiGroup.IMAGE_OPENSHIFT_IO
@@ -0,0 +1,18 @@
1
+ from ocp_resources.resource import Resource
2
+
3
+
4
+ class Infrastructure(Resource):
5
+ """
6
+ Infrastructure object.
7
+ """
8
+
9
+ api_group = Resource.ApiGroup.CONFIG_OPENSHIFT_IO
10
+
11
+ class Type:
12
+ BARE_METAL = "BareMetal"
13
+ AWS = "AWS"
14
+ OPENSTACK = "OpenStack"
15
+
16
+ @property
17
+ def platform(self):
18
+ return self.instance.status.platformStatus.type
@@ -0,0 +1,8 @@
1
+ from ocp_resources.resource import NamespacedResource
2
+
3
+
4
+ class InstallPlan(NamespacedResource):
5
+ api_group = NamespacedResource.ApiGroup.OPERATORS_COREOS_COM
6
+
7
+ class Status(NamespacedResource.Status):
8
+ COMPLETE = "Complete"
ocp_resources/job.py ADDED
@@ -0,0 +1,65 @@
1
+ from ocp_resources.constants import TIMEOUT_4MINUTES
2
+ from ocp_resources.resource import NamespacedResource
3
+
4
+
5
+ class Job(NamespacedResource):
6
+ """
7
+ Job object.
8
+ """
9
+
10
+ api_group = NamespacedResource.ApiGroup.BATCH
11
+
12
+ class Condition(NamespacedResource.Condition):
13
+ COMPLETE = "Complete"
14
+
15
+ def __init__(
16
+ self,
17
+ name=None,
18
+ namespace=None,
19
+ client=None,
20
+ teardown=True,
21
+ privileged_client=None,
22
+ yaml_file=None,
23
+ delete_timeout=TIMEOUT_4MINUTES,
24
+ backoff_limit=None,
25
+ restart_policy=None,
26
+ service_account=None,
27
+ containers=None,
28
+ **kwargs,
29
+ ):
30
+ super().__init__(
31
+ name=name,
32
+ namespace=namespace,
33
+ client=client,
34
+ teardown=teardown,
35
+ privileged_client=privileged_client,
36
+ yaml_file=yaml_file,
37
+ delete_timeout=delete_timeout,
38
+ **kwargs,
39
+ )
40
+ self.restart_policy = restart_policy
41
+ self.backoff_limit = backoff_limit
42
+ self.service_account = service_account
43
+ self.containers = containers
44
+
45
+ def to_dict(self):
46
+ super().to_dict()
47
+ if not self.yaml_file:
48
+ self.res.setdefault("spec", {})
49
+
50
+ if self.backoff_limit is not None:
51
+ self.res["spec"]["backoffLimit"] = self.backoff_limit
52
+
53
+ if self.containers:
54
+ self.res["spec"].setdefault("template", {}).setdefault("spec", {})
55
+ self.res["spec"]["template"]["spec"]["containers"] = self.containers
56
+
57
+ if self.service_account:
58
+ self.res["spec"]["template"]["spec"][
59
+ "serviceAccount"
60
+ ] = self.service_account
61
+
62
+ if self.restart_policy:
63
+ self.res["spec"]["template"]["spec"][
64
+ "restartPolicy"
65
+ ] = self.restart_policy
@@ -0,0 +1,65 @@
1
+ from ocp_resources.constants import TIMEOUT_4MINUTES
2
+ from ocp_resources.resource import NamespacedResource
3
+
4
+
5
+ class KubeDescheduler(NamespacedResource):
6
+ api_group = NamespacedResource.ApiGroup.OPERATOR_OPENSHIFT_IO
7
+
8
+ def __init__(
9
+ self,
10
+ name=None,
11
+ namespace=None,
12
+ profiles=None,
13
+ descheduling_interval=3600,
14
+ log_level="Normal",
15
+ management_state="Managed",
16
+ mode="Predictive",
17
+ operator_log_level="Normal",
18
+ teardown=True,
19
+ client=None,
20
+ yaml_file=None,
21
+ delete_timeout=TIMEOUT_4MINUTES,
22
+ **kwargs,
23
+ ):
24
+ """
25
+ Create Descheduler object.
26
+
27
+ Args:
28
+ profiles (list): list of descheduling profiles. Supported:
29
+ - AffinityAndTaints
30
+ - TopologyAndDuplicates
31
+ - LifecycleAndUtilization
32
+ log_level (str): logging of a component. Supported: "Normal", "Debug", "Trace", "TraceAll"
33
+ operator_log_level (str): logging of an operator. Supported: "Normal", "Debug", "Trace", "TraceAll"
34
+ """
35
+ super().__init__(
36
+ name=name,
37
+ namespace=namespace,
38
+ client=client,
39
+ teardown=teardown,
40
+ yaml_file=yaml_file,
41
+ delete_timeout=delete_timeout,
42
+ **kwargs,
43
+ )
44
+ self.profiles = profiles or ["AffinityAndTaints"]
45
+ self.descheduling_interval = descheduling_interval
46
+ self.log_level = log_level
47
+ self.management_state = management_state
48
+ self.mode = mode
49
+ self.operator_log_level = operator_log_level
50
+
51
+ def to_dict(self):
52
+ super().to_dict()
53
+ if not self.yaml_file:
54
+ self.res.update(
55
+ {
56
+ "spec": {
57
+ "deschedulingIntervalSeconds": self.descheduling_interval,
58
+ "logLevel": self.log_level,
59
+ "managementState": self.management_state,
60
+ "mode": self.mode,
61
+ "operatorLogLevel": self.operator_log_level,
62
+ "profiles": self.profiles,
63
+ }
64
+ }
65
+ )
@@ -0,0 +1,5 @@
1
+ from ocp_resources.resource import NamespacedResource
2
+
3
+
4
+ class KubeVirt(NamespacedResource):
5
+ api_group = NamespacedResource.ApiGroup.KUBEVIRT_IO
@@ -0,0 +1,5 @@
1
+ from ocp_resources.resource import NamespacedResource
2
+
3
+
4
+ class KubevirtCommonTemplatesBundle(NamespacedResource):
5
+ api_group = NamespacedResource.ApiGroup.SSP_KUBEVIRT_IO
@@ -0,0 +1,5 @@
1
+ from ocp_resources.resource import NamespacedResource
2
+
3
+
4
+ class KubevirtMetricsAggregation(NamespacedResource):
5
+ api_group = NamespacedResource.ApiGroup.SSP_KUBEVIRT_IO
@@ -0,0 +1,5 @@
1
+ from ocp_resources.resource import NamespacedResource
2
+
3
+
4
+ class KubevirtNodeLabellerBundle(NamespacedResource):
5
+ api_group = NamespacedResource.ApiGroup.SSP_KUBEVIRT_IO
@@ -0,0 +1,5 @@
1
+ from ocp_resources.resource import NamespacedResource
2
+
3
+
4
+ class KubevirtTemplateValidator(NamespacedResource):
5
+ api_group = NamespacedResource.ApiGroup.SSP_KUBEVIRT_IO
@@ -0,0 +1,76 @@
1
+ import logging
2
+ import os
3
+ from datetime import datetime
4
+ from logging.handlers import RotatingFileHandler
5
+
6
+ from colorlog import ColoredFormatter
7
+
8
+
9
+ LOGGER = logging.getLogger(__name__)
10
+ LOGGERS = {}
11
+
12
+
13
+ class DuplicateFilter(logging.Filter):
14
+ def filter(self, record):
15
+ repeated_number_exists = getattr(self, "repeated_number", None)
16
+ current_log = (record.module, record.levelno, record.msg)
17
+ if current_log != getattr(self, "last_log", None):
18
+ self.last_log = current_log
19
+ if repeated_number_exists:
20
+ LOGGER.warning(f"Last log repeated {self.repeated_number} times.")
21
+
22
+ self.repeated_number = 0
23
+ return True
24
+ if repeated_number_exists:
25
+ self.repeated_number += 1
26
+ else:
27
+ self.repeated_number = 1
28
+ return False
29
+
30
+
31
+ class WrapperLogFormatter(ColoredFormatter):
32
+ def formatTime(self, record, datefmt=None): # noqa: N802
33
+ return datetime.fromtimestamp(record.created).isoformat()
34
+
35
+
36
+ def get_logger(name):
37
+ if LOGGERS.get(name):
38
+ return LOGGERS.get(name)
39
+
40
+ log_level = os.environ.get("OPENSHIFT_PYTHON_WRAPPER_LOG_LEVEL", "INFO")
41
+ log_file = os.environ.get("OPENSHIFT_PYTHON_WRAPPER_LOG_FILE", "")
42
+ if log_level not in ["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"]:
43
+ raise ValueError(f"Invalid log level: {log_level}")
44
+
45
+ logger_obj = logging.getLogger(name)
46
+ log_formatter = WrapperLogFormatter(
47
+ fmt="%(asctime)s %(name)s %(log_color)s%(levelname)s%(reset)s %(message)s",
48
+ log_colors={
49
+ "DEBUG": "cyan",
50
+ "INFO": "green",
51
+ "WARNING": "yellow",
52
+ "ERROR": "red",
53
+ "CRITICAL": "red,bg_white",
54
+ },
55
+ secondary_log_colors={},
56
+ )
57
+
58
+ console_handler = logging.StreamHandler()
59
+ console_handler.setFormatter(fmt=log_formatter)
60
+ console_handler.addFilter(filter=DuplicateFilter())
61
+
62
+ logger_obj.addHandler(hdlr=console_handler)
63
+ logger_obj.setLevel(level=log_level)
64
+ logger_obj.addFilter(filter=DuplicateFilter())
65
+
66
+ if log_file:
67
+ log_handler = RotatingFileHandler(
68
+ filename=log_file, maxBytes=100 * 1024 * 1024, backupCount=20
69
+ )
70
+ log_handler.setFormatter(fmt=log_formatter)
71
+ log_handler.setLevel(level=log_level)
72
+ logger_obj.addHandler(hdlr=log_handler)
73
+
74
+ logger_obj.propagate = False
75
+ LOGGERS[name] = logger_obj
76
+ return logger_obj
@@ -0,0 +1,50 @@
1
+ from ocp_resources.constants import TIMEOUT_4MINUTES
2
+ from ocp_resources.resource import NamespacedResource
3
+
4
+
5
+ class Machine(NamespacedResource):
6
+ """
7
+ Machine object.
8
+ """
9
+
10
+ api_group = NamespacedResource.ApiGroup.MACHINE_OPENSHIFT_IO
11
+
12
+ def __init__(
13
+ self,
14
+ name=None,
15
+ namespace=None,
16
+ teardown=True,
17
+ client=None,
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
+
32
+ @property
33
+ def cluster_name(self):
34
+ return self.instance.metadata.labels[f"{self.api_group}/cluster-api-cluster"]
35
+
36
+ @property
37
+ def machine_role(self):
38
+ return self.instance.metadata.labels[
39
+ f"{self.api_group}/cluster-api-machine-role"
40
+ ]
41
+
42
+ @property
43
+ def machine_type(self):
44
+ return self.instance.metadata.labels[
45
+ f"{self.api_group}/cluster-api-machine-type"
46
+ ]
47
+
48
+ @property
49
+ def machineset_name(self):
50
+ return self.instance.metadata.labels[f"{self.api_group}/cluster-api-machineset"]
@@ -0,0 +1,5 @@
1
+ from ocp_resources.resource import Resource
2
+
3
+
4
+ class MachineConfig(Resource):
5
+ api_group = Resource.ApiGroup.MACHINECONFIGURATION_OPENSHIFT_IO
@@ -0,0 +1,9 @@
1
+ from ocp_resources.resource import Resource
2
+
3
+
4
+ class MachineConfigPool(Resource):
5
+ api_group = Resource.ApiGroup.MACHINECONFIGURATION_OPENSHIFT_IO
6
+
7
+ class Status(Resource.Status):
8
+ UPDATED = "Updated"
9
+ UPDATING = "Updating"