Skip to content

Commit 5013bec

Browse files
committed
added status for the demon record usage call
1 parent 4b0587a commit 5013bec

File tree

9 files changed

+263
-52
lines changed

9 files changed

+263
-52
lines changed
Lines changed: 49 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,59 @@
11
import json
2+
import logging
23

34
from services import UsageService
4-
from utils import make_response
5+
from logger import setup_logger
6+
from utils import validate_freecalls_request
57

68
usage_service = UsageService()
79

8-
9-
def get_and_validate_requried_params(event):
10-
try:
11-
org_id = event['queryStringParameters']['organization_id']
12-
service_id = event['queryStringParameters']['service_id']
13-
user_id = event['queryStringParameters']['username']
14-
except Exception as e:
15-
raise e
16-
17-
return org_id, service_id, user_id
10+
setup_logger()
11+
logger = logging.getLogger(__name__)
1812

1913

2014
def main(event, context):
21-
org_id, service_id, username = get_and_validate_requried_params(event)
22-
free_call_details = usage_service.get_free_call_details(
23-
username, org_id, service_id)
24-
25-
return_value = {
26-
"statusCode": 200,
27-
"headers": {
28-
"Content-Type": "application/json",
29-
"Access-Control-Allow-Origin": "*",
30-
"Access-Control-Allow-Methods": "OPTIONS,POST,GET"
31-
},
32-
"body": json.dumps(free_call_details)
33-
}
34-
15+
if validate_freecalls_request(event['queryStringParameters']):
16+
try:
17+
org_id = event['queryStringParameters']['organization_id']
18+
service_id = event['queryStringParameters']['service_id']
19+
username = event['queryStringParameters']['username']
20+
free_call_details = usage_service.get_free_call_details(
21+
username, org_id, service_id)
22+
return_value = {
23+
"statusCode": 200,
24+
"headers": {
25+
"Content-Type": "application/json",
26+
"Access-Control-Allow-Origin": "*",
27+
"Access-Control-Allow-Methods": "OPTIONS,POST,GET"
28+
},
29+
"body": json.dumps(free_call_details)
30+
}
31+
except Exception as e:
32+
logger.error(e)
33+
return_value = {
34+
"statusCode": 500,
35+
"headers": {
36+
"Content-Type": "application/json",
37+
"Access-Control-Allow-Origin": "*",
38+
"Access-Control-Allow-Methods": "OPTIONS,POST,GET"
39+
},
40+
"body": json.dumps({
41+
'status': "failed",
42+
'error': "Internal server error"
43+
})
44+
}
45+
else:
46+
logger.error('Request validation failed')
47+
return_value = {
48+
"statusCode": 400,
49+
"headers": {
50+
"Content-Type": "application/json",
51+
"Access-Control-Allow-Origin": "*",
52+
"Access-Control-Allow-Methods": "OPTIONS,POST,GET"
53+
},
54+
"body": json.dumps({
55+
'status': "failed",
56+
'error': "Validation failed"
57+
})
58+
}
3559
return return_value

metering/handlers/usage_handler.py

Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,38 @@
11
import json
2+
import logging
23

4+
from logger import setup_logger
35
from services import UsageService
4-
from utils import make_response, check_given_key
6+
from utils import validate_usage_body
57

68
usage_service = UsageService()
79

8-
9-
def get_and_validate_requried_params(event):
10-
try:
11-
body = json.loads(event['body'])
12-
if not check_given_key('organization_id', body):
13-
raise Exception("Org id is compulsory parameter in body request")
14-
except Exception as e:
15-
raise e
16-
return body
10+
setup_logger()
11+
logger = logging.getLogger(__name__)
1712

1813

1914
def main(event, context):
20-
usage_detail_dict = get_and_validate_requried_params(event)
21-
usage_service.save_usage_details(usage_detail_dict)
15+
usage_detail_dict = json.loads(event['body'])
2216

23-
response = {
24-
"statusCode": 201,
25-
"body": json.dumps({"status": "successfull"})
26-
}
17+
try:
18+
if validate_usage_body(usage_detail_dict):
19+
usage_service.save_usage_details(usage_detail_dict)
20+
response = {
21+
"statusCode": 201,
22+
"body": json.dumps({"status": "successful"})
23+
}
24+
else:
25+
logger.error(f'Request validation failed {usage_detail_dict}')
26+
response = {
27+
"statusCode": 400,
28+
"body": json.dumps({"status": "request validation failed"})
29+
}
30+
except Exception as e:
31+
logger.error(e)
32+
logger.error(f'failed for request {usage_detail_dict}')
33+
response = {
34+
"statusCode": 500,
35+
"body": json.dumps({"status": "failed"})
36+
}
2737

