1+ #!/usr/bin/env python3
2+
13"""
24local_scheduler takes the job details json file to create
35a simple schedule with the Python schedule library.
46Interval jobs are simply translated unto the library,
57cron jobs are assumed to run at a given HH:MM every day.
68"""
9+ import argparse
10+ import logging
711import time
812import json
913import os
14+ import sys
15+
16+ # pylint: disable=import-error
1017import schedule
1118import urllib3
1219
20+ # setup logger
21+ logging .basicConfig (level = logging .INFO ,
22+ format = '%(asctime)s - %(name)s - %(levelname)s - %(message)s' ,
23+ filename = f'{ __file__ } .log' )
24+ logger : logging .Logger = logging .getLogger (__name__ )
25+
1326service_ports_file_name = os .getenv ("SERVICE_PORTS_FILE" , "service-ports.json" )
1427job_details_file_name = os .getenv ("JOB_DETAILS_FILE" , "../job-details.json" )
28+ cmr_host_name : str = os .getenv ("CMR_HOST_NAME" , "localhost" )
1529
16- pool_manager = urllib3 .PoolManager (headers = {"Authorization" : "mock-echo-system-token" })
30+ pool_manager = urllib3 .PoolManager (headers = {"Authorization" : "mock-echo-system-token" ,
31+ "client-id" : f'{ __file__ } ' })
1732
1833with open (service_ports_file_name , encoding = "UTF-8" ) as service_ports_file :
1934 service_port_map = json .load (service_ports_file )
2035
21- def build_endpoint (job ):
36+ def build_endpoint (host_name , job ):
2237 """
2338 Takes the job details and builds the local job endpoint
2439 """
25- url = "http://{}:{}"
40+ url = "http://{}:{}/{} "
2641 port = service_port_map [job ["target" ]["service" ]]
27- return url .format (port , job ["target" ]["endpoint" ])
42+ return url .format (host_name , port , job ["target" ]["endpoint" ])
2843
29- def run_job (details , name ):
44+ def run_job (job_details : dict , job_name : str ):
3045 """
3146 Takes the job details and runs a REST request on the job endpoint.
3247 """
33- print ('send ' + details ["target" ]["request-type" ] + \
34- ' to ' + details ["target" ]["endpoint" ] + ' for job ' + name )
35- pool_manager .request (details ["target" ]["request-type" ], build_endpoint (details ))
48+ logger .info ('send ' + job_details ["target" ]["request-type" ] + \
49+ ' to ' + job_details ["target" ]["endpoint" ] + ' for job ' + job_name )
50+ url : str = build_endpoint (cmr_host_name , job_details )
51+ pool_manager .request (job_details ["target" ]["request-type" ], url )
3652
3753def create_schedule ():
3854 """
@@ -46,22 +62,39 @@ def create_schedule():
4662 if job_details ["scheduling" ]["type" ] == "cron" :
4763 hours = str (job_details ["scheduling" ]["timing" ]["hours" ]).zfill (2 )
4864 minutes = str (job_details ["scheduling" ]["timing" ]["minutes" ]).zfill (2 )
49- print ("Scheduling job " + job_name + " at " + hours + ":" + minutes )
65+ logger . info ("Scheduling job " + job_name + " at " + hours + ":" + minutes )
5066
5167 schedule .every ().day .at (hours + ":" + minutes ).do (run_job ,
5268 job_details = job_details , job_name = job_name )
5369 elif job_details ["scheduling" ]["type" ] == "interval" :
5470 minutes = job_details ["scheduling" ]["timing" ].get ("minutes" , 0 )
5571 hours = job_details ["scheduling" ]["timing" ].get ("hours" , 0 )
5672 total_minutes = minutes + hours * 60
57- print ("Scheduling job for every " + str ( total_minutes ) + " minutes" )
73+ logger . info ("Scheduling job for every %d minutes" , total_minutes )
5874
5975 schedule .every (total_minutes ).seconds .do (run_job , job_details = job_details ,
6076 job_name = job_name )
6177
62- if __name__ == '__main__' :
63- create_schedule ()
78+ def main ():
79+ """ The primary interface for this script. """
80+ parser = argparse .ArgumentParser (description = "External CMR scheduler" )
81+ parser .add_argument ('-t' , '--test' , action = 'store_true' ,
82+ help = 'Do a test run of RefreashKMSCache and exit.' )
83+ args = parser .parse_args ()
6484
85+ if args .test :
86+ # use these next lines to force a test on a very specific job
87+ test_detail = {"target" : {"request-type" : "POST" ,
88+ "service" : "bootstrap" ,
89+ "single-target" : True ,
90+ "endpoint" : "caches/refresh/kms" }}
91+ run_job (test_detail , "RefreshKMSCache" )
92+ sys .exit ()
93+
94+ create_schedule ()
6595 while True :
6696 schedule .run_pending ()
6797 time .sleep (1 )
98+
99+ if __name__ == '__main__' :
100+ main ()
0 commit comments