"""Service Discovery. We rely on a simple convention to resolve services based on a name and environment. For resolving services in dev, we allow the specification of custom mappings via an environment variable OWSREQUEST_SERVICE_MAP, which should be a JSON dictionary mapping service names to urls. """ import json import os from owsrequest.constants.environment import PROD_ENVIRONMENT from owsrequest.constants.environment import QA_ENVIRONMENT from owsrequest.constants.environment import UAT_ENVIRONMENT SERVICE_URL_SPEC = '{environment}-{service_name}.{domain}' SERVICE_DEFAULT_DOMAIN = 'theorchard.io' LEGACY_SERVICE_URL_SPEC = '{service_name}.{domain}' LEGACY_SERVICE_DEFAULT_QA_DOMAIN = 'qaorch.com' LEGACY_SERVICE_DEFAULT_PROD_DOMAIN = 'theorchard.com' def get_owsrequest_service_map(): """Load service map from environment.""" injected_mappings = os.environ.get('OWSREQUEST_SERVICE_MAP') if injected_mappings: return json.loads(injected_mappings) else: return {} owsrequest_service_mapping = get_owsrequest_service_map() def discover(service_name, environment, islegacy=False): """Resolve the application name. In dev, services resolve by default to their qa versions. This behavior can be overridden by injecting a custom service mapping via the environment variable `OWSREQUEST_SERVICE_MAP`. Its value should be a JSON dictionary mapping service names to service urls. Args: service_name (str): the name of the service. environment (str): the environment. islegacy (bool): True for php legacy service. Returns: str: the service url. """ environment = environment.lower() service_name = service_name.lower() LEGACY_SERVICE_DEFAULT_DOMAIN = LEGACY_SERVICE_DEFAULT_PROD_DOMAIN \ if environment == PROD_ENVIRONMENT \ else LEGACY_SERVICE_DEFAULT_QA_DOMAIN if environment in (QA_ENVIRONMENT, PROD_ENVIRONMENT): if islegacy: url = LEGACY_SERVICE_URL_SPEC.format( service_name=service_name, domain=LEGACY_SERVICE_DEFAULT_DOMAIN ) else: url = SERVICE_URL_SPEC.format( environment=environment, service_name=service_name, domain=SERVICE_DEFAULT_DOMAIN ) return environment, url if environment == UAT_ENVIRONMENT: if service_name in owsrequest_service_mapping: return environment, owsrequest_service_mapping.get(service_name) return environment, SERVICE_URL_SPEC.format( environment=environment, service_name=service_name, domain=SERVICE_DEFAULT_DOMAIN, ) if environment == 'dev' and service_name in owsrequest_service_mapping: url = owsrequest_service_mapping.get(service_name) return environment, url else: # Default to qa if islegacy: url = LEGACY_SERVICE_URL_SPEC.format( service_name=service_name, domain=LEGACY_SERVICE_DEFAULT_DOMAIN ) else: url = SERVICE_URL_SPEC.format( environment=QA_ENVIRONMENT, service_name=service_name, domain=SERVICE_DEFAULT_DOMAIN ) return QA_ENVIRONMENT, url