"""CFNgin lookup registry."""
from __future__ import annotations
import logging
from typing import Dict, Type, Union, cast
from ...lookups.handlers.base import LookupHandler
from ...lookups.handlers.cfn import CfnLookup
from ...lookups.handlers.ecr import EcrLookup
from ...lookups.handlers.env import EnvLookup
from ...lookups.handlers.random_string import RandomStringLookup
from ...lookups.handlers.ssm import SsmLookup
from ...utils import DOC_SITE, load_object_from_string
from .handlers.ami import AmiLookup
from .handlers.awslambda import AwsLambdaLookup
from .handlers.default import DefaultLookup
from .handlers.dynamodb import DynamodbLookup
from .handlers.envvar import EnvvarLookup
from .handlers.file import FileLookup
from .handlers.hook_data import HookDataLookup
from .handlers.kms import KmsLookup
from .handlers.output import OutputLookup
from .handlers.rxref import RxrefLookup
from .handlers.split import SplitLookup
from .handlers.xref import XrefLookup
CFNGIN_LOOKUP_HANDLERS: Dict[str, Type[LookupHandler]] = {}
LOGGER = logging.getLogger(__name__)
[docs]def register_lookup_handler(
lookup_type: str, handler_or_path: Union[str, Type[LookupHandler]]
) -> None:
"""Register a lookup handler.
Args:
lookup_type: Name to register the handler under.
handler_or_path: A function or a path to a handler.
"""
handler = handler_or_path
LOGGER.debug("registering CFNgin lookup: %s=%s", lookup_type, handler_or_path)
if isinstance(handler_or_path, str):
handler = cast(type, load_object_from_string(handler_or_path))
else:
handler = handler_or_path
try:
if issubclass(handler, LookupHandler):
CFNGIN_LOOKUP_HANDLERS[lookup_type] = handler
return
# Handler is a not a new-style handler
except Exception: # pylint: disable=broad-except
LOGGER.debug("failed to validate lookup handler", exc_info=True)
LOGGER.error(
'lookup "%s" uses an unsupported format; to learn how to write '
"lookups visit %s/page/cfngin/lookups/index.html#writing-a-custom-lookup",
lookup_type,
DOC_SITE,
)
raise TypeError(
f"lookup {handler_or_path} must be a subclass of "
"runway.lookups.handlers.base.LookupHandler"
)
[docs]def unregister_lookup_handler(lookup_type: str) -> None:
"""Unregister the specified lookup type.
This is useful when testing various lookup types if you want to unregister
the lookup type after the test runs.
Args:
lookup_type: Name of the lookup type to unregister.
"""
CFNGIN_LOOKUP_HANDLERS.pop(lookup_type, None)
register_lookup_handler(AmiLookup.TYPE_NAME, AmiLookup)
register_lookup_handler(AwsLambdaLookup.TYPE_NAME, AwsLambdaLookup)
register_lookup_handler(AwsLambdaLookup.Code.TYPE_NAME, AwsLambdaLookup.Code)
register_lookup_handler(
AwsLambdaLookup.CodeSha256.TYPE_NAME, AwsLambdaLookup.CodeSha256
)
register_lookup_handler(
AwsLambdaLookup.CompatibleArchitectures.TYPE_NAME,
AwsLambdaLookup.CompatibleArchitectures,
)
register_lookup_handler(
AwsLambdaLookup.CompatibleRuntimes.TYPE_NAME, AwsLambdaLookup.CompatibleRuntimes
)
register_lookup_handler(AwsLambdaLookup.Content.TYPE_NAME, AwsLambdaLookup.Content)
register_lookup_handler(
AwsLambdaLookup.LicenseInfo.TYPE_NAME, AwsLambdaLookup.LicenseInfo
)
register_lookup_handler(AwsLambdaLookup.Runtime.TYPE_NAME, AwsLambdaLookup.Runtime)
register_lookup_handler(AwsLambdaLookup.S3Bucket.TYPE_NAME, AwsLambdaLookup.S3Bucket)
register_lookup_handler(AwsLambdaLookup.S3Key.TYPE_NAME, AwsLambdaLookup.S3Key)
register_lookup_handler(
AwsLambdaLookup.S3ObjectVersion.TYPE_NAME, AwsLambdaLookup.S3ObjectVersion
)
register_lookup_handler(CfnLookup.TYPE_NAME, CfnLookup)
register_lookup_handler(DefaultLookup.TYPE_NAME, DefaultLookup)
register_lookup_handler(DynamodbLookup.TYPE_NAME, DynamodbLookup)
register_lookup_handler(EcrLookup.TYPE_NAME, EcrLookup)
register_lookup_handler(EnvLookup.TYPE_NAME, EnvLookup)
register_lookup_handler(EnvvarLookup.TYPE_NAME, EnvvarLookup)
register_lookup_handler(FileLookup.TYPE_NAME, FileLookup)
register_lookup_handler(HookDataLookup.TYPE_NAME, HookDataLookup)
register_lookup_handler(KmsLookup.TYPE_NAME, KmsLookup)
register_lookup_handler(OutputLookup.TYPE_NAME, OutputLookup)
register_lookup_handler(RandomStringLookup.TYPE_NAME, RandomStringLookup)
register_lookup_handler(RxrefLookup.TYPE_NAME, RxrefLookup)
register_lookup_handler(SplitLookup.TYPE_NAME, SplitLookup)
register_lookup_handler(SsmLookup.TYPE_NAME, SsmLookup)
register_lookup_handler(XrefLookup.TYPE_NAME, XrefLookup)