2838
return response

metering/logger.py

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import logging.config
2+
3+
4+
def setup_logger():
5+
logging.config.dictConfig({
6+
"version": 1,
7+
"disable_existing_loggers": True,
8+
"formatters": {
9+
"simple": {
10+
"format": "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
11+
}
12+
},
13+
14+
"handlers": {
15+
"console": {
16+
"class": "logging.StreamHandler",
17+
"level": "DEBUG",
18+
"formatter": "simple",
19+
"stream": "ext://sys.stdout"
20+
},
21+
22+
"info_file_handler": {
23+
"class": "logging.handlers.RotatingFileHandler",
24+
"level": "INFO",
25+
"formatter": "simple",
26+
"filename": "info.log",
27+
},
28+
29+
"error_file_handler": {
30+
"class": "logging.handlers.RotatingFileHandler",
31+
"level": "ERROR",
32+
"formatter": "simple",
33+
"filename": "error.log",
34+
"encoding": "utf8"
35+
}
36+
},
37+
38+
"loggers": {
39+
"sqlalchemy": {
40+
"level": "ERROR",
41+
"handlers": ["console"]
42+
},
43+
"freecall_handler": {
44+
"level": "ERROR",
45+
"handlers": ["console"]
46+
},
47+
"": {
48+
"level": "ERROR",
49+
"handlers": ["console"]
50+
}
51+
},
52+
53+
"root": {
54+
"level": "ERROR",
55+
"handlers": ["console"]
56+
}
57+
})

metering/repository/base_repository.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,13 @@ def create_item(self, item, session=None):
2525
session.flush()
2626
return item
2727

28+
def create_all_items(self, items, session=None):
29+
session = self.get_default_session(session)
30+
session.add_all(items)
31+
session.commit()
32+
session.flush()
33+
return items
34+
2835
def remove_item(self, item, session=None):
2936
pass
3037

metering/repository/org_service_config_repository.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,14 @@ def get_service_config(self, org_id, service_id, optin_time):
1111
.filter(OrgServiceConfigModel.org_id == org_id) \
1212
.filter(OrgServiceConfigModel.service_id == service_id) \
1313
.filter(OrgServiceConfigModel.effective_start_date <= optin_time) \
14-
.filter(OrgServiceConfigModel.effective_end_date >= optin_time).first()
14+
.filter(OrgServiceConfigModel.effective_end_date >= optin_time).all()
1515
else:
1616
service_config = session.query(OrgServiceConfigModel.free_calls.label('free_calls')) \
1717
.filter(OrgServiceConfigModel.org_id == org_id) \
18-
.filter(OrgServiceConfigModel.service_id == service_id)\
19-
.order_by(OrgServiceConfigModel.created_at.desc()).first()
18+
.filter(OrgServiceConfigModel.service_id == service_id) \
19+
.order_by(OrgServiceConfigModel.created_at.desc()).all()
2020
session.commit()
2121
session.flush()
22-
return service_config
22+
if len(service_config) == 0:
23+
return None
24+
return service_config[0].free_calls

metering/services.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,6 @@ def get_free_call_details(self, username, org_id, service_id, group_id=None):
1010

1111
if not free_calls:
1212
free_calls = 0
13-
else:
14-
free_calls = free_calls[0]
1513
if not total_calls:
1614
total_calls = 0
1715

metering/storage.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ def add_usage_data(self, usage_details):
5454
usage_type=usage_details['usage_type'],
5555
usage_value=usage_details['usage_value'],
5656
start_time=usage_details['start_time'],
57-
end_time=usage_details['start_time']
57+
end_time=usage_details['end_time']
5858
)
5959
self.usage_repo.create_item(usage_record)
6060

