"""
The config is for two categories of constants:
- things that you want to access anywhere in the entire airflow codebase, including dags, utils, operators, and hooks
- things that you want to be able to override per dag or environment
If a constant is not one of the above two, it probably doesn't belong here.
"""
from datetime import timedelta, datetime
import pendulum
from tags import Tags
from fips import FipsCodes
from statename import StateName
from prefixes import S3Prefixes as Prefixes, RADPrefixes
[docs]
class ProductionConfig:
"""
Proposed naming convention:
<service>_<type>(_<env>)
Assume "default" connection for airflow env
Thus, no env for prod
"""
# System defaults
PRODUCTION = True
AIRFLOW_URL = "https://pidgeot.ready-internal.net"
MOUNT_PATH = "/home/ubuntu/efs-mount"
TEMPLATE_SEARCHPATH = ["/home/ubuntu/airflow/templates/sql"]
DAG_ROOT = "/home/ubuntu/airflow/dags"
SPLIT_PATH = "/dags/" # used when autobuilding dag id
GENERAL_PREFIX = "general_" # filtered out when autobuilding dag id
IF_EXIST = "replace"
# Common libraries
datetime = datetime
timedelta = timedelta
pendulum = pendulum
# DAG defaults
BRANCH_TRIGGER = "none_failed_min_one_success"
START_DATE = datetime(2023, 1, 1)
INTERVAL = None
MAX_ACTIVE_TASKS = 16
MAX_ACTIVE_RUNS = 1
CATCHUP = False
EMAIL = "yuan@ready.net"
EMAIL_CONTENT = "<h3>Data moved.</h3>"
EMAIL_SUBJECT = "Airflow {env} DAG success: {dag_id}"
DEFAULT_ARGS = {
"depends_on_past": False,
"email_on_failure": False,
"email_on_retry": False,
"retries": 1,
"retry_delay": timedelta(minutes=1),
}
RENDER_TEMPLATE_AS_NATIVE_OBJ = True
# DBT
DBT_ALIAS = "grovyle"
"""The alias for the dbt server. This is used to connect to the dbt server. It will be used in the ssh command to connect to the server. Will be different for prod and dev"""
DBT_SSH_USER = "ubuntu"
"""The ssh user for the dbt server. This is used to connect to the dbt server. It will be used in the ssh command to connect to the server. Will not be different for prod and dev"""
DBT_SERVER_FOLDER = "/home/ubuntu/airflow/"
"""The folder for the dbt server. This is used to connect to the dbt server. """
DBT_SSH_KEY = "~/.ssh/id_rsa"
"""The ssh key for the dbt server. This is used to connect to the dbt server. """
DBT_VENV_PATH = "/home/ubuntu/dbt-venv/bin/activate"
"""The venv path for the dbt server. """
# Grapi
GRAPHQL_API_URL = "https://grapi.ready.net/graphql"
GRAPHQL_API_URL_STAGE = "https://staging.grapi.ready.net/graphql"
GRAPHQL_API_URL_DEV = "https://dev.grapi.ready.net/graphql"
GRAPI_API_SECRET_NAME = "jenkins/boss-platform-auth-security-key-prod"
GRAPI_API_SECRET_NAME_STAGE = "jenkins/boss-platform-auth-security-key-stage"
GRAPI_API_SECRET_NAME_DEV = "jenkins/boss-platform-auth-security-key-dev"
# Tileservers
TILESERVER_ALIAS = "kanto"
TILESERVER_ALIAS_STAGE = "hoenn"
TILESERVER_ALIAS_DEV = "johto"
# Databases
GRAPI_PG = BOSS_PLATFORM_GRAPI_DB = BOSS_PLATFORM_DB = (
"postgres_bossplatform_grapi_prod"
)
GRAPI_PG_STAGE = BOSS_PLATFORM_GRAPI_STAGE_DB = BOSS_PLATFORM_STAGE_DB = (
"postgres_bossplatform_grapi_stage"
)
GRAPI_PG_DEV = BOSS_PLATFORM_GRAPI_DEV_DB = "postgres_bossplatform_grapi_dev"
GRAPI_ATHENA = ATHENA_GRAPI_DB_ALIAS = "postgres_grapi_prod"
GRAPI_ATHENA_STAGE = ATHENA_GRAPI_DB_ALIAS_STAGE = "postgres_grapi_stage"
GRAPI_ATHENA_DEV = "postgres_grapi_dev"
# REDSHIFT DEV
REDSHIFT_DEV = "redshift_dw_dev"
REDSHIFT_DEV_PG = "redshift_dw_dev_pghook"
REDSHIFT_DEV_WORKGROUP = "redshift-workgroup-dev"
# REDSHIFT PROD
REDSHIFT = "redshift_dw_prod"
REDSHIFT_PG = REDSHIFT_PROD_PG = "redshift_dw_prod_pghook"
REDSHIFT_WORKGROUP = REDSHIFT_PROD_WORKGROUP = "redshift-workgroup-prod"
REDSHIFT_S3_ROLE_ARN = "arn:aws:iam::463002504035:role/service-role/AmazonRedshift-CommandsAccessRole-20250731T224539"
GAME_PG = "postgres_bossplatform_game_prod"
GAME_PG_STAGE = "postgres_bossplatform_game_staging"
GAME_PG_DEV = "postgres_bossplatform_game_dev"
GAME_ATHENA = "postgres_game_prod"
GAME_ATHENA_STAGE = "postgres_game_stage"
GAME_ATHENA_DEV = "postgres_game_dev"
GAME_AGENT_BUCKET = "463002504035-game-agent-prod"
GAME_AGENT_CONN = "postgres_game_agnet_dev"
RAD_PG = RAD_DB_CONN = "postgres_rad_prod"
RAD_DOCDB = RAD_DOC_DB_CONN = "documentdb_rad"
"""The connection string for the RAD database. It is a document db connection string"""
RAD_RMQ = RAD_RMQ_CONN = "rabbitmq_dev"
"""The connection string for the RAD rabbitmq. since it is under dev we use the dev connection string"""
ATHENA_RAD_DISCOVERY_DB_ALIAS = "rad_discovery_dev.rad_discovery_dev_db"
"""Athena alias for RAD discovery database for the cross db connections. since it is under dev we use the dev connection string
"""
SUPERSET_DAP_CONN_ID = "dap_superset_user"
"""The connection id for the Superset instance. It will be used in the Superset operators to connect to the Superset instance. It is not different for prod and dev because we will disable user after each dag run. If you get login issues you need to check the Superset instance and enable the user for the next run. For the first run also need to create the user in the Superset instance and give it the appropriate permissions. """
# Slack
SLACK_DEFAULT_HOOK = "slack_default_hook"
SLACK_DEFAULT_API = "slack_default_api"
SLACK_ALERTS_CHANNEL = "#airflow"
##### AWS
# Lake
DATA_LAKE_DB = "readydatalake"
DATA_LAKE_DB_DEV = "shoreline"
CSV_SERDE = "org.apache.hadoop.hive.serde2.OpenCSVSerde"
DEFAULT_STORAGE = "PARQUET"
DEFAULT_COMPRESSION = "snappy"
DEFAULT_WORKGROUP = "batch-job"
# S3
DEFAULT_BUCKET = ""
BACKUP_BUCKET = "463002504035-archive"
DATA_LAKE_BUCKET = "463002504035-readydatalake"
DATA_LAKE_BUCKET_DEV = "463002504035-shoreline"
OVERTURE_BUCKET = "463002504035-overture"
REGRID_INGEST_BUCKET = "463002504035-regrid"
HLD_BUCKET = "463002504035-hld-prod"
BEDROCK_BUCKET = "463002504035-compliancebot"
SWAMP_BUCKET = "463002504035-swamp"
BOSS_PUBLIC_BUCKET = "463002504035-boss-public"
BOSS_PUBLIC_BUCKET_STAGE = "463002504035-boss-public-stage"
BOSS_PRIVATE_BUCKET = "463002504035-boss-private-prod"
BOSS_PRIVATE_BUCKET_STAGE = "463002504035-boss-private-stage"
DATA_PUBLIC_BUCKET = "463002504035-data-public"
ARCHIE_DEV_BUCKET = "463002504035-archie-dev"
DATA_AGENT_BUCKET = "463002504035-data-agent-kb-dev"
BACKUP_PREFIX = Prefixes.BACKUP_PREFIX
CURATED_PREFIX = Prefixes.CURATED_PREFIX
POSTGRES_PREFIX = Prefixes.POSTGRES_PREFIX
RAW_PREFIX = Prefixes.RAW_PREFIX
TEMP_PREFIX = Prefixes.TEMP_PREFIX
TRANSFORMED_PREFIX = Prefixes.TRANSFORMED_PREFIX
SUMMARY_RAW_PREFIX = Prefixes.SUMMARY_RAW_PREFIX
# if you try to delete these, airflow will throw an exception
PANIC_PREFIXES = [
Prefixes.BACKUP_PREFIX,
Prefixes.CURATED_PREFIX,
Prefixes.POSTGRES_PREFIX,
Prefixes.RAW_PREFIX,
Prefixes.TEMP_PREFIX,
Prefixes.TRANSFORMED_PREFIX,
Prefixes.SUMMARY_RAW_PREFIX,
]
# Redshift
REDSHIFT_DATA_TEAM_GROUP = "readydata"
AWS_DATA_ADMIN_FEDERATED_USER = (
"IAMR:AWSReservedSSO_AdministratorAccess_bd933a6f96357c52"
)
AWS_DATA_DEVELOPER_FEDERATED_USER = (
"IAMR:AWSReservedSSO_Ready-Data-Developer_cf669028fab52727"
)
AWS_AIRFLOW_EC2_FEDERATED_USER = "IAMR:airflow_prod_ec2_role"
REDSHIFT_DEFAULT_PRIVILEGE_OWNERS = [
AWS_DATA_ADMIN_FEDERATED_USER,
AWS_DATA_DEVELOPER_FEDERATED_USER,
AWS_AIRFLOW_EC2_FEDERATED_USER,
"rdsadmin",
]
# Glue
CRAWLER_ROLE = "airflow_prod_ec2_role"
CRAWLER_SLEEP_TIME = 5
# ECS
SLEEP_TIME = ECS_SLEEP_TIME = 5 # ECS sleep time
ECS_CLUSTER = "prod"
SUBNETS = ["subnet-05d37f00bd1245b61"]
ECS_MOUNT_PATH = "/mount" # used only for ecs machines
BATCH_SIZE_ECS = 3000000
NUM_ECS_TILING_MACHINES = 20
"""Prefered number of maximum ECS machines to launch for tiling for each DAG (not a hard limit)
"""
ECS_SECURITY_GROUPS = [
"sg-0bcb7113fb9299e23",
]
ECS_TIPPECANOE_CONTAINER_NAME = "tippecanoe_container"
ECS_TIPPECANOE_TASK_DEFINITION = "tippecanoe_prod"
ECS_GEOPANDAS_CONTAINER_NAME = "geopandas_container"
ECS_GEOPANDAS_TASK_DEFINITION = "geopandas_prod"
ECS_ATHENA_TO_GEOJSON_CONTAINER_NAME = "ecs_athena_to_geojson_container"
ECS_ATHENA_TO_GEOJSON_TASK_DEFINITION = "ecs_athena_to_geojson_prod"
ECS_S3_PARQUET_PG_CONTAINER_NAME = "s3_parquet_to_pg_container"
ECS_S3_PARQUET_PG_TASK_DEFINITION = "s3_parquet_to_pg"
ECS_PGDUMP_CONTAINER_NAME = "ecs_transfer_with_pgdump_container"
ECS_PGDUMP_TASK_DEFINITION = "ecs_transfer_with_pgdump_prod"
ECS_HLD_CONTAINER_NAME = "ecs_hld_process_container"
ECS_HLD_TASK_DEFINITION = "ecs_hld_process_prod"
ECS_H3_CONTAINER_NAME = "ecs_h3_container"
ECS_H3_TASK_DEFINITION = "ecs_h3_prod"
ECS_MLFLOW_CONTAINER_NAME = "ecs_mlflow_model_container"
ECS_MLFLOW_TASK_DEFINITION = "ecs_mlflow_model_prod"
ECS_GRAPHIFY_CONTAINER_NAME = "ecs_graphify_container"
ECS_GRAPHIFY_TASK_DEFINITION = "ecs_graphify_prod"
# FCC
FCC_PROCESS_UUID_URL = "https://broadbandmap.fcc.gov/nbm/map/api/published/filing"
FCC_UPDATED_URL = "https://broadbandmap.fcc.gov/api/reference/map_processing_updates/{process_uuid}"
FCC_FUNDING_PUBLISHED_RUN_URL = (
"https://fundingmap.fcc.gov/bfm/api/map/getPublishedRun"
)
FCC_HEADERS = {
"authority": "broadbandmap.fcc.gov",
"accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
"accept-language": "en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7",
"cache-control": "max-age=0",
"sec-ch-ua": '"Not_A Brand";v="99", "Google Chrome";v="109", "Chromium";v="109"',
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": '"macOS"',
"sec-fetch-dest": "document",
"sec-fetch-mode": "navigate",
"sec-fetch-site": "none",
"sec-fetch-user": "?1",
"upgrade-insecure-requests": "1",
"user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36",
"referer": "https://broadbandmap.fcc.gov/location-summary/fixed?version=jun2023&zoom=16.70&vlon=-95.992263&vlat=36.156955&br=r&speed=25_3&tech=1_2_3_4_5_6_7_8",
}
FCC_DATE_FMT = "%Y-%m-%dT%H:%M:%S.%fZ"
FCC_DATE_FMT2 = "%Y-%m-%d" # apparently it does this sometimes
FCC_TECH_CODES = {
0: "Other",
10: "Copper",
40: "Cable",
50: "Fiber to the Premises",
60: "GSO Satellite",
61: "NGSO Satellite",
70: "Unlicensed Fixed Wireless",
71: "Licensed Fixed Wireless",
72: "Licensed-by-Rule Fixed Wireless",
}
# ROB API
ROB_URL = "https://meowth.ready-data.net"
"""ROB api call with a 30 second timeout"""
ROB_API_LAMBDA_FUNCTION_URL = "https://lambda.us-east-1.amazonaws.com/2015-03-31/functions/lambda-rob-api-RobAPIFunction-PQw1kczf7WFM/invocations"
"""This is the rob-api lambda function url. it does not have 30 second timeout"""
ROB_AUTH_KEY = "rob-auth-key"
"""A simple api security token for the ROB api"""
# Linear API
LINEAR_API_KEY_SUSHEEL = "susheel_linear_api_"
# specify susheel since majid API key used for linearagent
# appended underscore due to repeated secret name when creating new API key
LINEAR_API_KEY = "linear_api_key"
# Reflect.run API
REFLECT_RUN_BASE_URL = "https://api.reflect.run/v1/"
REFLECT_RUN_API_KEY = "reflect_run_api"
# PeeringDB API
PEERINGDB_API_KEY = "peeringdb_api"
# CQA API
CQA_BASE_URI = "https://costquest.azure-api.net/"
"""CQA API base URI. """
CQA_API_KEY = "cqa_token_prod"
# Scraper things
SENDGRID_CONN = "sendgrid_default"
SCRAPERBEE_CONN = "scraperbee_proxy_key_colello"
SCRAPERAPI_CONN = "scraperapi_proxy_key_colello"
SCRAPER_TIMEOUT = 30
SCRAPER_URL = "http://api.scraperapi.com/"
# CTC (CPUC) Server
CTC_EGNYTE_SERVER = "ctc_egnyte_server"
# Indiana sftp connection
IN_SFTP_SERVER = "in_ftp"
# Pools
PG_NUM_CONN_LARGE = "pg_num_conn_large"
"""One of Airflow pools that are defined e.g. dev env at: https://pidgey.ready-internal.net/pool/list/"""
PG_NUM_CONN_NORMAL = "pg_num_conn_normal"
TRANSFER_POOL = "transfer_small" # this only allows 16 slots across the whole airflow instance, so ram doesnt die
FABRIC_SCRAPE_POOL = (
"fabric_scrape" # this allows like 2 to go at once so we don't get blocked
)
FABRIC_MECATOR_POOL = (
"fabric_mercator" # this allows like 4 to go at once so we don't get blocked
)
RESEARCH_NODE_FUNDING_POOL = (
"research_node_funding" # this allows 2 to go at once so we don't get blocked
)
DISCOVERY_POOL = "rad_discovery_pool"
OVERTURE_TRANSFORM_POOL = "overture_transform_pool"
# For large constants like this, split into other objects
tags = Tags
STATE_FIPS = FipsCodes.DEFAULT
STATES_T1 = FipsCodes.STATES_T1
DEFAULT_FIPS = FipsCodes.DEFAULT
ALL_STATE_FIPS = FipsCodes.ALL_OTHER
ALL_FIPS_STATE = {v: k for k, v in ALL_STATE_FIPS.items()}
DEMO_STATE_FIPS = FipsCodes.DEMO
STATE_NAMES = StateName.STATE_ABBR_NAME
STATE_ONLY_NAMES = StateName.STATE
# Set up for the bbm export dag
GDRIVE_FOLDER_BBM = "BBM_EXPORT"
GDRIVE_FOLDER_BBM_ID_PRIVATE = "1a5Q02qNeMVwPfY70J5DkaI8xV-1lPkXC" # private folder ID (to be deprecated given the drive limits)
GDRIVE_FOLDER_BBM_ID = "0AOvn0ywn4UcEUk9PVA" # shared drive ID
GDRIVE_FOLDER_GSHEET = "1kONOPVDuWMdDxR16ZME5xnyhOXUkMIeC" # all gsheets in one folder for easy sharing
GDRIVE_FOLDER_DATA_TEAM_ASSET = "1ScrRXXCInjH8Cs1nriqSWIah7LNWr-dp"
GDRIVE_FOLDER_BASE_URI = "https://drive.google.com/drive/u/0/folders/"
GDRIVE_FOLDER_FLAT_EXPORTER = "1rNzWD6BOyUECJHWQLckoL14tmfvOPPrA" # Flat File
GDRIVE_FOLDER_BEAD_TRANSFER = (
"1UgpVBKs8KQQ6-G77qPAwZYjqBar1L3Aa" # BEAD attachment Transfer
)
GDRIVE_FOLDER_CPF_TRANSFER = (
"1JiODwfPhpRTNSJRAf7nrA7ulkOWDwaI8" # CPF attachment Transfer
)
PG_SCHEMA = "data"
"""The SQL schema to use for the postgres database in PG GAME PROD STAGE and DEV"""
# RAD
RAD_PREFIXES = RADPrefixes
"""List of the prefixes that are used in RAD
"""
# TODO:we need to remove these three parameters once modify rad discovery dags. They don't work anymore
RAD_DISCOVERY_SCHEMA = "discovery"
RAD_ADDRESS_PRIMARY = "address_primary"
# Datahub
DATAHUB_CONNECTION_ID = (
"datahub_rest_default" # The connection id for the datahub rest api
)
DATAHUB_BASE_URL = "https://uxie.ready-internal.net"
DATAHUB_GMS_ENDPOINT = (
f"{DATAHUB_BASE_URL}/api/gms" # The endpoint for the GMS service in Datahub
)
DATAHUB_GRAPHQL_ENDPOINT = f"{DATAHUB_BASE_URL}/api/graphql"
DATAHUB_S3_BUCKET = "463002504035-datahub"
# Misc
CIRCUMFERENCE_EARTH = 40075017
KMZ_KML_DEFAULT = "doc.kml" # this is the default according to https://developers.google.com/kml/documentation/kmzarchives
BACKUP_EMAIL = [
"yuan@ready.net",
]
# Max iterations (something like heartbeat e.g. Task arn:aws:ecs:us-east-1:463002504035:task/dev/a658048277264621b0b2565925ef03e0 is running: 19999...) for ECS tasks, used to set the timeout
MAX_ITERATIONS = 50000
REQUEST_TIMEOUT_HOURS = 1
BATCH_SIZE_LOCAL = 1000000
BATCH_SIZE = BATCH_SIZE_LOCAL
GCP_SERVICE_ACCOUNT = "boss_api" # todo: name this better
GDRIVE_SERVICE_ACCOUNT = "gdrive_api"
AWS_GOOGLE_PLACES_API_KEY = "google-places-api-key"
"""Google Places API that `returns formatted location data and imagery about establishments, geographic locations, or prominent points of interest.` """
CENSUS_API_KEY = "3cbe5ce5311ca6cdddc6e7461bf7bf19857fea54" # it is free api key so we don't need to secure it
ALDP_API_KEY = "5qJYV7XQAB0eeQUJ4t7o6u3ppvHzCLfBsPv7sZAZ" # it is free api key so we don't need to secure it
FCC_FUNDING_MAP_API_KEY = "fcc_funding_map_api"
FCC_FFA_API_KEY = "fcc_ffa_api"
INITIAL_GDRIVE_PAGE_TOKEN = "ready-initial-dummy-token!" # basically just a dummy string to start the pagination for gdrive
# AIRFLOW_API = "airflow_rest_api"
AIRFLOW_API = "airflow_rest_api_dev"
AWS_GITHUB_APP_TOKEN = "ready_github_app_repo_scanner"
# FTP for Financial Integrations (MN SWIFT and TX USAS)
FTP_MN_IF407_CONN = "mn_ftp_if407_prod"
FTP_MN_IF411_CONN = "mn_ftp_if411_prod" # they are the same server
SFTP_TX_USAS_CONN = "tx_cpa_prod"
SFTP_TX_USAS_PGP_KEY = "tx_cpa_pgp"
## SPATIAL PROCESSINGS
#### CRS
CRS_GPS = "EPSG:4326"
#### TILING and tile operators mappings
ARCHIVE_TILES_S3_BUCKET = "463002504035-archive/tiles"
TILE_ENVS_TS_AND_S3 = {
"hoenn": {"ts": "staging", "s3": "staging"},
"kanto": {"ts": "main", "s3": "prod"},
}
TILE_OPERATOR_MAP = {
"archive_to_s3": "operators.tile.archive_to_s3.ArchiveToS3Operator",
"recover_from_s3": "operators.tile.recover_from_s3.RecoverFromS3Operator",
"remove_tile": "operators.tile.remove_tile.RemoveTileOperator",
"remove_in_s3": "operators.tile.remove_in_s3.RemoveInS3Operator",
}
DEFAULT_TS_FLAT_FOLDER = "~/tiles"
#### PMTILES (DATASME-2060 spike) — serverless tiles, no tileserver fleet
# Glue Python Shell job running dags/tileserver/pmtiles_glue/pmtiles_builder.py.
# The script is deployed by MANUAL S3 upload — git and the job can diverge, so
# the script logs its own SCRIPT_VERSION on every run.
GLUE_PMTILES_JOB_NAME = "PMTiles_Builder_Job"
# Standard Glue assets bucket — same place fgdb_converter.py lives (one per account/region).
GLUE_PMTILES_SCRIPT_S3 = "s3://aws-glue-assets-463002504035-us-east-1/scripts/pmtiles_builder.py"
# `_public` is load-bearing, not decoration: the serving plan puts a CloudFront
# distribution over this prefix, which makes EVERY object under it world-readable.
# Only publishable layers may be written here — never a PII/BSL/location tileset.
PMTILES_S3_PREFIX = "tiles/pmtiles_public"
# Staging is a SIBLING prefix, deliberately outside the served one, so the
# intermediate Parquet is never exposed by the distribution.
PMTILES_STAGING_PREFIX = "tiles/pmtiles_staging"
# Our MLT-capable tippecanoe, built from ready/tippecanoe branch mlt-sync and
# staged here by hand. Pinned to the source commit, not "latest", so a rerun of
# an old DAG run tiles with the same binary. The PyPI wheel Glue installs cannot
# emit MLT and Glue cannot compile, hence prebuilt static binaries in S3.
PMTILES_TIPPECANOE_MLT_S3 = (
"s3://aws-glue-assets-463002504035-us-east-1/bin/tippecanoe-mlt/9aef0512"
)
GLUE_PMTILES_POLL_SECONDS = 30
GLUE_PMTILES_REGION = "us-east-1"
# CloudFront distribution the archives are read through, browser-direct. Blank
# here on purpose: there is no PROD distribution yet (DATASME-2088 — it needs
# WAF, a tiles.ready.net subdomain and a public/private split before it exists).
# The dev value lives in development.py. Blank = skip CDN verification.
PMTILES_CDN_BASE_URL = ""
### CALIX CLOUD API INTEGRATION
CALIX_CLOUD_API_CONN = "calix_cloud_api_readynet"
CLAUDE_BEDROCK_SONNET = "us.anthropic.claude-sonnet-4-5-20250929-v1:0"
DAP_HOSTS = {
"demo": "https://dap.bossdemo.portal.ready.net/",
"az": "https://dap.bead.azcommerce.com/",
"cpuc": "https://dap.bead.grant.cpuc.ca.gov/",
"mn": "https://dap.bead.mn.gov/",
"ms": "https://dap.apply.broadbandms.com/",
"tx": "https://dap.applybead.broadband.texas.gov/",
"ar": "https://dap.grantor.broadband.arkansas.gov/",
"in": "https://dap.portal.connectingindiana.com/",
}
############ START LEGACY ############
READY_DATA_DB = ATHENA_READY_DATA_DB_ALIAS = "postgres_readydata_prod"
READY_DATA_DB_DEV = ATHENA_READY_DATA_DB_ALIAS_DEV = "postgres_readydata_dev"
BOSS_DATA_DB = "postgres_bossdata_prod"
BOSS_DATA_STAGE_DB = BOSS_STAGE_DB = "postgres_bossdata_stage"
BOSS_DATA_DEV_DB = "postgres_bossdata_dev"
BOSS_API = "boss_api" # see GCP_SERVICE_ACCOUNT
ATHENA_BOSS_DB_ALIAS = "postgres_boss_prod"
ATHENA_BOSS_DB_ALIAS_STAGE = "postgres_boss_stage"
ATHENA_GAME_AGENT_DB_ALIAS = ATHENA_GAME_AGENT_DB_ALIAS_STAGE = "postgres_rad_prod"
GCP_BOSS_API_PROJECT = "boss-api-289815"
GCP_BOSS_API_PROJECT_STAGE = "boss-api-stage"
# Speedtest
OOKLA_BROADBAND_PR = "ookla_broadband_pr"
OOKLA_BROADBAND_US = "ookla_broadband_us"
OOKLA_MOBILE_US = "ookla_mobile_us"
MLAB_SECRET = "mlab_bigquery_json"
############ END LEGACY ############