From a26a4caa13e0865aecbbb631dbe9b94678079ebc Mon Sep 17 00:00:00 2001 From: rnetser Date: Thu, 19 Feb 2026 16:01:10 +0200 Subject: [PATCH 1/3] fix: add exceptions import to template_imports in user_code_parser The template_imports set in user_code_parser.py was missing "from ocp_resources.exceptions import MissingRequiredArgumentError", causing duplicate imports when regenerating resource files with --overwrite. Closes #2656 --- class_generator/parsers/user_code_parser.py | 1 + .../tests/test_user_code_parser.py | 38 +++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/class_generator/parsers/user_code_parser.py b/class_generator/parsers/user_code_parser.py index 07c2cc043d..2e97f9f080 100644 --- a/class_generator/parsers/user_code_parser.py +++ b/class_generator/parsers/user_code_parser.py @@ -62,6 +62,7 @@ def parse_user_code_from_file(file_path: str) -> tuple[str, str]: "from ocp_resources.resource import Resource", "from ocp_resources.resource import NamespacedResource, MissingRequiredArgumentError", "from ocp_resources.resource import Resource, MissingRequiredArgumentError", + "from ocp_resources.exceptions import MissingRequiredArgumentError", } for _import in imports: diff --git a/class_generator/tests/test_user_code_parser.py b/class_generator/tests/test_user_code_parser.py index 80ef86b8f0..aee4a8085e 100644 --- a/class_generator/tests/test_user_code_parser.py +++ b/class_generator/tests/test_user_code_parser.py @@ -203,6 +203,44 @@ class MyResource(Resource): assert user_code.strip() == "" # Only whitespace after marker assert user_imports == "" + def test_parse_file_with_exceptions_import(self): + """Test parsing a file with import from ocp_resources.exceptions module.""" + content = '''# Generated using https://github.com/RedHatQE/openshift-python-wrapper/blob/main/scripts/resource/README.md + +from typing import Any +from ocp_resources.resource import NamespacedResource +from ocp_resources.exceptions import MissingRequiredArgumentError +import json + + +class MyResource(NamespacedResource): + """My resource class.""" + + def __init__(self, **kwargs): + super().__init__(**kwargs) + + # End of generated code + + def custom_method(self): + return True +''' + + with tempfile.NamedTemporaryFile(mode="w", suffix=".py", delete=False) as f: + f.write(content) + f.flush() + + _user_code, user_imports = parse_user_code_from_file(file_path=f.name) + + Path(f.name).unlink() + + # Template imports should be filtered out + assert "from ocp_resources.exceptions import MissingRequiredArgumentError" not in user_imports + assert "from typing import Any" not in user_imports + assert "from ocp_resources.resource import NamespacedResource" not in user_imports + + # User imports should be preserved + assert "import json" in user_imports + def test_parse_file_with_syntax_error(self): """Test parsing a file with syntax errors in imports section.""" content = '''# Generated using https://github.com/RedHatQE/openshift-python-wrapper/blob/main/scripts/resource/README.md From af00cee0697007fac520a5e4494ba61f7df1a083 Mon Sep 17 00:00:00 2001 From: rnetser Date: Wed, 25 Feb 2026 17:02:56 +0200 Subject: [PATCH 2/3] convert all imports to import from exceptnios --- class_generator/parsers/user_code_parser.py | 2 -- ocp_resources/application_aware_cluster_resource_quota.py | 3 ++- ocp_resources/application_aware_resource_quota.py | 3 ++- ocp_resources/authorino.py | 3 ++- ocp_resources/catalog_source.py | 3 ++- ocp_resources/cluster_resource_quota.py | 3 ++- ocp_resources/cluster_role.py | 3 ++- ocp_resources/cluster_role_binding.py | 3 ++- ocp_resources/cluster_user_defined_network.py | 3 ++- ocp_resources/config_imageregistry_operator_openshift_io.py | 3 ++- ocp_resources/controller_revision.py | 3 ++- ocp_resources/cron_job.py | 3 ++- ocp_resources/csi_storage_capacity.py | 3 ++- ocp_resources/data_import_cron.py | 3 ++- ocp_resources/data_source.py | 3 ++- ocp_resources/deployment.py | 3 ++- ocp_resources/dsc_initialization.py | 3 ++- ocp_resources/endpoint_slice.py | 3 ++- ocp_resources/endpoints.py | 3 ++- ocp_resources/fence_agent_remediation_templates.py | 3 ++- ocp_resources/group.py | 3 ++- ocp_resources/image_caching_internal_knative_dev.py | 3 ++- ocp_resources/image_digest_mirror_set.py | 3 ++- ocp_resources/inference_graph.py | 3 ++- ocp_resources/inference_service.py | 3 ++- ocp_resources/ip_address_pool.py | 3 ++- ocp_resources/limit_range.py | 3 ++- ocp_resources/llama_stack_distribution.py | 3 ++- ocp_resources/lm_eval_job.py | 3 ++- ocp_resources/mig_analytic.py | 3 ++- ocp_resources/mig_cluster.py | 3 ++- ocp_resources/mig_migration.py | 3 ++- ocp_resources/model_registry.py | 3 ++- ocp_resources/model_registry_modelregistry_opendatahub_io.py | 3 ++- ocp_resources/multi_cluster_observability.py | 3 ++- ocp_resources/multi_network_policy.py | 3 ++- ocp_resources/network_attachment_definition.py | 3 ++- ocp_resources/node_health_check.py | 3 ++- ocp_resources/performance_profile.py | 3 ++- ocp_resources/pod.py | 4 ++-- ocp_resources/pod_metrics.py | 3 ++- ocp_resources/reclaim_space_cron_job.py | 3 ++- ocp_resources/reclaim_space_job.py | 3 ++- ocp_resources/replica_set.py | 3 ++- ocp_resources/resource_quota.py | 3 ++- ocp_resources/restore.py | 3 ++- ocp_resources/role.py | 3 ++- ocp_resources/sealed_secret.py | 3 ++- ocp_resources/security_context_constraints.py | 3 ++- ocp_resources/service_mesh_member.py | 3 ++- ocp_resources/serving_runtime.py | 3 ++- ocp_resources/snapshot.py | 3 ++- ocp_resources/ssp.py | 3 ++- ocp_resources/storage_class.py | 3 ++- ocp_resources/trustyai_service.py | 3 ++- ocp_resources/user.py | 3 ++- ocp_resources/user_defined_network.py | 3 ++- ocp_resources/virtual_machine_clone.py | 3 ++- ocp_resources/virtual_machine_cluster_instancetype.py | 3 ++- ocp_resources/virtual_machine_export.py | 3 ++- ocp_resources/virtual_machine_instance_preset.py | 3 ++- ocp_resources/virtual_machine_instance_replica_set.py | 3 ++- ocp_resources/virtual_machine_instancetype.py | 3 ++- ocp_resources/volume_snapshot.py | 3 ++- ocp_resources/volume_snapshot_class.py | 3 ++- 65 files changed, 128 insertions(+), 67 deletions(-) diff --git a/class_generator/parsers/user_code_parser.py b/class_generator/parsers/user_code_parser.py index 2e97f9f080..68608ac619 100644 --- a/class_generator/parsers/user_code_parser.py +++ b/class_generator/parsers/user_code_parser.py @@ -60,8 +60,6 @@ def parse_user_code_from_file(file_path: str) -> tuple[str, str]: "from typing import Any", "from ocp_resources.resource import NamespacedResource", "from ocp_resources.resource import Resource", - "from ocp_resources.resource import NamespacedResource, MissingRequiredArgumentError", - "from ocp_resources.resource import Resource, MissingRequiredArgumentError", "from ocp_resources.exceptions import MissingRequiredArgumentError", } diff --git a/ocp_resources/application_aware_cluster_resource_quota.py b/ocp_resources/application_aware_cluster_resource_quota.py index e699d7a5b9..f2ed054a2b 100644 --- a/ocp_resources/application_aware_cluster_resource_quota.py +++ b/ocp_resources/application_aware_cluster_resource_quota.py @@ -2,7 +2,8 @@ # TODO: update API reference when OCP doc is available from typing import Any -from ocp_resources.resource import MissingRequiredArgumentError, Resource +from ocp_resources.exceptions import MissingRequiredArgumentError +from ocp_resources.resource import Resource class ApplicationAwareClusterResourceQuota(Resource): diff --git a/ocp_resources/application_aware_resource_quota.py b/ocp_resources/application_aware_resource_quota.py index 5c303b0362..6ed2b8a4a4 100644 --- a/ocp_resources/application_aware_resource_quota.py +++ b/ocp_resources/application_aware_resource_quota.py @@ -2,7 +2,8 @@ # TODO: update API reference when OCP doc is available from typing import Any -from ocp_resources.resource import MissingRequiredArgumentError, NamespacedResource +from ocp_resources.exceptions import MissingRequiredArgumentError +from ocp_resources.resource import NamespacedResource class ApplicationAwareResourceQuota(NamespacedResource): diff --git a/ocp_resources/authorino.py b/ocp_resources/authorino.py index 927f9c820c..6febc8f3d5 100644 --- a/ocp_resources/authorino.py +++ b/ocp_resources/authorino.py @@ -3,7 +3,8 @@ from typing import Any -from ocp_resources.resource import MissingRequiredArgumentError, NamespacedResource +from ocp_resources.exceptions import MissingRequiredArgumentError +from ocp_resources.resource import NamespacedResource class Authorino(NamespacedResource): diff --git a/ocp_resources/catalog_source.py b/ocp_resources/catalog_source.py index 36b0b30bcd..a9916f5d74 100644 --- a/ocp_resources/catalog_source.py +++ b/ocp_resources/catalog_source.py @@ -1,6 +1,7 @@ from typing import Any -from ocp_resources.resource import MissingRequiredArgumentError, NamespacedResource +from ocp_resources.exceptions import MissingRequiredArgumentError +from ocp_resources.resource import NamespacedResource class CatalogSource(NamespacedResource): diff --git a/ocp_resources/cluster_resource_quota.py b/ocp_resources/cluster_resource_quota.py index 17a8f11b10..fc20595bea 100644 --- a/ocp_resources/cluster_resource_quota.py +++ b/ocp_resources/cluster_resource_quota.py @@ -3,7 +3,8 @@ from typing import Any -from ocp_resources.resource import MissingRequiredArgumentError, Resource +from ocp_resources.exceptions import MissingRequiredArgumentError +from ocp_resources.resource import Resource class ClusterResourceQuota(Resource): diff --git a/ocp_resources/cluster_role.py b/ocp_resources/cluster_role.py index 81d81700a6..32f80519df 100644 --- a/ocp_resources/cluster_role.py +++ b/ocp_resources/cluster_role.py @@ -1,4 +1,5 @@ -from ocp_resources.resource import MissingRequiredArgumentError, Resource +from ocp_resources.exceptions import MissingRequiredArgumentError +from ocp_resources.resource import Resource class ClusterRole(Resource): diff --git a/ocp_resources/cluster_role_binding.py b/ocp_resources/cluster_role_binding.py index 4a0c5df710..24539efe5f 100644 --- a/ocp_resources/cluster_role_binding.py +++ b/ocp_resources/cluster_role_binding.py @@ -1,5 +1,6 @@ from ocp_resources.cluster_role import ClusterRole -from ocp_resources.resource import MissingRequiredArgumentError, Resource +from ocp_resources.exceptions import MissingRequiredArgumentError +from ocp_resources.resource import Resource class ClusterRoleBinding(Resource): diff --git a/ocp_resources/cluster_user_defined_network.py b/ocp_resources/cluster_user_defined_network.py index 94e1da0a7a..2b4af3cf23 100644 --- a/ocp_resources/cluster_user_defined_network.py +++ b/ocp_resources/cluster_user_defined_network.py @@ -3,7 +3,8 @@ from typing import Any -from ocp_resources.resource import MissingRequiredArgumentError, Resource +from ocp_resources.exceptions import MissingRequiredArgumentError +from ocp_resources.resource import Resource class ClusterUserDefinedNetwork(Resource): diff --git a/ocp_resources/config_imageregistry_operator_openshift_io.py b/ocp_resources/config_imageregistry_operator_openshift_io.py index 5f4fc549b8..442c3e2e35 100644 --- a/ocp_resources/config_imageregistry_operator_openshift_io.py +++ b/ocp_resources/config_imageregistry_operator_openshift_io.py @@ -3,7 +3,8 @@ from typing import Any -from ocp_resources.resource import MissingRequiredArgumentError, Resource +from ocp_resources.exceptions import MissingRequiredArgumentError +from ocp_resources.resource import Resource class Config(Resource): diff --git a/ocp_resources/controller_revision.py b/ocp_resources/controller_revision.py index 1e351fc90c..1a0c9efd05 100644 --- a/ocp_resources/controller_revision.py +++ b/ocp_resources/controller_revision.py @@ -1,4 +1,5 @@ -from ocp_resources.resource import MissingRequiredArgumentError, NamespacedResource +from ocp_resources.exceptions import MissingRequiredArgumentError +from ocp_resources.resource import NamespacedResource class ControllerRevision(NamespacedResource): diff --git a/ocp_resources/cron_job.py b/ocp_resources/cron_job.py index 7987bd29e5..33d5d8df76 100644 --- a/ocp_resources/cron_job.py +++ b/ocp_resources/cron_job.py @@ -1,4 +1,5 @@ -from ocp_resources.resource import MissingRequiredArgumentError, NamespacedResource +from ocp_resources.exceptions import MissingRequiredArgumentError +from ocp_resources.resource import NamespacedResource class CronJob(NamespacedResource): diff --git a/ocp_resources/csi_storage_capacity.py b/ocp_resources/csi_storage_capacity.py index 1fcedb77b4..9f0ccd144f 100644 --- a/ocp_resources/csi_storage_capacity.py +++ b/ocp_resources/csi_storage_capacity.py @@ -1,4 +1,5 @@ -from ocp_resources.resource import MissingRequiredArgumentError, NamespacedResource +from ocp_resources.exceptions import MissingRequiredArgumentError +from ocp_resources.resource import NamespacedResource class CSIStorageCapacity(NamespacedResource): diff --git a/ocp_resources/data_import_cron.py b/ocp_resources/data_import_cron.py index 12b4801c07..7a29828408 100644 --- a/ocp_resources/data_import_cron.py +++ b/ocp_resources/data_import_cron.py @@ -3,7 +3,8 @@ from typing import Any -from ocp_resources.resource import MissingRequiredArgumentError, NamespacedResource +from ocp_resources.exceptions import MissingRequiredArgumentError +from ocp_resources.resource import NamespacedResource class DataImportCron(NamespacedResource): diff --git a/ocp_resources/data_source.py b/ocp_resources/data_source.py index 4c4ffa665a..812171406f 100644 --- a/ocp_resources/data_source.py +++ b/ocp_resources/data_source.py @@ -2,8 +2,9 @@ from kubernetes.dynamic.exceptions import ResourceNotFoundError +from ocp_resources.exceptions import MissingRequiredArgumentError from ocp_resources.persistent_volume_claim import PersistentVolumeClaim -from ocp_resources.resource import MissingRequiredArgumentError, NamespacedResource +from ocp_resources.resource import NamespacedResource from ocp_resources.volume_snapshot import VolumeSnapshot diff --git a/ocp_resources/deployment.py b/ocp_resources/deployment.py index ed0d68db1b..eb159cca32 100644 --- a/ocp_resources/deployment.py +++ b/ocp_resources/deployment.py @@ -4,7 +4,8 @@ from timeout_sampler import TimeoutSampler, TimeoutWatch -from ocp_resources.resource import MissingRequiredArgumentError, NamespacedResource +from ocp_resources.exceptions import MissingRequiredArgumentError +from ocp_resources.resource import NamespacedResource from ocp_resources.utils.constants import PROTOCOL_ERROR_EXCEPTION_DICT, TIMEOUT_4MINUTES diff --git a/ocp_resources/dsc_initialization.py b/ocp_resources/dsc_initialization.py index f8106a95ac..106fcf449f 100644 --- a/ocp_resources/dsc_initialization.py +++ b/ocp_resources/dsc_initialization.py @@ -3,7 +3,8 @@ from typing import Any -from ocp_resources.resource import MissingRequiredArgumentError, Resource +from ocp_resources.exceptions import MissingRequiredArgumentError +from ocp_resources.resource import Resource class DSCInitialization(Resource): diff --git a/ocp_resources/endpoint_slice.py b/ocp_resources/endpoint_slice.py index 4bf8d57f90..df4349082c 100644 --- a/ocp_resources/endpoint_slice.py +++ b/ocp_resources/endpoint_slice.py @@ -1,4 +1,5 @@ -from ocp_resources.resource import MissingRequiredArgumentError, NamespacedResource +from ocp_resources.exceptions import MissingRequiredArgumentError +from ocp_resources.resource import NamespacedResource from ocp_resources.utils.constants import TIMEOUT_4MINUTES diff --git a/ocp_resources/endpoints.py b/ocp_resources/endpoints.py index 81e127c80d..982a72727d 100644 --- a/ocp_resources/endpoints.py +++ b/ocp_resources/endpoints.py @@ -1,4 +1,5 @@ -from ocp_resources.resource import MissingRequiredArgumentError, NamespacedResource +from ocp_resources.exceptions import MissingRequiredArgumentError +from ocp_resources.resource import NamespacedResource from ocp_resources.utils.constants import TIMEOUT_4MINUTES diff --git a/ocp_resources/fence_agent_remediation_templates.py b/ocp_resources/fence_agent_remediation_templates.py index ed61feed3f..226e885391 100644 --- a/ocp_resources/fence_agent_remediation_templates.py +++ b/ocp_resources/fence_agent_remediation_templates.py @@ -1,6 +1,7 @@ from typing import Any -from ocp_resources.resource import MissingRequiredArgumentError, NamespacedResource +from ocp_resources.exceptions import MissingRequiredArgumentError +from ocp_resources.resource import NamespacedResource class FenceAgentsRemediationTemplate(NamespacedResource): diff --git a/ocp_resources/group.py b/ocp_resources/group.py index f82b9c2b28..034d541ce2 100644 --- a/ocp_resources/group.py +++ b/ocp_resources/group.py @@ -3,7 +3,8 @@ from typing import Any -from ocp_resources.resource import MissingRequiredArgumentError, Resource +from ocp_resources.exceptions import MissingRequiredArgumentError +from ocp_resources.resource import Resource class Group(Resource): diff --git a/ocp_resources/image_caching_internal_knative_dev.py b/ocp_resources/image_caching_internal_knative_dev.py index 5737366c44..7ac121fa08 100644 --- a/ocp_resources/image_caching_internal_knative_dev.py +++ b/ocp_resources/image_caching_internal_knative_dev.py @@ -2,7 +2,8 @@ from typing import Any -from ocp_resources.resource import MissingRequiredArgumentError, NamespacedResource +from ocp_resources.exceptions import MissingRequiredArgumentError +from ocp_resources.resource import NamespacedResource class Image(NamespacedResource): diff --git a/ocp_resources/image_digest_mirror_set.py b/ocp_resources/image_digest_mirror_set.py index e36c647b39..a4efa5d87a 100644 --- a/ocp_resources/image_digest_mirror_set.py +++ b/ocp_resources/image_digest_mirror_set.py @@ -1,4 +1,5 @@ -from ocp_resources.resource import MissingRequiredArgumentError, Resource +from ocp_resources.exceptions import MissingRequiredArgumentError +from ocp_resources.resource import Resource class ImageDigestMirrorSet(Resource): diff --git a/ocp_resources/inference_graph.py b/ocp_resources/inference_graph.py index 9a810fa549..88fe4ee98f 100644 --- a/ocp_resources/inference_graph.py +++ b/ocp_resources/inference_graph.py @@ -3,7 +3,8 @@ from typing import Any -from ocp_resources.resource import MissingRequiredArgumentError, NamespacedResource +from ocp_resources.exceptions import MissingRequiredArgumentError +from ocp_resources.resource import NamespacedResource class InferenceGraph(NamespacedResource): diff --git a/ocp_resources/inference_service.py b/ocp_resources/inference_service.py index 80cd28ad44..1683d8a4ec 100644 --- a/ocp_resources/inference_service.py +++ b/ocp_resources/inference_service.py @@ -1,6 +1,7 @@ from typing import Any -from ocp_resources.resource import MissingRequiredArgumentError, NamespacedResource +from ocp_resources.exceptions import MissingRequiredArgumentError +from ocp_resources.resource import NamespacedResource class InferenceService(NamespacedResource): diff --git a/ocp_resources/ip_address_pool.py b/ocp_resources/ip_address_pool.py index 798b1f3eb6..3d357b3c74 100644 --- a/ocp_resources/ip_address_pool.py +++ b/ocp_resources/ip_address_pool.py @@ -1,6 +1,7 @@ # API reference: https://metallb.universe.tf/apis/#metallb.io/v1beta1.IPAddressPool -from ocp_resources.resource import MissingRequiredArgumentError, NamespacedResource +from ocp_resources.exceptions import MissingRequiredArgumentError +from ocp_resources.resource import NamespacedResource class IPAddressPool(NamespacedResource): diff --git a/ocp_resources/limit_range.py b/ocp_resources/limit_range.py index beeded38ad..4877a5483b 100644 --- a/ocp_resources/limit_range.py +++ b/ocp_resources/limit_range.py @@ -1,6 +1,7 @@ # API reference: https://kubernetes.io/docs/reference/kubernetes-api/policy-resources/limit-range-v1/ -from ocp_resources.resource import MissingRequiredArgumentError, NamespacedResource +from ocp_resources.exceptions import MissingRequiredArgumentError +from ocp_resources.resource import NamespacedResource class LimitRange(NamespacedResource): diff --git a/ocp_resources/llama_stack_distribution.py b/ocp_resources/llama_stack_distribution.py index ad5ed211ea..2a80917e1c 100644 --- a/ocp_resources/llama_stack_distribution.py +++ b/ocp_resources/llama_stack_distribution.py @@ -3,7 +3,8 @@ from typing import Any -from ocp_resources.resource import MissingRequiredArgumentError, NamespacedResource +from ocp_resources.exceptions import MissingRequiredArgumentError +from ocp_resources.resource import NamespacedResource class LlamaStackDistribution(NamespacedResource): diff --git a/ocp_resources/lm_eval_job.py b/ocp_resources/lm_eval_job.py index 2f142974ce..d3155e9ce7 100644 --- a/ocp_resources/lm_eval_job.py +++ b/ocp_resources/lm_eval_job.py @@ -3,7 +3,8 @@ from typing import Any -from ocp_resources.resource import MissingRequiredArgumentError, NamespacedResource +from ocp_resources.exceptions import MissingRequiredArgumentError +from ocp_resources.resource import NamespacedResource class LMEvalJob(NamespacedResource): diff --git a/ocp_resources/mig_analytic.py b/ocp_resources/mig_analytic.py index 47a1b34583..ab15f3bead 100644 --- a/ocp_resources/mig_analytic.py +++ b/ocp_resources/mig_analytic.py @@ -3,7 +3,8 @@ from typing import Any -from ocp_resources.resource import MissingRequiredArgumentError, NamespacedResource +from ocp_resources.exceptions import MissingRequiredArgumentError +from ocp_resources.resource import NamespacedResource class MigAnalytic(NamespacedResource): diff --git a/ocp_resources/mig_cluster.py b/ocp_resources/mig_cluster.py index c3a22894d3..5fb2bf7d6c 100644 --- a/ocp_resources/mig_cluster.py +++ b/ocp_resources/mig_cluster.py @@ -3,7 +3,8 @@ from typing import Any -from ocp_resources.resource import MissingRequiredArgumentError, NamespacedResource +from ocp_resources.exceptions import MissingRequiredArgumentError +from ocp_resources.resource import NamespacedResource class MigCluster(NamespacedResource): diff --git a/ocp_resources/mig_migration.py b/ocp_resources/mig_migration.py index 6c78b3e76a..0f326b3ee7 100644 --- a/ocp_resources/mig_migration.py +++ b/ocp_resources/mig_migration.py @@ -3,7 +3,8 @@ from typing import Any -from ocp_resources.resource import MissingRequiredArgumentError, NamespacedResource +from ocp_resources.exceptions import MissingRequiredArgumentError +from ocp_resources.resource import NamespacedResource class MigMigration(NamespacedResource): diff --git a/ocp_resources/model_registry.py b/ocp_resources/model_registry.py index bd02c79c43..ccd3f8aa8e 100644 --- a/ocp_resources/model_registry.py +++ b/ocp_resources/model_registry.py @@ -3,7 +3,8 @@ from typing import Any from warnings import warn -from ocp_resources.resource import MissingRequiredArgumentError, NamespacedResource +from ocp_resources.exceptions import MissingRequiredArgumentError +from ocp_resources.resource import NamespacedResource warn( "model_registry.py module will be removed in the next release, " diff --git a/ocp_resources/model_registry_modelregistry_opendatahub_io.py b/ocp_resources/model_registry_modelregistry_opendatahub_io.py index ad4d6f54c5..f02102de62 100644 --- a/ocp_resources/model_registry_modelregistry_opendatahub_io.py +++ b/ocp_resources/model_registry_modelregistry_opendatahub_io.py @@ -3,7 +3,8 @@ from typing import Any -from ocp_resources.resource import MissingRequiredArgumentError, NamespacedResource +from ocp_resources.exceptions import MissingRequiredArgumentError +from ocp_resources.resource import NamespacedResource class ModelRegistry(NamespacedResource): diff --git a/ocp_resources/multi_cluster_observability.py b/ocp_resources/multi_cluster_observability.py index a2934d0595..5d1c6348f3 100644 --- a/ocp_resources/multi_cluster_observability.py +++ b/ocp_resources/multi_cluster_observability.py @@ -1,4 +1,5 @@ -from ocp_resources.resource import MissingRequiredArgumentError, Resource +from ocp_resources.exceptions import MissingRequiredArgumentError +from ocp_resources.resource import Resource class MultiClusterObservability(Resource): diff --git a/ocp_resources/multi_network_policy.py b/ocp_resources/multi_network_policy.py index eb5ef7bbd5..279c1f5395 100644 --- a/ocp_resources/multi_network_policy.py +++ b/ocp_resources/multi_network_policy.py @@ -1,4 +1,5 @@ -from ocp_resources.resource import MissingRequiredArgumentError, NamespacedResource +from ocp_resources.exceptions import MissingRequiredArgumentError +from ocp_resources.resource import NamespacedResource class MultiNetworkPolicy(NamespacedResource): diff --git a/ocp_resources/network_attachment_definition.py b/ocp_resources/network_attachment_definition.py index f07a7eff7e..93fa29f937 100644 --- a/ocp_resources/network_attachment_definition.py +++ b/ocp_resources/network_attachment_definition.py @@ -1,6 +1,7 @@ import json -from ocp_resources.resource import MissingRequiredArgumentError, NamespacedResource +from ocp_resources.exceptions import MissingRequiredArgumentError +from ocp_resources.resource import NamespacedResource DEFAULT_CNI_VERSION = "0.3.1" diff --git a/ocp_resources/node_health_check.py b/ocp_resources/node_health_check.py index 2f88d67189..7b5b50ca01 100644 --- a/ocp_resources/node_health_check.py +++ b/ocp_resources/node_health_check.py @@ -1,4 +1,5 @@ -from ocp_resources.resource import MissingRequiredArgumentError, Resource +from ocp_resources.exceptions import MissingRequiredArgumentError +from ocp_resources.resource import Resource class NodeHealthCheck(Resource): diff --git a/ocp_resources/performance_profile.py b/ocp_resources/performance_profile.py index 4ca07391a1..b4eb1b909b 100644 --- a/ocp_resources/performance_profile.py +++ b/ocp_resources/performance_profile.py @@ -1,4 +1,5 @@ -from ocp_resources.resource import MissingRequiredArgumentError, Resource +from ocp_resources.exceptions import MissingRequiredArgumentError +from ocp_resources.resource import Resource class PerformanceProfile(Resource): diff --git a/ocp_resources/pod.py b/ocp_resources/pod.py index 6d20e256ce..e9dc5d42d3 100644 --- a/ocp_resources/pod.py +++ b/ocp_resources/pod.py @@ -6,9 +6,9 @@ import kubernetes from timeout_sampler import TimeoutWatch -from ocp_resources.exceptions import ExecOnPodError +from ocp_resources.exceptions import ExecOnPodError, MissingRequiredArgumentError from ocp_resources.node import Node -from ocp_resources.resource import MissingRequiredArgumentError, NamespacedResource +from ocp_resources.resource import NamespacedResource from ocp_resources.utils.constants import TIMEOUT_5SEC diff --git a/ocp_resources/pod_metrics.py b/ocp_resources/pod_metrics.py index d035a8c73f..8c0458d72a 100644 --- a/ocp_resources/pod_metrics.py +++ b/ocp_resources/pod_metrics.py @@ -3,7 +3,8 @@ from typing import Any -from ocp_resources.resource import MissingRequiredArgumentError, NamespacedResource +from ocp_resources.exceptions import MissingRequiredArgumentError +from ocp_resources.resource import NamespacedResource class PodMetrics(NamespacedResource): diff --git a/ocp_resources/reclaim_space_cron_job.py b/ocp_resources/reclaim_space_cron_job.py index 9e51cf5d03..c8283d647b 100644 --- a/ocp_resources/reclaim_space_cron_job.py +++ b/ocp_resources/reclaim_space_cron_job.py @@ -1,6 +1,7 @@ from typing import Any -from ocp_resources.resource import MissingRequiredArgumentError, NamespacedResource +from ocp_resources.exceptions import MissingRequiredArgumentError +from ocp_resources.resource import NamespacedResource class ReclaimSpaceCronJob(NamespacedResource): diff --git a/ocp_resources/reclaim_space_job.py b/ocp_resources/reclaim_space_job.py index e04b6084ad..6809b134ca 100644 --- a/ocp_resources/reclaim_space_job.py +++ b/ocp_resources/reclaim_space_job.py @@ -1,6 +1,7 @@ from typing import Any -from ocp_resources.resource import MissingRequiredArgumentError, NamespacedResource +from ocp_resources.exceptions import MissingRequiredArgumentError +from ocp_resources.resource import NamespacedResource class ReclaimSpaceJob(NamespacedResource): diff --git a/ocp_resources/replica_set.py b/ocp_resources/replica_set.py index 7b0ae444b9..767a9767fc 100644 --- a/ocp_resources/replica_set.py +++ b/ocp_resources/replica_set.py @@ -3,7 +3,8 @@ from typing import Any -from ocp_resources.resource import MissingRequiredArgumentError, NamespacedResource +from ocp_resources.exceptions import MissingRequiredArgumentError +from ocp_resources.resource import NamespacedResource class ReplicaSet(NamespacedResource): diff --git a/ocp_resources/resource_quota.py b/ocp_resources/resource_quota.py index c045b2e6cd..afc6dc82d7 100644 --- a/ocp_resources/resource_quota.py +++ b/ocp_resources/resource_quota.py @@ -1,6 +1,7 @@ # API reference: https://kubernetes.io/docs/reference/kubernetes-api/policy-resources/resource-quota-v1/ -from ocp_resources.resource import MissingRequiredArgumentError, NamespacedResource +from ocp_resources.exceptions import MissingRequiredArgumentError +from ocp_resources.resource import NamespacedResource class ResourceQuota(NamespacedResource): diff --git a/ocp_resources/restore.py b/ocp_resources/restore.py index 94c84dbcb5..2626c4b641 100644 --- a/ocp_resources/restore.py +++ b/ocp_resources/restore.py @@ -1,4 +1,5 @@ -from ocp_resources.resource import MissingRequiredArgumentError, NamespacedResource +from ocp_resources.exceptions import MissingRequiredArgumentError +from ocp_resources.resource import NamespacedResource class Restore(NamespacedResource): diff --git a/ocp_resources/role.py b/ocp_resources/role.py index 69fc4587c4..8d12e73be5 100644 --- a/ocp_resources/role.py +++ b/ocp_resources/role.py @@ -1,6 +1,7 @@ # API reference: # https://docs.openshift.com/container-platform/4.11/rest_api/rbac_apis/role-rbac-authorization-k8s-io-v1.html -from ocp_resources.resource import MissingRequiredArgumentError, NamespacedResource +from ocp_resources.exceptions import MissingRequiredArgumentError +from ocp_resources.resource import NamespacedResource from ocp_resources.utils.constants import TIMEOUT_4MINUTES diff --git a/ocp_resources/sealed_secret.py b/ocp_resources/sealed_secret.py index b281e355a0..2069e21c8b 100644 --- a/ocp_resources/sealed_secret.py +++ b/ocp_resources/sealed_secret.py @@ -1,6 +1,7 @@ from typing import Any -from ocp_resources.resource import MissingRequiredArgumentError, NamespacedResource +from ocp_resources.exceptions import MissingRequiredArgumentError +from ocp_resources.resource import NamespacedResource class SealedSecret(NamespacedResource): diff --git a/ocp_resources/security_context_constraints.py b/ocp_resources/security_context_constraints.py index 6f6c30138b..9f1f247ff1 100644 --- a/ocp_resources/security_context_constraints.py +++ b/ocp_resources/security_context_constraints.py @@ -3,7 +3,8 @@ from typing import Any -from ocp_resources.resource import MissingRequiredArgumentError, Resource +from ocp_resources.exceptions import MissingRequiredArgumentError +from ocp_resources.resource import Resource class SecurityContextConstraints(Resource): diff --git a/ocp_resources/service_mesh_member.py b/ocp_resources/service_mesh_member.py index 5243cf3905..bc706bfb37 100644 --- a/ocp_resources/service_mesh_member.py +++ b/ocp_resources/service_mesh_member.py @@ -3,7 +3,8 @@ from typing import Any -from ocp_resources.resource import MissingRequiredArgumentError, NamespacedResource +from ocp_resources.exceptions import MissingRequiredArgumentError +from ocp_resources.resource import NamespacedResource class ServiceMeshMember(NamespacedResource): diff --git a/ocp_resources/serving_runtime.py b/ocp_resources/serving_runtime.py index 9a0df8be7b..9652c4bd0d 100644 --- a/ocp_resources/serving_runtime.py +++ b/ocp_resources/serving_runtime.py @@ -3,7 +3,8 @@ from typing import Any -from ocp_resources.resource import MissingRequiredArgumentError, NamespacedResource +from ocp_resources.exceptions import MissingRequiredArgumentError +from ocp_resources.resource import NamespacedResource class ServingRuntime(NamespacedResource): diff --git a/ocp_resources/snapshot.py b/ocp_resources/snapshot.py index b697519b87..ef9327aec6 100644 --- a/ocp_resources/snapshot.py +++ b/ocp_resources/snapshot.py @@ -3,7 +3,8 @@ from typing import Any -from ocp_resources.resource import MissingRequiredArgumentError, NamespacedResource +from ocp_resources.exceptions import MissingRequiredArgumentError +from ocp_resources.resource import NamespacedResource class Snapshot(NamespacedResource): diff --git a/ocp_resources/ssp.py b/ocp_resources/ssp.py index a6a4b12b26..10d154c067 100644 --- a/ocp_resources/ssp.py +++ b/ocp_resources/ssp.py @@ -3,7 +3,8 @@ from typing import Any -from ocp_resources.resource import MissingRequiredArgumentError, NamespacedResource +from ocp_resources.exceptions import MissingRequiredArgumentError +from ocp_resources.resource import NamespacedResource class SSP(NamespacedResource): diff --git a/ocp_resources/storage_class.py b/ocp_resources/storage_class.py index b4130ae04c..330fe19473 100644 --- a/ocp_resources/storage_class.py +++ b/ocp_resources/storage_class.py @@ -1,6 +1,7 @@ from kubernetes.dynamic.exceptions import ResourceNotFoundError -from ocp_resources.resource import MissingRequiredArgumentError, Resource +from ocp_resources.exceptions import MissingRequiredArgumentError +from ocp_resources.resource import Resource from ocp_resources.storage_profile import StorageProfile diff --git a/ocp_resources/trustyai_service.py b/ocp_resources/trustyai_service.py index d93ef387eb..cb158b3dbd 100644 --- a/ocp_resources/trustyai_service.py +++ b/ocp_resources/trustyai_service.py @@ -1,6 +1,7 @@ from typing import Any -from ocp_resources.resource import MissingRequiredArgumentError, NamespacedResource +from ocp_resources.exceptions import MissingRequiredArgumentError +from ocp_resources.resource import NamespacedResource class TrustyAIService(NamespacedResource): diff --git a/ocp_resources/user.py b/ocp_resources/user.py index 73e04b4288..b1c0c8e8ff 100644 --- a/ocp_resources/user.py +++ b/ocp_resources/user.py @@ -3,7 +3,8 @@ from typing import Any -from ocp_resources.resource import MissingRequiredArgumentError, Resource +from ocp_resources.exceptions import MissingRequiredArgumentError +from ocp_resources.resource import Resource class User(Resource): diff --git a/ocp_resources/user_defined_network.py b/ocp_resources/user_defined_network.py index 254846e160..5d8e2e9d98 100644 --- a/ocp_resources/user_defined_network.py +++ b/ocp_resources/user_defined_network.py @@ -3,7 +3,8 @@ from typing import Any from warnings import warn -from ocp_resources.resource import MissingRequiredArgumentError, NamespacedResource +from ocp_resources.exceptions import MissingRequiredArgumentError +from ocp_resources.resource import NamespacedResource class UserDefinedNetwork(NamespacedResource): diff --git a/ocp_resources/virtual_machine_clone.py b/ocp_resources/virtual_machine_clone.py index 3b0b1f2a25..82b57b55ef 100644 --- a/ocp_resources/virtual_machine_clone.py +++ b/ocp_resources/virtual_machine_clone.py @@ -1,6 +1,7 @@ # API reference: https://kubevirt.io/user-guide/operations/clone_api/ -from ocp_resources.resource import MissingRequiredArgumentError, NamespacedResource +from ocp_resources.exceptions import MissingRequiredArgumentError +from ocp_resources.resource import NamespacedResource from ocp_resources.virtual_machine import VirtualMachine diff --git a/ocp_resources/virtual_machine_cluster_instancetype.py b/ocp_resources/virtual_machine_cluster_instancetype.py index 41ee7c5f65..ea73cbd8fd 100644 --- a/ocp_resources/virtual_machine_cluster_instancetype.py +++ b/ocp_resources/virtual_machine_cluster_instancetype.py @@ -3,7 +3,8 @@ from typing import Any -from ocp_resources.resource import MissingRequiredArgumentError, Resource +from ocp_resources.exceptions import MissingRequiredArgumentError +from ocp_resources.resource import Resource class VirtualMachineClusterInstancetype(Resource): diff --git a/ocp_resources/virtual_machine_export.py b/ocp_resources/virtual_machine_export.py index 6e12328e91..5ee71fc6b4 100644 --- a/ocp_resources/virtual_machine_export.py +++ b/ocp_resources/virtual_machine_export.py @@ -3,7 +3,8 @@ from typing import Any -from ocp_resources.resource import MissingRequiredArgumentError, NamespacedResource +from ocp_resources.exceptions import MissingRequiredArgumentError +from ocp_resources.resource import NamespacedResource class VirtualMachineExport(NamespacedResource): diff --git a/ocp_resources/virtual_machine_instance_preset.py b/ocp_resources/virtual_machine_instance_preset.py index c31abb6f2e..b6f01a09ee 100644 --- a/ocp_resources/virtual_machine_instance_preset.py +++ b/ocp_resources/virtual_machine_instance_preset.py @@ -3,7 +3,8 @@ from typing import Any -from ocp_resources.resource import MissingRequiredArgumentError, NamespacedResource +from ocp_resources.exceptions import MissingRequiredArgumentError +from ocp_resources.resource import NamespacedResource class VirtualMachineInstancePreset(NamespacedResource): diff --git a/ocp_resources/virtual_machine_instance_replica_set.py b/ocp_resources/virtual_machine_instance_replica_set.py index ea8afb1f8c..856b7bc6bb 100644 --- a/ocp_resources/virtual_machine_instance_replica_set.py +++ b/ocp_resources/virtual_machine_instance_replica_set.py @@ -3,7 +3,8 @@ from typing import Any -from ocp_resources.resource import MissingRequiredArgumentError, NamespacedResource +from ocp_resources.exceptions import MissingRequiredArgumentError +from ocp_resources.resource import NamespacedResource class VirtualMachineInstanceReplicaSet(NamespacedResource): diff --git a/ocp_resources/virtual_machine_instancetype.py b/ocp_resources/virtual_machine_instancetype.py index 9d4439704b..08204b1a3c 100644 --- a/ocp_resources/virtual_machine_instancetype.py +++ b/ocp_resources/virtual_machine_instancetype.py @@ -3,7 +3,8 @@ from typing import Any -from ocp_resources.resource import MissingRequiredArgumentError, NamespacedResource +from ocp_resources.exceptions import MissingRequiredArgumentError +from ocp_resources.resource import NamespacedResource class VirtualMachineInstancetype(NamespacedResource): diff --git a/ocp_resources/volume_snapshot.py b/ocp_resources/volume_snapshot.py index c92ca4f854..ceee9a9d61 100644 --- a/ocp_resources/volume_snapshot.py +++ b/ocp_resources/volume_snapshot.py @@ -3,7 +3,8 @@ from typing import Any -from ocp_resources.resource import MissingRequiredArgumentError, NamespacedResource +from ocp_resources.exceptions import MissingRequiredArgumentError +from ocp_resources.resource import NamespacedResource class VolumeSnapshot(NamespacedResource): diff --git a/ocp_resources/volume_snapshot_class.py b/ocp_resources/volume_snapshot_class.py index 76cd6700de..90fa59dd6d 100644 --- a/ocp_resources/volume_snapshot_class.py +++ b/ocp_resources/volume_snapshot_class.py @@ -3,7 +3,8 @@ from typing import Any -from ocp_resources.resource import MissingRequiredArgumentError, Resource +from ocp_resources.exceptions import MissingRequiredArgumentError +from ocp_resources.resource import Resource class VolumeSnapshotClass(Resource): From 90bddcf0853867a30e5fea95fcc99d4fec2fe326 Mon Sep 17 00:00:00 2001 From: rnetser Date: Wed, 25 Feb 2026 17:23:20 +0200 Subject: [PATCH 3/3] update test to reflect MissingRequiredArgumentError import from exceptions --- class_generator/tests/test_user_code_parser.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/class_generator/tests/test_user_code_parser.py b/class_generator/tests/test_user_code_parser.py index aee4a8085e..7a6753c96c 100644 --- a/class_generator/tests/test_user_code_parser.py +++ b/class_generator/tests/test_user_code_parser.py @@ -134,7 +134,8 @@ def test_parse_file_with_different_template_imports(self): content = '''# Generated using https://github.com/RedHatQE/openshift-python-wrapper/blob/main/scripts/resource/README.md from typing import Any -from ocp_resources.resource import NamespacedResource, MissingRequiredArgumentError +from ocp_resources.exceptions import MissingRequiredArgumentError +from ocp_resources.resource import NamespacedResource from custom_validators import validate_name import json @@ -160,7 +161,8 @@ def validate(self): assert "from custom_validators import validate_name" in user_imports assert "import json" in user_imports assert "from typing import Any" not in user_imports - assert "from ocp_resources.resource import NamespacedResource, MissingRequiredArgumentError" not in user_imports + assert "from ocp_resources.exceptions import MissingRequiredArgumentError" not in user_imports + assert "from ocp_resources.resource import NamespacedResource" not in user_imports def test_parse_empty_file(self): """Test parsing an empty file."""