metering/tests/test_total_calls.py

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
import unittest
2+
3+
from models import OrgServiceConfigModel, UsageModel, UserOrgGroupModel
4+
from repository.org_service_config_repository import OrgServiceRepo
5+
from repository.usage_repository import UsageRepository
6+
from repository.user_org_group_repository import UserOrgGroupRepository
7+
from storage import DatabaseStorage
8+
9+
10+
class TestTotalCalls(unittest.TestCase):
11+
def setUp(self):
12+
self.org_service_repository = OrgServiceRepo()
13+
self.usage_repository = UsageRepository()
14+
self.user_org_group_repository = UserOrgGroupRepository()
15+
self.storage_service = DatabaseStorage()
16+
self.org_service_repository.get_default_session().query(OrgServiceConfigModel).delete()
17+
self.org_service_repository.get_default_session().query(UsageModel).delete()
18+
self.org_service_repository.get_default_session().query(UserOrgGroupModel).delete()
19+
service_items = list()
20+
service_items.append(
21+
OrgServiceConfigModel(
22+
org_id='snet',
23+
service_id='example-service',
24+
free_calls=100,
25+
effective_end_date='2030-09-12 00:00:00',
26+
effective_start_date='2011-09-12 00:00:00'
27+
)
28+
)
29+
self.org_service_repository.create_all_items(service_items)
30+
31+
def test_free_calls(self):
32+
self.assertEqual((0, 100), self.storage_service.get_usage_details(
33+
user_name='user@snet', org_id='snet', service_id='example-service'))
34+
self.org_service_repository.get_default_session().query(UsageModel).delete()
35+
36+
def test_success_usage_record(self):
37+
self.storage_service.add_usage_data({
38+
"type": "response",
39+
"registry_address_key": "0x5156fde2ca71da4398f8c76763c41bc9633875e4",
40+
"ethereum_json_rpc_endpoint": "https://ropsten.infura.io",
41+
"request_id": "bl5tuet35nkvoh9gt9q0",
42+
"organization_id": "snet",
43+
"service_id": "example-service",
44+
"group_id": "3cFvmyLn9UO1jrtuZLerzbgLj6AOtqGo+IBQHtZzV1Q=",
45+
"service_method": "/example_service.Calculator/add",
46+
"response_sent_time": "2019-08-08 14:07:15.883501805",
47+
"request_received_time": "2019-08-08 14:07:15.337318252",
48+
"response_time": "0.5461",
49+
"response_code": "Unavailable",
50+
"error_message": "",
51+
"version": "v1.0.0",
52+
'username': 'user@snet',
53+
"operation": "read",
54+
"usage_type": "apicall",
55+
"status": "success",
56+
"start_time": "2019-08-08 14:07:15.337318252",
57+
"end_time": "2019-08-08 14:07:15.883501805",
58+
"usage_value": 1,
59+
"time_zone": "IST",
60+
61+
})
62+
self.storage_service.add_usage_data({
63+
"type": "response",
64+
"registry_address_key": "0x5156fde2ca71da4398f8c76763c41bc9633875e4",
65+
"ethereum_json_rpc_endpoint": "https://ropsten.infura.io",
66+
"request_id": "bl5tuet35nkvoh9gt9q0",
67+
"organization_id": "snet",
68+
"service_id": "example-service",
69+
"group_id": "3cFvmyLn9UO1jrtuZLerzbgLj6AOtqGo+IBQHtZzV1Q=",
70+
"service_method": "/example_service.Calculator/add",
71+
"response_sent_time": "2019-08-08 14:07:15.883501805",
72+
"request_received_time": "2019-08-08 14:07:15.337318252",
73+
"response_time": "0.5461",
74+
"response_code": "Unavailable",
75+
"error_message": "",
76+
"version": "v1.0.0",
77+
'username': 'user@snet',
78+
"operation": "read",
79+
"usage_type": "apicall",
80+
"status": "failed",
81+
"start_time": "2019-08-08 14:07:15.337318252",
82+
"end_time": "2019-08-08 14:07:15.883501805",
83+
"usage_value": 1,
84+
"time_zone": "IST",
85+
86+
})
87+
self.assertEqual((1, 100), self.storage_service.get_usage_details(
88+
user_name='user@snet', org_id='snet', service_id='example-service'))
89+
self.org_service_repository.get_default_session().query(UsageModel).delete()
90+
91+
def tearDown(self):
92+
self.org_service_repository.get_default_session().query(OrgServiceConfigModel).delete()
93+
self.org_service_repository.get_default_session().query(UsageModel).delete()
94+
self.org_service_repository.get_default_session().query(UserOrgGroupModel).delete()
95+
96+
97+
if __name__ == '__main__':
98+
unittest.main()

metering/utils.py

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,22 @@ def configure_log(logger):
2222
logger.addHandler(handler)
2323

2424

25-
def check_given_key(key, dict):
26-
if key in dict:
27-
return True
28-
return False
25+
def validate_usage_body(request_body):
26+
required_keys = ["organization_id", "service_id", "username", 'usage_value', 'usage_type',
27+
'service_method', 'group_id', 'status', 'start_time', 'end_time']
28+
for key in required_keys:
29+
if key not in request_body:
30+
return False
31+
return True
32+
33+
34+
def validate_freecalls_request(request):
35+
required_keys = ['username', 'organization_id', 'service_id']
36+
for key in required_keys:
37+
if key not in request:
38+
return False
39+
return True
40+
41+
42+
def validator_usage():
43+
pass

0 commit comments

Comments
 (0)