diff options
Diffstat (limited to 'onap-dcae-cbs-docker-client/onap_dcae_cbs_docker_client/client.py')
-rw-r--r-- | onap-dcae-cbs-docker-client/onap_dcae_cbs_docker_client/client.py | 88 |
1 files changed, 31 insertions, 57 deletions
diff --git a/onap-dcae-cbs-docker-client/onap_dcae_cbs_docker_client/client.py b/onap-dcae-cbs-docker-client/onap_dcae_cbs_docker_client/client.py index 80c9f75..ef0dfbc 100644 --- a/onap-dcae-cbs-docker-client/onap_dcae_cbs_docker_client/client.py +++ b/onap-dcae-cbs-docker-client/onap_dcae_cbs_docker_client/client.py @@ -1,5 +1,5 @@ # ================================================================================ -# Copyright (c) 2017-2018 AT&T Intellectual Property. All rights reserved. +# Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved. # ================================================================================ # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -18,82 +18,53 @@ import json import os -import logging import requests +from onap_dcae_cbs_docker_client import get_module_logger +from onap_dcae_cbs_docker_client.exceptions import ENVsMissing, CantGetConfig, CBSUnreachable -LOGGER = logging.getLogger().getChild(__name__) - -class ENVsMissing(Exception): - """ - Exception to represent critical ENVs are missing - """ - pass +logger = get_module_logger(__name__) ######### # HELPERS - - -def _get_uri_from_consul(consul_url, name): - """ - Call consul's catalog - TODO: currently assumes there is only one service with this hostname - """ - url = "{0}/v1/catalog/service/{1}".format(consul_url, name) - LOGGER.debug("Trying to lookup service: {0}".format(url)) - res = requests.get(url) - res.raise_for_status() - services = res.json() - return "http://{0}:{1}".format(services[0]["ServiceAddress"], services[0]["ServicePort"]) - - -def _get_envs(): +def _get_path(path): """ - Returns hostname, consul_host. - If the necessary ENVs are not found, this is fatal, and raises an exception. + Try to get the config, and return appropriate exceptions otherwise """ try: hostname = os.environ["HOSTNAME"] # this is the name of the component itself - consul_host = os.environ["CONSUL_HOST"] # this is the host of consul itself - cbs_name = os.environ["CONFIG_BINDING_SERVICE"] # this is the name under which the CBS is registered in Consul. + # in most cases, this is the K8s service name which is a resolvable DNS name + # if running outside k8s, this name needs to be resolvable by DNS via other means. + cbs_resolvable_hostname = os.environ["CONFIG_BINDING_SERVICE"] except KeyError as e: raise ENVsMissing("Required ENV Variable {0} missing".format(e)) - return hostname, consul_host, cbs_name + # TODO: https + cbs_url = "http://{0}:10000".format(cbs_resolvable_hostname) -def _get_path(path): - """ - This call does not raise an exception if Consul or the CBS cannot complete the request. - It logs an error and returns {} if the config is not bindable. - It could be a temporary network outage. Call me again later. - - It will raise an exception if the necessary env parameters were not set because that is irrecoverable. - This function is called in my /heatlhcheck, so this will be caught early. - """ - - config = {} - - hostname, consul_host, cbs_name = _get_envs() - - # not sure how I as the component developer is supposed to know consul port - consul_url = "http://{0}:8500".format(consul_host) - + # get my config try: - # get my config - cbs_url = _get_uri_from_consul(consul_url, cbs_name) my_config_endpoint = "{0}/{1}/{2}".format(cbs_url, path, hostname) res = requests.get(my_config_endpoint) - res.raise_for_status() config = res.json() - LOGGER.info("get_config returned the following configuration: {0}".format( - json.dumps(config))) - except requests.exceptions.HTTPError: - LOGGER.error("in get_config, the config binding service endpoint %s was not reachable. Error code: %d, Error text: %s", my_config_endpoint, res.status_code, res.text) - except Exception as exc: - LOGGER.exception(exc) - return config + logger.debug( + "get_config returned the following configuration: %s using the config url %s", + json.dumps(config), + my_config_endpoint, + ) + return config + except requests.exceptions.HTTPError: # this is thrown by raise_for_status + logger.error( + "The config binding service endpoint %s returned a bad status. code: %d, text: %s", + my_config_endpoint, + res.status_code, + res.text, + ) + raise CantGetConfig(res.status_code, res.text) + except requests.exceptions.ConnectionError: # this is thrown if requests.get cant even connect to the endpoint + raise CBSUnreachable() ######### @@ -108,5 +79,8 @@ def get_all(): def get_config(): """ Hit the CBS service_component endpoint + + TODO: should we take in a "retry" boolean, and retry on behalf of the caller? + Currently, we return an exception and let the application decide how it wants to proceed (Crash, try again, etc). """ return _get_path("service_component") |