"""This module handles the backup of feature flags from Split.io to an S3 bucket.""" import json from typing import Any, Dict from config import logger, S3_KMS_KEY_ID from src.connectors.splitio_client import SplitIOClient def backup_feature_flags(splitio_client: SplitIOClient, s3_client: Any, s3_bucket: str) -> None: """ Backup feature flags from Split.io to S3. Args: splitio_client (SplitIOClient): Instance of SplitIOClient. s3_client (Any): S3 client instance. s3_bucket (str): Name of the S3 bucket to upload data. """ feature_flags = splitio_client.get_all_FF_names() logger.info(f'Found {len(feature_flags)} feature flags.') if not feature_flags: logger.warning('No feature flags found.') return environments = splitio_client.get_environments() for flag_name in feature_flags: logger.debug(f'Processing feature flag: {flag_name}') ff_metadata = splitio_client.get_feature_flag_metadata(flag_name) if not ff_metadata: logger.warning(f'No metadata found for feature flag: {flag_name}') continue logger.debug(f'Feature Flag metadata for {flag_name}: {ff_metadata}') upload_to_s3( s3_client=s3_client, bucket=s3_bucket, key=f'{flag_name}/metadata.json', data=ff_metadata ) for env in environments: env_id = env['id'] env_name = env['name'] ff_definition = splitio_client.get_feature_flag_definition(env_id=env_id, flag_name=flag_name) if not ff_definition: logger.warning(f'No definition found for feature flag: {flag_name} in environment: {env_name}') continue logger.debug(f'Feature Flag definition for {flag_name} in {env_name}: {ff_definition}') upload_to_s3( s3_client=s3_client, bucket=s3_bucket, key=f'{flag_name}/definitions/{env_name}.json', data=ff_definition ) logger.info(f'Backup completed for feature flag: {flag_name}') def upload_to_s3(s3_client: Any, bucket: str, key: str, data: Dict[str, Any]) -> None: """ Upload data to S3 bucket. Args: s3_client (Any): S3 client instance. bucket (str): Name of the S3 bucket. key (str): S3 object key. data (Dict[str, Any]): Data to upload. """ logger.debug(f'Uploading data to s3://{bucket}/{key}') s3_client.put_object( Bucket=bucket, Key=key, Body=json.dumps(data, indent=2), ServerSideEncryption='aws:kms', SSEKMSKeyId=S3_KMS_KEY_ID )