1010
1111import boto3
1212import urllib3
13- import jmespath
13+ from jmespath import search
1414
1515def handler (event , _ ):
1616 """
@@ -21,82 +21,104 @@ def handler(event, _):
2121 CMR_LB_NAME - The LB used for routing calls to CMR
2222 """
2323 environment = os .getenv ('CMR_ENVIRONMENT' )
24- cmr_lb_name = os .getenv ('CMR_LB_NAME' )
25- service = event .get ('service' , 'bootstrap' )
26- endpoint = event .get ('endpoint' )
27- single_target = event .get ('single-target' , True )
28- request_type = event .get ('request-type' , "GET" )
2924
30- if environment is None :
25+ if not environment :
3126 print ("ERROR: CMR_ENVIRONMENT variable not set!" )
32- if cmr_lb_name is None :
27+ if not os . getenv ( "CMR_LB_NAME" ) :
3328 print ("ERROR: CMR_LB_NAME variable not set!" )
34- #An extra check here so that if both variables are not set,
35- #it can at least be reported at one time
36- if environment is None or cmr_lb_name is None :
29+ if environment is None or os .getenv ("CMR_LB_NAME" ) is None :
3730 sys .exit (1 )
3831
3932 if environment == 'local' :
40- json_file = open ('service-ports.json' , encoding = "UTF-8" )
33+ route_local (event = event )
34+ else :
35+ route (environment = environment , event = event )
36+
37+ def send_request (request_type , token , url ):
38+ """
39+ Sends the request of given type with given token
40+ to given url
41+ """
42+ timeout = int (os .getenv ('ROUTER_TIMEOUT' , '300' ))
43+
44+ pool_manager = urllib3 .PoolManager (headers = {"Authorization" : token , \
45+ "Client-Id" : "cmr-job-router" }, \
46+ timeout = urllib3 .Timeout (timeout ))
47+
48+ response = pool_manager .request (request_type , url )
49+ if response .status != 200 :
50+ print (f"Error received sending { request_type } to { url } : " \
51+ + f"{ str (response .status )} reason: { response .reason } " )
52+ sys .exit (- 1 )
53+
54+ def route_local (event ):
55+ """
56+ Handles the routing for a local request
57+ """
58+ service = event .get ('service' , 'bootstrap' )
59+ endpoint = event .get ('endpoint' )
60+ request_type = event .get ('request-type' , "GET" )
61+
62+ with open ('service-ports.json' , encoding = "UTF-8" ) as json_file :
4163 service_ports = json .load (json_file )
4264
4365 token = 'mock-echo-system-token'
44- pool_manager = urllib3 .PoolManager (num_pools = 1 , \
45- headers = {"Authorization" : token }, \
46- timeout = urllib3 .Timeout (15 ))
4766
48- print ("Sending to: " + " host.docker.internal:" + service_ports [service ] + "/" + endpoint )
67+ print (f "Sending to: host.docker.internal:{ service_ports [service ]} / { endpoint } " )
4968 try :
50- response = pool_manager .request (request_type , "host.docker.internal:" + service_ports [service ] + "/" + endpoint )
51- if response .status != 200 :
52- print ("Error received sending " + request_type + " to " + "host.docker.internal:" + service_ports [service ] + "/" + endpoint \
53- + ": " + str (response .status ) + " reason: " + response .reason )
54- sys .exit (- 1 )
55- except Exception as e :
69+ send_request (request_type = request_type ,
70+ token = token ,
71+ url = f"host.docker.internal:{ service_ports [service ]} /{ endpoint } " )
72+ except Exception as e : # pylint: disable=broad-exception-caught; Not worried about this being too broad
5673 print ("Ran into an error!" )
5774 print (e )
5875 sys .exit (- 1 )
59- return
76+
77+ def route (environment , event ):
78+ """
79+ Handles routing for single target and multi target requests
80+ on a deployed environment
81+ """
82+ host = os .getenv ('CMR_LB_NAME' )
83+ service = event .get ('service' , 'bootstrap' )
84+ endpoint = event .get ('endpoint' )
85+ single_target = event .get ('single-target' , True )
86+ request_type = event .get ('request-type' , "GET" )
6087
6188 client = boto3 .client ('ecs' )
6289 ssm_client = boto3 .client ('ssm' )
6390 elb_client = boto3 .client ('elbv2' )
6491
65- cmr_url = elb_client .describe_load_balancers (Names = [cmr_lb_name ])["LoadBalancers" ][0 ]["DNSName" ]
66-
67- token = ssm_client .get_parameter (Name = '/' + environment + '/' + service + '/CMR_ECHO_SYSTEM_TOKEN' , \
68- WithDecryption = True )['Parameter' ]['Value' ]
92+ cmr_url = elb_client .describe_load_balancers (Names = [host ])["LoadBalancers" ][0 ]["DNSName" ]
6993
70- pool_manager = urllib3 .PoolManager (headers = {"Authorization" : token }, timeout = urllib3 .Timeout (15 ))
94+ token = ssm_client .get_parameter (Name = f"/{ environment } /{ service } /CMR_ECHO_SYSTEM_TOKEN" , \
95+ WithDecryption = True )['Parameter' ]['Value' ]
7196
7297 if single_target :
73- print ("Running " + request_type + " on URL: " + cmr_url + '/' + service + '/' + endpoint )
98+ print (f "Running { request_type } on URL: { cmr_url } / { service } / { endpoint } " )
7499
75- response = pool_manager .request (request_type , cmr_url + '/' + service + '/' + endpoint )
76- if response .status != 200 :
77- print ("Error received sending request to " + cmr_url + '/' + service + '/' + endpoint \
78- + ": " + str (response .status ) + " reason: " + response .reason )
79- sys .exit (- 1 )
100+ send_request (request_type = request_type ,
101+ token = token ,
102+ url = f"{ cmr_url } /{ service } /{ endpoint } " )
80103 else :
81104 #Multi-target functionality is not fully implemented.
82105 #CMR-9688 has been made to finish this part out
83106 response = client .list_tasks (
84- cluster = ' cmr-service-' + environment ,
85- serviceName = service + '-' + environment
107+ cluster = f" cmr-service-{ environment } " ,
108+ serviceName = f" { service } - { environment } "
86109 )['taskArns' ]
87110
88111 response = client .describe_tasks (
89- cluster = ' cmr-service-' + environment ,
112+ cluster = f" cmr-service-{ environment } " ,
90113 tasks = response
91114 )
92- task_ips = jmespath .search ("tasks[*].attachments[0].details[?name=='privateIPv4Address'].value" , response )
93- task_ips = jmespath .search ("[]" , task_ips )
115+ task_ips = search ("tasks[*].attachments[0].details[?name=='privateIPv4Address'].value" ,\
116+ response )
117+ task_ips = search ("[]" , task_ips )
94118
95119 for task in task_ips :
96- print ("Running POST on URL: " + task + '/' + service + '/' + endpoint )
120+ print (f "Running POST on URL: { task } / { service } / { endpoint } " )
97121
98- response = pool_manager .request (request_type , task + '/' + service + '/' + endpoint )
99- if response .status != 200 :
100- print ("Error received sending " + request_type + " to " + task + '/' + service + '/' + endpoint \
101- + ": " + str (response .status ) + " reason: " + response .reason )
102- sys .exit (- 1 )
122+ send_request (request_type = request_type ,
123+ token = token ,
124+ url = f"{ task } /{ service } /{ endpoint } " )
0 commit comments