Untitled

 avatar
unknown
plain_text
5 months ago
4.2 kB
2
Indexable
"""Module responsible for the stack creation code for Data Reservoir."""

import os.path

from aws_cdk import Stack, aws_kms
from aws_constructs.lambdas import LambdaConstruct
from constructs import Construct
from data_foundation_constructs.helpers import sns
from data_foundation_constructs.ingestion_hub.helpers.preprocess import (
    PreprocessConfig, PreprocessType)
from data_foundation_constructs.ingestion_hub.ingestion_hub import IngestionHub
from data_foundation_constructs.ingestion_hub.ingestion_hub_settings import \
    generate_settings
from pgi_cdk_standard_library.helpers.s3 import deploy_to_s3
from principal_environment import PrincipalEnvironment

from ..aws_constructs import s3_bucket


class PrinamHkFaDataReservoir(Stack):
    """Class containing the code for creating Data Reservoir stack when it's instantiated."""

    def __init__(
        self,
        scope: Construct,
        stack_id: str,
        app_name: str,
        env: PrincipalEnvironment,
        data_source: dict,
        **kwargs: dict,
    ):
        Stack.__init__(self, scope, stack_id, env=env.to_cdk_env, **kwargs)
        self.app_name = app_name
        self.env = env
        self._create_ingestion_stack(data_source)

        # Importing Foundation Managed KMS KEY
        self.kms = aws_kms.Alias.from_alias_name(
            scope=self,
            id="GetKMSKey",
            alias_name="alias/pfg/foundation/standard",
        )

        bucket_name = "prinam-hk-fa-data-reservoir"

        self.bucket = s3_bucket.create_bucket(
            scope=self, bucket=bucket_name, env=env, encryption_key=self.kms
        )

        # CREATE TRIGGER LAMBDA
        if data_source.get("trigger", {env.aws_environment_name: False}).get(
            env.aws_environment_name
        ):
            LambdaConstruct.create_lambda(self, data_source["name"], "trigger", env)

    def _create_ingestion_stack(self, data_source: dict) -> None:
        shared_xmatters_topic = sns.import_sns_topic(
            scope=self,
            app_name=self.app_name,
            topic_name=data_source["shared_xmatters_topic"][
                self.env.aws_environment_name
            ][self.env.region],
            identifier="xmatters",
        )

        preprocess_for_data_source = data_source.get("preprocess", {})
        preprocess_config = (
            PreprocessConfig(
                data_source_name=data_source["name"],
                secret_manager=preprocess_for_data_source.get("secret_manager", False),
                preprocess_type=PreprocessType[
                    preprocess_for_data_source.get("type", "none").upper()
                ],
                preprocess_root_directory=f"""{os.path.abspath(
                os.path.join(os.path.dirname(__file__),
                                '..', '..', '..', 'lambdas', 'preprocess')
            )}""",
                code_path=preprocess_for_data_source.get(
                    "code_path", data_source["name"]
                ),
                additional_python_modules=[],
            )
            if preprocess_for_data_source
            else None
        )

        hub_settings = generate_settings(
            app_name=self.app_name,
            env=self.env,
            data_source=data_source,
            preprocess_config=preprocess_config,
            shared_xmatters_topic=shared_xmatters_topic,
            notify_topic=None,
        )

        hub = IngestionHub(
            scope=self,
            construct_id="ingestion-hub",
            ingestion_hub_settings=hub_settings,
        )

        if (
            preprocess_config
            and preprocess_config.preprocess_type is PreprocessType.GLUE
        ):
            deploy_to_s3(
                scope=self,
                bucket_deploy_id="preprocess-upload",
                dest_bucket=hub.curation_hub.reservoir_bucket,
                path=f"../../glue/preprocess/{preprocess_config.code_path}",
                prefix=f"glue/preprocess/{preprocess_config.code_path}",
                role=hub.curation_hub.bucket_deployment_role,
            )
Editor is loading...
Leave a Comment