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
ocp_resources/gateway.py
ADDED
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,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,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
|
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
|
+
)
|
ocp_resources/logger.py
ADDED
|
@@ -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
|
ocp_resources/machine.py
ADDED
|
@@ -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"]
|