diff options
-rw-r--r-- | onap-dcae-cbs-docker-client/Changelog.md | 7 | ||||
-rw-r--r-- | onap-dcae-cbs-docker-client/onap_dcae_cbs_docker_client/__init__.py | 1 | ||||
-rw-r--r-- | onap-dcae-cbs-docker-client/onap_dcae_cbs_docker_client/client.py | 79 | ||||
-rw-r--r-- | onap-dcae-cbs-docker-client/setup.py | 19 | ||||
-rw-r--r-- | onap-dcae-cbs-docker-client/tests/test_client.py | 7 | ||||
-rw-r--r-- | onap-dcae-cbs-docker-client/tox-local.ini | 9 | ||||
-rw-r--r-- | onap-dcae-cbs-docker-client/tox.ini | 11 |
7 files changed, 87 insertions, 46 deletions
diff --git a/onap-dcae-cbs-docker-client/Changelog.md b/onap-dcae-cbs-docker-client/Changelog.md index 0211329..1269750 100644 --- a/onap-dcae-cbs-docker-client/Changelog.md +++ b/onap-dcae-cbs-docker-client/Changelog.md @@ -4,6 +4,13 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/) and this project adheres to [Semantic Versioning](http://semver.org/). +## [1.0.2] +* Refactor some code, PEP8 compliance +* Add flake8 to tox + +## [1.0.1] +* [Sadly, Missing] + ## [1.0.0] * Depend on the CBS 2.0.0 API * Add new endpoint for getting all diff --git a/onap-dcae-cbs-docker-client/onap_dcae_cbs_docker_client/__init__.py b/onap-dcae-cbs-docker-client/onap_dcae_cbs_docker_client/__init__.py index d1f044b..e9d0246 100644 --- a/onap-dcae-cbs-docker-client/onap_dcae_cbs_docker_client/__init__.py +++ b/onap-dcae-cbs-docker-client/onap_dcae_cbs_docker_client/__init__.py @@ -15,4 +15,3 @@ # ============LICENSE_END========================================================= # # ECOMP is a trademark and service mark of AT&T Intellectual Property. - 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 f21ad0e..adcec85 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 @@ -17,39 +17,47 @@ # ECOMP is a trademark and service mark of AT&T Intellectual Property. import json -import requests import os import logging +import requests + +LOGGER = logging.getLogger().getChild(__name__) + + +class ENVsMissing(Exception): + """ + Exception to represent critical ENVs are missing + """ + pass -root = logging.getLogger() -logger = root.getChild(__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 + 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)) + LOGGER.debug("Trying to lookup service: {0}".format(url)) res = requests.get(url) - try: - res.raise_for_status() - services = res.json() - return "http://{0}:{1}".format(services[0]["ServiceAddress"], services[0]["ServicePort"]) - except Exception as e: - logger.error("Exception occured when querying Consul: either could not hit {0} or no service registered. Error code: {1}, Error Text: {2}".format(url, res.status_code, res.text)) - return None + res.raise_for_status() + services = res.json() + return "http://{0}:{1}".format(services[0]["ServiceAddress"], services[0]["ServicePort"]) + def _get_envs(): """ - Returns HOSTNAME, CONSUL_HOST, CONFIG_BINDING_SERVICE or crashes for caller to deal with + Returns hostname, consul_host. + If the necessary ENVs are not found, this is fatal, and raises an exception. """ - HOSTNAME = os.environ["HOSTNAME"] - CONSUL_HOST = os.environ["CONSUL_HOST"] - return HOSTNAME, CONSUL_HOST + if "HOSTNAME" not in os.environ or "CONSUL_HOST" not in os.environ: + raise ENVsMissing("HOSTNAME or CONSUL_HOST missing") + hostname = os.environ["HOSTNAME"] + consul_host = os.environ["CONSUL_HOST"] + return hostname, consul_host def _get_path(path): @@ -64,32 +72,39 @@ def _get_path(path): config = {} - HOSTNAME, CONSUL_HOST = _get_envs() + hostname, consul_host = _get_envs() - #not sure how I as the component developer is supposed to know consul port - consul_url = "http://{0}:8500".format(CONSUL_HOST) + # not sure how I as the component developer is supposed to know consul port + consul_url = "http://{0}:8500".format(consul_host) - #get the CBS URL. Would not need the following hoorahrah if we had DNS. - cbs_url = _get_uri_from_consul(consul_url, "config_binding_service") - if cbs_url is None: - logger.error("Cannot bind config at this time, cbs is unreachable") - else: - #get my config - my_config_endpoint = "{0}/{1}/{2}".format(cbs_url, path, HOSTNAME) + try: + # get my config + cbs_url = _get_uri_from_consul(consul_url, "config_binding_service") + my_config_endpoint = "{0}/{1}/{2}".format(cbs_url, path, hostname) res = requests.get(my_config_endpoint) - try: - res.raise_for_status() - config = res.json() - logger.info("get_config returned the following configuration: {0}".format(json.dumps(config))) - except: - logger.error("in get_config, the config binding service endpoint {0} blew up on me. Error code: {1}, Error text: {2}".format(my_config_endpoint, res.status_code, res.text)) + + res.raise_for_status() + config = res.json() + LOGGER.info("get_config returned the following configuration: {0}".format( + json.dumps(config))) + except requests.exceptions.HTTPError as exc: + 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 ######### # Public def get_all(): + """ + Hit the CBS service_component_all endpoint + """ return _get_path("service_component_all") + def get_config(): + """ + Hit the CBS service_component endpoint + """ return _get_path("service_component") diff --git a/onap-dcae-cbs-docker-client/setup.py b/onap-dcae-cbs-docker-client/setup.py index fd7dc4b..b4fdf0e 100644 --- a/onap-dcae-cbs-docker-client/setup.py +++ b/onap-dcae-cbs-docker-client/setup.py @@ -16,20 +16,19 @@ # # ECOMP is a trademark and service mark of AT&T Intellectual Property. -import os from setuptools import setup, find_packages setup( - name = "onap_dcae_cbs_docker_client", - description = "very lightweight client for a DCAE dockerized component to get it's config from the CBS", - version = "1.0.1", + name="onap_dcae_cbs_docker_client", + description="very lightweight client for a DCAE dockerized component to get it's config from the CBS", + version="1.0.2", packages=find_packages(), - author = "Tommy Carpenter", - author_email = "tommy@research.att.com", + author="Tommy Carpenter", + author_email="tommy@research.att.com", license='Apache 2', - keywords = "", - url = "", - install_requires = [ - "requests" + keywords="", + url="", + install_requires=[ + "requests>= 2.0.0, < 3.0.0" ] ) diff --git a/onap-dcae-cbs-docker-client/tests/test_client.py b/onap-dcae-cbs-docker-client/tests/test_client.py index 8512fad..dd6ab10 100644 --- a/onap-dcae-cbs-docker-client/tests/test_client.py +++ b/onap-dcae-cbs-docker-client/tests/test_client.py @@ -17,17 +17,21 @@ # ECOMP is a trademark and service mark of AT&T Intellectual Property. from onap_dcae_cbs_docker_client.client import get_config, get_all + class FakeResponse: def __init__(self, status_code, thejson): self.status_code = status_code self.thejson = thejson + def raise_for_status(self): pass + def json(self): return self.thejson + def monkeyed_requests_get(url): - #mock all the get calls for existent and non-existent + # mock all the get calls for existent and non-existent if url == "http://consuldotcom:8500/v1/catalog/service/config_binding_service": return FakeResponse(status_code=200, thejson=[{"ServiceAddress": "666.666.666.666", @@ -49,6 +53,7 @@ def test_config(monkeypatch): monkeypatch.setattr('requests.get', monkeyed_requests_get) assert(get_config() == {"key_to_your_heart": 666}) + def test_all(monkeypatch): monkeypatch.setattr('requests.get', monkeyed_requests_get) assert(get_all() == {"config": {"key_to_your_heart": 666}, diff --git a/onap-dcae-cbs-docker-client/tox-local.ini b/onap-dcae-cbs-docker-client/tox-local.ini index 244386f..8e48932 100644 --- a/onap-dcae-cbs-docker-client/tox-local.ini +++ b/onap-dcae-cbs-docker-client/tox-local.ini @@ -1,5 +1,5 @@ [tox] -envlist = py27,py36 +envlist = py27,py36,flake8 [testenv] deps= @@ -11,4 +11,11 @@ setenv = HOSTNAME = mybestfrienddotcom commands=pytest --cov {envsitepackagesdir}/onap_dcae_cbs_docker_client --cov-report html +[testenv:flake8] +basepython = python3.6 +skip_install = true +deps = flake8 +commands = flake8 setup.py onap_dcae_cbs_docker_client tests +[flake8] +ignore = E501 diff --git a/onap-dcae-cbs-docker-client/tox.ini b/onap-dcae-cbs-docker-client/tox.ini index d3aa5da..6bbe73f 100644 --- a/onap-dcae-cbs-docker-client/tox.ini +++ b/onap-dcae-cbs-docker-client/tox.ini @@ -1,6 +1,6 @@ # content of: tox.ini , put in same dir as setup.py [tox] -envlist = py27,py36 +envlist = py27,py36,flake8 [testenv] deps= @@ -15,3 +15,12 @@ setenv = commands= pytest --junitxml xunit-results.xml --cov onap_dcae_cbs_docker_client --cov-report xml coverage xml + +[testenv:flake8] +basepython = python3.6 +skip_install = true +deps = flake8 +commands = flake8 setup.py onap_dcae_cbs_docker_client tests + +[flake8] +ignore = E501 |