Skip to content

Commit 575b546

Browse files
authored
Fix requests service with no config (#64)
* Fix exception if requests has not config in config file
1 parent bde0f00 commit 575b546

File tree

12 files changed

+94
-27
lines changed

12 files changed

+94
-27
lines changed

pyms/config/__init__.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
from pyms.config.conf import get_conf
2+
from pyms.config.confile import ConfFile
3+
4+
__all__ = ['get_conf', 'ConfFile']

pyms/config/confile.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@ def __init__(self, *args, **kwargs):
3535
kwargs=kwargs,
3636
))
3737

38-
config = {k: v for k, v in self.normalize_config(config)}
39-
[setattr(self, k, v) for k, v in config.items()]
38+
config = dict(self.normalize_config(config))
39+
_ = [setattr(self, k, v) for k, v in config.items()]
4040
super(ConfFile, self).__init__(config)
4141

4242
def normalize_config(self, config):

pyms/flask/app/create_app.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,17 @@
11
import logging
22
import os
3+
from typing import Text
34

45
import connexion
56
from flask import Flask
67
from flask_opentracing import FlaskTracing
78

8-
from pyms.config.conf import get_conf
9+
from pyms.config import get_conf
910
from pyms.constants import LOGGER_NAME, SERVICE_ENVIRONMENT
1011
from pyms.flask.healthcheck import healthcheck_blueprint
1112
from pyms.flask.services.driver import ServicesManager
1213
from pyms.logger import CustomJsonFormatter
13-
from pyms.utils.utils import check_package_exists
14+
from pyms.utils import check_package_exists
1415

1516
logger = logging.getLogger(LOGGER_NAME)
1617

@@ -56,7 +57,7 @@ def init_libs(self):
5657
return self.application
5758

5859
def init_tracer(self):
59-
if getattr(self, "tracer", False) and self.tracer:
60+
if self._exists_service("tracer"):
6061
client = self.tracer.get_client()
6162
self.application.tracer = FlaskTracing(client, True, self.application)
6263

@@ -79,7 +80,7 @@ def init_logger(self):
7980
self.application.logger.setLevel(logging.INFO)
8081

