Skip to content

Commit 56bf291

Browse files
authored
CMR-10425: Update job-router libraries for use with python 3.13 (nasa#2226)
* remove fixed lib version for job-router * removing fixed version on test reqs job-router * disable pip cache for cicd build script * add bash header * add extra cicd build script * uppdating some usage of urllib3 * specify urllib3.request * some cleanup, revert to poolmanager * adjust timeout * refactoring * bit more refactoring * minor adjustments * add newline and fix some pylint
1 parent 752d8ea commit 56bf291

File tree

5 files changed

+74
-47
lines changed

5 files changed

+74
-47
lines changed

job-utilities/job_router/build.sh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
#!/bin/bash
12
mkdir package
23

34
pip3 install --target ./package -r requirements.txt

job-utilities/job_router/lambda_function.py

Lines changed: 67 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
import boto3
1212
import urllib3
13-
import jmespath
13+
from jmespath import search
1414

1515
def 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}")
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
#!/bin/bash
2+
mkdir package
3+
4+
pip3 install --target ./package -r requirements.txt
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
boto3
2-
urllib3==1.26.19
2+
urllib3
33
jmespath
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
boto3
2-
urllib3==1.26.18
2+
urllib3
33
jmespath

0 commit comments

Comments
 (0)