11import json
22import logging
33import os
4+ from functools import cache
45from typing import List
56
7+ import boto3
68from aws_lambda_typing import context as context_
79from aws_lambda_typing import events
810from cnm_sender import CnmSender
911
1012from ctorm .config import (
13+ AWS_REGION ,
1114 CtormConfig ,
1215 CtormPreparedGranule ,
1316)
1417
1518log = logging .getLogger (__name__ )
1619
1720
21+ @cache
22+ def get_sqs_client ():
23+ return boto3 .client ("sqs" , region_name = AWS_REGION )
24+
25+
26+ @cache
1827def configure_cfg ():
1928 cfg = CtormConfig .from_file (
2029 cfg_file = os .getenv ("CFG_FILE" , "./ctorm.cfg" ),
@@ -43,9 +52,46 @@ def configure_logging() -> None:
4352 )
4453
4554
46- def load_test (cfg : CtormConfig , granule_list : List [CtormPreparedGranule ]):
47- c_sender = CnmSender (cfg , granule_list )
48- c_sender .send_all ()
55+ def get_granule_list (event : events .EventBridgeEvent ) -> List [CtormPreparedGranule ]:
56+ # TODO: Implement
57+ return []
58+
59+
60+ def load_test (
61+ cfg : CtormConfig ,
62+ gr_queue_url : str ,
63+ ):
64+ # fetch 10 messages from SQS
65+ messages = []
66+ while len (messages ) < 10 :
67+ # Since we're trying to send x granules per invocation, we will do what we can
68+ # to get a full load of 10 messages.
69+ sqs_resp = get_sqs_client ().receive_message (
70+ QueueUrl = gr_queue_url ,
71+ MaxNumberOfMessages = min (10 - len (messages ), 10 ),
72+ WaitTimeSeconds = 5 ,
73+ VisibilityTimeout = 3600 ,
74+ )
75+
76+ batch = sqs_resp .get ("Messages" , [])
77+ if not batch :
78+ break
79+
80+ messages .extend (batch )
81+
82+ for message in sqs_resp .get ("Messages" , []):
83+ body = json .loads (message ["Body" ])
84+ receipt_handle = message ["ReceiptHandle" ]
85+ granule_list = body .get ("granules" , [])
86+
87+ c_sender = CnmSender (cfg , granule_list )
88+ success = c_sender .send_all ()
89+ if success :
90+ log .debug ("Deleting message %s" , receipt_handle )
91+ # TODO: uncomment after some dev'ing
92+ # get_sqs_client().delete_message(
93+ # QueueUrl=gr_queue_url, ReceiptHandle=receipt_handle
94+ # )
4995
5096
5197def lambda_handler (event : events .EventBridgeEvent , context : context_ .Context ):
@@ -61,9 +107,10 @@ def lambda_handler(event: events.EventBridgeEvent, context: context_.Context):
61107
62108 try :
63109 log .debug ("Received event: %s" , event )
64- g_list = event ["Records" ].pop ().get ("body" )
65- g_list = json .loads (g_list ).get ("granules" )
66- load_test (cfg , g_list )
110+ # g_list = event["Records"].pop().get("body")
111+ # g_list = json.loads(g_list).get("granules")
112+
113+ load_test (cfg , event ["granules_queue_url" ])
67114
68115 log .info ("CNM sender invocation completed" )
69116 return {"ok" : True }
0 commit comments