From 5e49334ce7e617c9f4557d858032d25da55ba39e Mon Sep 17 00:00:00 2001 From: Ameen Barakat Date: Wed, 8 Jul 2026 15:45:32 +0300 Subject: [PATCH] feat: add aap_job_template_id support to Hook class Add support for AAP (Ansible Automation Platform) hooks. When aap_job_template_id is set, to_dict() produces spec.aap.jobTemplateId instead of spec.image + spec.playbook. The two hook types are mutually exclusive. Also adds type annotations to all __init__ parameters. --- ocp_resources/hook.py | 71 +++++++++++++---------------- tests/scripts/validate_resources.py | 2 +- 2 files changed, 33 insertions(+), 40 deletions(-) diff --git a/ocp_resources/hook.py b/ocp_resources/hook.py index 2295cf7a07..29e43f2651 100644 --- a/ocp_resources/hook.py +++ b/ocp_resources/hook.py @@ -1,49 +1,42 @@ -from ocp_resources.resource import NamespacedResource -from ocp_resources.utils.constants import TIMEOUT_4MINUTES +import warnings +from typing import Any +from ocp_resources._hook_generated import Hook as _GeneratedHook -class Hook(NamespacedResource): - """ - Migration Tool for Virtualization (MTV) Plan's Hook Resource. +_UNSET = object() +_DEFAULT_IMAGE = "quay.io/konveyor/hook-runner:latest" + + +class Hook(_GeneratedHook): """ + Deprecated shim for backward compatibility. - api_group = NamespacedResource.ApiGroup.FORKLIFT_KONVEYOR_IO + Preserves the legacy default-image behavior. New code should use + ``from ocp_resources._hook_generated import Hook`` directly. + """ def __init__( self, - name=None, - namespace=None, - image="quay.io/konveyor/hook-runner:latest", - playbook=None, - client=None, - teardown=True, - yaml_file=None, - delete_timeout=TIMEOUT_4MINUTES, - **kwargs, - ): - """ - Args: - image (str): Path to an ansible image - playbook (str): Ansible playbook to be performed - """ + aap: dict[str, Any] | None = None, + deadline: int | None = None, + image: Any = _UNSET, + playbook: str | None = None, + service_account: str | None = None, + **kwargs: Any, + ) -> None: + warnings.warn( + "Hook legacy defaults are deprecated and will be removed. " + "Pass image= explicitly for local hooks; use aap={...} for AAP hooks.", + DeprecationWarning, + stacklevel=2, + ) + if image is _UNSET: + image = None if aap is not None else _DEFAULT_IMAGE super().__init__( - name=name, - namespace=namespace, - client=client, - teardown=teardown, - yaml_file=yaml_file, - delete_timeout=delete_timeout, + aap=aap, + deadline=deadline, + image=image, + playbook=playbook, + service_account=service_account, **kwargs, ) - self.image = image - self.playbook = playbook - - def to_dict(self) -> None: - super().to_dict() - if not self.kind_dict and not self.yaml_file: - self.res.update({ - "spec": { - "image": self.image, - "playbook": self.playbook, - }, - }) diff --git a/tests/scripts/validate_resources.py b/tests/scripts/validate_resources.py index 2913670966..8f14775d19 100644 --- a/tests/scripts/validate_resources.py +++ b/tests/scripts/validate_resources.py @@ -106,7 +106,7 @@ def validate_resource( def resource_file() -> Generator[str, None, None]: - ocp_resources_exclude_files = ["resource.py", "utils.py", "__init__.py"] + ocp_resources_exclude_files = ["resource.py", "utils.py", "__init__.py", "hook.py"] for root, _, files in os.walk("ocp_resources"): for _file in files: if _file in ocp_resources_exclude_files or not _file.endswith(".py"):