8182
def init_app(self) -> Flask:
82-
if getattr(self, "swagger", False) and self.swagger:
83+
if self._exists_service("swagger"):
8384
check_package_exists("connexion")
8485
app = connexion.App(__name__, specification_dir=os.path.join(self.path, self.swagger.path))
8586
app.add_api(
@@ -135,6 +136,10 @@ def create_app(self):
135136

136137
return self.application
137138

139+
def _exists_service(self, service_name: Text) -> bool:
140+
service = getattr(self, service_name, False)
141+
return service and service is not None
142+
138143
def add_error_handlers(self):
139144
"""Subclasses will override this method in order to add specific error handlers. This should be done with
140145
calls to add_error_handler method.

pyms/flask/services/driver.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
import logging
22

3-
from pyms.config.conf import get_conf
3+
from pyms.config import get_conf, ConfFile
44
from pyms.constants import SERVICE_BASE, LOGGER_NAME
5-
from pyms.utils.utils import import_from
5+
from pyms.utils import import_from
66

77
logger = logging.getLogger(LOGGER_NAME)
88

99

1010
class DriverService:
1111
service = ""
12+
config = None
1213

1314
def __init__(self, service, *args, **kwargs):
1415
self.service = ".".join([service, self.service])
@@ -19,6 +20,9 @@ def __getattr__(self, attr, *args, **kwargs):
1920
return config_attribute if config_attribute == "" or config_attribute != {} else self.default_values.get(attr,
2021
None)
2122

23+
def exists_config(self):
24+
return self.config is not None and isinstance(self.config, ConfFile)
25+
2226

2327
class ServicesManager:
2428
service = SERVICE_BASE

pyms/flask/services/requests.py

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ def wrapper(*args, **kwargs):
2424
response = False
2525
i = 0
2626
response_ok = False
27-
retries = args[0].retries
28-
status_retries = args[0].status_retries
27+
retries = args[0]._retries
28+
status_retries = args[0]._status_retries
2929
while i < retries and response_ok is False:
3030
response = f(*args, **kwargs)
3131
i += 1
@@ -35,6 +35,7 @@ def wrapper(*args, **kwargs):
3535
if not response_ok:
3636
logger.warning("Response ERROR: {}".format(response))
3737
return response
38+
3839
return wrapper
3940

4041

@@ -44,12 +45,17 @@ class Service(DriverService):
4445
"data": ""
4546
}
4647
tracer = None
48+
_retries = DEFAULT_RETRIES
49+
_status_retries = DEFAULT_STATUS_RETRIES
50+
_propagate_headers = False
4751

4852
def __init__(self, service, *args, **kwargs):
4953
"""Initialization for trace headers propagation"""
5054
super().__init__(service, *args, **kwargs)
51-
self.retries = self.config.retries or DEFAULT_RETRIES
52-
self.status_retries = self.config.status_retries or DEFAULT_STATUS_RETRIES
55+
if self.exists_config():
56+
self._retries = self.config.retries or DEFAULT_RETRIES
57+
self._status_retries = self.config.status_retries or DEFAULT_STATUS_RETRIES
58+
self._propagate_headers = self.config.propagate_headers
5359

5460
def requests(self, session: requests.Session):
5561
"""
@@ -62,11 +68,11 @@ def requests(self, session: requests.Session):
6268
"""
6369
session_r = session or requests.Session()
6470
retry = Retry(
65-
total=self.retries,
66-
read=self.retries,
67-
connect=self.retries,
71+
total=self._retries,
72+
read=self._retries,
73+
connect=self._retries,
6874
backoff_factor=0.3,
69-
status_forcelist=self.status_retries,
75+
status_forcelist=self._status_retries,
7076
)
7177
adapter = HTTPAdapter(max_retries=retry)
7278
session_r.mount('http://', adapter)
@@ -94,7 +100,8 @@ def insert_trace_headers(self, headers: dict) -> dict:
94100
logger.debug("Tracer error {}".format(ex))
95101
return headers
96102

97-
def propagate_headers(self, headers: dict) -> dict:
103+
@staticmethod
104+
def propagate_headers(headers: dict) -> dict:
98105
for k, v in request.headers:
99106
if not headers.get(k):
100107
headers.update({k: v})
@@ -114,7 +121,7 @@ def _get_headers(self, headers, propagate_headers=False):
114121
self.tracer = current_app.tracer
115122
if self.tracer:
116123
headers = self.insert_trace_headers(headers)
117-
if self.config.propagate_headers or propagate_headers:
124+
if self._propagate_headers or propagate_headers:
118125
headers = self.propagate_headers(headers)
119126
return headers
120127

@@ -164,7 +171,7 @@ def get(self, url, path_params=None, params=None, headers=None, propagate_header
164171
full_url = self._build_url(url, path_params)
165172
headers = self._get_headers(headers=headers, propagate_headers=propagate_headers)
166173
logger.debug("Get with url {}, params {}, headers {}, kwargs {}".
167-
format(full_url, params, headers, kwargs))
174+
format(full_url, params, headers, kwargs))
168175

169176
session = requests.Session()
170177
response = self.requests(session=session).get(full_url, params=params, headers=headers, **kwargs)
@@ -205,7 +212,7 @@ def post(self, url, path_params=None, data=None, json=None, headers=None, **kwar
205212
full_url = self._build_url(url, path_params)
206213
headers = self._get_headers(headers)
207214
logger.debug("Post with url {}, data {}, json {}, headers {}, kwargs {}".format(full_url, data, json,
208-
headers, kwargs))
215+
headers, kwargs))
209216

210217
session = requests.Session()
211218
response = self.requests(session=session).post(full_url, data=data, json=json, headers=headers, **kwargs)
@@ -248,7 +255,7 @@ def put(self, url, path_params=None, data=None, headers=None, **kwargs):
248255
full_url = self._build_url(url, path_params)
249256
headers = self._get_headers(headers)
250257
logger.debug("Put with url {}, data {}, headers {}, kwargs {}".format(full_url, data, headers,
251-
kwargs))
258+
kwargs))
252259

253260
session = requests.Session()
254261
response = self.requests(session=session).put(full_url, data, headers=headers, **kwargs)

pyms/flask/services/tracer.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
from pyms.constants import LOGGER_NAME
66
from pyms.flask.services.driver import DriverService
7-
from pyms.utils.utils import check_package_exists, import_package, import_from
7+
from pyms.utils import check_package_exists, import_package, import_from
88
from pyms.config.conf import get_conf
99

1010
logger = logging.getLogger(LOGGER_NAME)

pyms/utils/__init__.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
from pyms.utils.utils import import_from, import_package, check_package_exists
2+
3+
__all__ = ['import_from', 'import_package', 'check_package_exists']
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
pyms:
2+
requests: true
3+
swagger:
4+
path: ""
5+
file: "swagger.yaml"
6+
tracer:
7+
client: "jaeger"
8+
host: "localhost"
9+
component_name: "Python Microservice"
10+
my-ms:
11+
DEBUG: true
12+
TESTING: true
13+
APP_NAME: "Python Microservice"
14+
APPLICATION_ROOT: /
15+
test_var: general
16+
subservice1:
17+
test: input
18+
subservice2:
19+
test: output

tests/test_config.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,7 @@
33
import unittest
44
from unittest import mock
55

6-
from pyms.config.conf import get_conf
7-
from pyms.config.confile import ConfFile
6+
from pyms.config import get_conf, ConfFile
87
from pyms.constants import CONFIGMAP_FILE_ENVIRONMENT, LOGGER_NAME
98
from pyms.exceptions import AttrDoesNotExistException, ConfigDoesNotFoundException, ServiceDoesNotExistException
109

@@ -112,7 +111,6 @@ def test_empty_conf_three_levels(self):
112111
self.assertEqual(config.my_ms.level_two.level_three, {})
113112

114113

115-
116114
class GetConfig(unittest.TestCase):
117115
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
118116

tests/test_flask.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ def test_healthcheck(self):
4848

4949
class MicroserviceTest(unittest.TestCase):
5050
"""
51-
Tests for healthcheack endpoints
51+
Tests for Singleton
5252
"""
5353

5454
def setUp(self):

0 commit comments

Comments
 (0)