"""API Client for Splitio.""" import os import requests from secrets_manager.python_ext import PythonSecretsManager import logging from features.config import ENVIRONMENT, SERVICE_NAME ADMIN_SPLITIO_API_KEY_SECRET_NAME = 'ADMIN_SPLITIO_API_KEY' logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) class SplitIoClient: """API Client for split.io.""" def __init__(self): """Initialize split.io class.""" self.features = {} self.base_url = 'https://api.split.io/internal/api/v2' self.split_id_sdk_key = self.get_splitio_admin_api_key() self.headers = self.set_headers() self.workspace_id = self.set_workspaces() self.environment_id = self.set_environments() def set_headers(self): """Set headers""" split_headers = { 'Content-Type': 'application/json', 'Authorization': f'Bearer {self.split_id_sdk_key}', } return split_headers def set_workspaces(self): """Set Workspace id""" endpoint = f'{self.base_url}/workspaces' response = requests.get(endpoint, headers=self.headers, timeout=10) assert response.status_code == 200, ( f'Reason: {response.reason} \n URL: {response.url}' ) workspace_id = response.json()['objects'][0]['id'] return workspace_id def set_environments(self): """Set Environment""" endpoint = f'{self.base_url}/environments/ws/{self.workspace_id}' response = requests.get(endpoint, headers=self.headers, timeout=10) assert response.status_code == 200, ( f'Reason: {response.reason} \n URL: {response.url}' ) environment_id = next( (env['id'] for env in response.json() if env['name'] == 'QA'), None ) return environment_id def full_update_split(self, body, name): """Update Splitio""" endpoint = ( f'{self.base_url}/splits/ws/{self.workspace_id}/{name}/environments/QA' ) response = requests.put(endpoint, headers=self.headers, json=body, timeout=10) assert response.status_code == 200, ( f'Reason: {response.reason} \n URL: {response.url}' ) print(response.json()) print('Splitio Updated') def get_splitio_admin_api_key(self) -> str: """Attempt to fetch `ADMIN_SPLITIO_API_KEY` from the environment or SecretsManager. - When `FORCE_REMOTE` is true, fetch `dev/ows-features/ADMIN_SPLITIO_API_KEY` from SecretsManager. - When `FORCE_REMOTE` is false, read `ADMIN_SPLITIO_API_KEY` from the environment. - Return the `SPLITIO_API_KEY` environment value when `ADMIN_SPLITIO_API_KEY` is not found. """ force_remote = os.environ.get('FORCE_REMOTE', 'false').lower() == 'true' if force_remote: logger.info( f"Fetching '{ENVIRONMENT}/{SERVICE_NAME}/{ADMIN_SPLITIO_API_KEY_SECRET_NAME}' from SecretsManager" ) else: logger.info(f"Loading '{ADMIN_SPLITIO_API_KEY_SECRET_NAME}' from .env") secrets_manager_client = PythonSecretsManager( environment=ENVIRONMENT, service_name=SERVICE_NAME, force_remote=force_remote, ) api_key = secrets_manager_client.get_cred(ADMIN_SPLITIO_API_KEY_SECRET_NAME) if not api_key: logger.warning( f"Did not find '{ADMIN_SPLITIO_API_KEY_SECRET_NAME}'. Fall back to 'SPLITIO_API_KEY'." ) return os.environ.get('SPLITIO_API_KEY', 'localhost') logger.info(f"Found '{ADMIN_SPLITIO_API_KEY_SECRET_NAME}'.") return api_key