class test_Check_Main_Commands(TestCase): def setUp(self): self.osbot = Lambda('osbot.lambdas.osbot') self.api_gw_payload = { 'token': 'abc', 'team_id': 'T7F3AUXGV', 'api_app_id': 'ADKLUAF3M', 'event': { 'client_msg_id': '9a85fa78-24be-4701-8ff0-5b50dd12738f', 'type': 'message', 'text': 'help', 'user': '******', 'ts': '1554811005.000200', 'channel': 'DDKUZTK6X', 'event_ts': '1554811005.000200', 'channel_type': 'im' }, 'type': 'event_callback', 'event_id': 'EvHT1YNVU5', 'event_time': 1554811005, 'authed_users': ['UDK5W7W3T'] } def test_invoke(self): assert self.osbot.invoke( ) == '500 Error' # todo: find out the why the error def test_send_API_GW_command(self): Dev.pprint(self.osbot.invoke(Test_Data.api_gw_payload_help))
class test_lambda_wardley_maps(Test_Helper): def setUp(self): self.lambda_name = 'osbot_browser.lambdas.lambda_browser' self.lambda_browser = Lambda( self.lambda_name) #lambdas.browser.lambda_browser') self.result = None self.png_data = None def tearDown(self): if self.result is not None: Dev.pprint(self.result) if self.png_data: png_file = '/tmp/lambda_png_file.png' with open(png_file, "wb") as fh: fh.write(base64.decodebytes(self.png_data.encode())) def test_update_lambda(self): Deploy().setup().deploy_lambda__browser() def test_render__simple(self): payload = {"params": ['render', 'examples/wardley_map/simple.html']} self.png_data = self.lambda_browser.invoke(payload) def test_render__cup_of_tea(self): payload = { "params": ['render', 'examples/wardley_map/cup-of-tea.html'] } #self.png_data = self.lambda_browser.invoke(payload) self.result = self.lambda_browser.invoke(payload)
def add_processing_lambda_set_lambda_permission(self, lambda_arn): statement_id = 'allow_firehose_to_invoke_lambda_function' action = 'lambda:InvokeFunction' principal = 'firehose.amazonaws.com' aws_lambda = Lambda() aws_lambda.permission_delete(lambda_arn, statement_id) return aws_lambda.permission_add(lambda_arn, statement_id, action, principal, )
def policy_add_sqs_permissions_to_lambda_role(self, lambda_name): aws_lambda = Lambda(lambda_name) iam_role_name = aws_lambda.configuration().get('Role').split( ':role/').pop() IAM(role_name=iam_role_name).role_policy_attach( self.arn_aws_policy_service_sqs_lambda) return iam_role_name
def create(*event): aws_lambda = Lambda('osbot_browser.lambdas.lambda_browser') params = ["maps", "exec_js"] params.extend(event[2]) payload = {"params": params, 'data': {'channel': event[1]}} aws_lambda.invoke_async(payload)
def handle_dialog_submission(self, data): callback_id = data['callback_id'] channel = data['channel']['id'] user_id = data['user']['id'] if callback_id =='jira-graph-chooser': graph_name = data['submission'].get('graph_name') Lambda('pbx_gs_python_utils.lambdas.gs.elastic_jira').invoke_async({"params": ["graph", graph_name], "user": user_id, "channel": channel}) elif callback_id == 'jira-view-issue-links': self.handle_callback_jira_view_issue_links(data) elif callback_id == 'jira-view-issue-dialogue': slack_message('jira-view-issue-dialogue: {0}'.format(data),[], channel) key = data.get('submission').get('key') result = Lambda('pbx_gs_python_utils.lambdas.gs.elastic_jira').invoke({"params": ["issue", key], "user": user_id, "channel": channel}) slack_message(result.get('text'), result.get('attachments'), channel) # elif callback_id == 'issue-search-dialog': # self.(data) else: error_message = ":red_circle: Dialog callback_id not supported: {0}".format(callback_id) slack_message(error_message, [], channel) #self.api_slack.send_message(error_message, channel=channel) return None
def setUp(self) -> None: self.handler = run # link to the run method in exec_commands.py self.deploy_lambda = Deploy_Lambda( self.handler) # use OSBot_AWS helper class for deploying lambdas self.aws_lambda = Lambda(self.deploy_lambda.lambda_name( )) # use OSBot_Lambda helper class to invoke lambdas print()
class Test_lambda_api_gateway_simple_test(unittest.TestCase): def setUp(self): self.simple_test = Lambda('api_gateway.trigger_sync_jira_sheets') def test_update_and_invoke(self): file_id = '1yDxu5YxL9FxY5wQ1EEQlAYGt3flIsm2VTyWwPny5RLA' result = self.simple_test.invoke( {'queryStringParameters': { 'file_id': file_id }}) message = Misc.json_load(result.get('body')) Dev.pprint(message) #assert result == 'API Gateway test' def test_update_and_invoke__action_diff(self): file_id = '1yDxu5YxL9FxY5wQ1EEQlAYGt3flIsm2VTyWwPny5RLA' result = self.simple_test.invoke( {'queryStringParameters': { 'file_id': file_id, 'action': 'diff' }}) message = Misc.json_load(result.get('body')) Dev.pprint(message) def test_update_and_invoke__action_sync(self): file_id = '1yDxu5YxL9FxY5wQ1EEQlAYGt3flIsm2VTyWwPny5RLA' result = self.simple_test.invoke( {'queryStringParameters': { 'file_id': file_id, 'action': 'sync' }}) message = Misc.json_load(result.get('body')) Dev.pprint(message)
def show(params, height=200): browser = Lambda('osbot_browser.lambdas.lambda_browser') payload = {"params": params, 'data': {}} #browser.invoke(payload) png_data = browser.invoke(payload) # print(png_data) show_png(png_data, height)
def screenshot(team_id=None, channel=None, params=None): event = params.pop() # needed due to injection of event param try: if len(params) < 2: return send_message(":red_circle: missing `short id` and `path`. The syntax for this method is `screenshot {short_id} {path}`",channel, team_id) max_screenshot_delay = 15 short_id = params.pop(0) path = params.pop(0).replace('<', '').replace('>', '') # fix extra chars added by Slack width = Misc.to_int(Misc.array_pop(params, 0)) height = Misc.to_int(Misc.array_pop(params, 0)) delay = Misc.to_int(Misc.array_pop(params, 0)) if not width : width = 1200 if not height: height = 800 if not delay : delay = 0 if delay > max_screenshot_delay : delay = max_screenshot_delay send_message(":point_right: taking screenshot of notebook `{0}` in server `{1}` with width `{2}`, (min) height `{3}` and delay `{4}`".format(path,short_id,width,height,delay),channel,team_id) payload = {'short_id': short_id, 'path': path,'width': width,'height': height, 'delay' : delay} png_data = Lambda('osbot_jupyter.lambdas.screenshot').invoke(payload) if len(png_data) == 3: send_message(":red_circle: error taking screenshot :{0} ".format(png_data),channel,team_id) else: send_message(":point_right: got screenshot with size `{0}` (sending it to slack) ".format(len(png_data)),channel,team_id) Lambda('gw_bot.lambdas..png_to_slack').invoke({'png_data': png_data, 'team_id': team_id, 'channel': channel}) except Exception as error: send_message(":red_circle: error in screenshot: {0}".format(error),channel,team_id)
def setUp(self): super().setUp() self.lambda_name = 'osbot_browser.lambdas.lambda_browser' self.lambda_browser = Lambda(self.lambda_name) self.sow_views = Sow_Views() self.png_data = None self.result = None
class GSBot_Execution: def __init__(self): self.osbot_lambda = Lambda('osbot.lambdas.osbot') self.jira_lambda = Lambda('osbot_jira.lambdas.jira') def invoke(self, command): params = command.split(' ') if len(params) > 0: if params[0] == 'jira': return self.invoke_jira(params[1:]) return self.invoke_osbot(command) def invoke_osbot(self, command): payload = { 'event': { 'type': 'message', 'text': command, 'user': '******' } } result = self.osbot_lambda.invoke(payload) text = result.get('text') attachments = result.get('attachments') return text, attachments def invoke_jira(self, params): payload = {'params': params} return "[*]: {0}".format(self.jira_lambda.invoke(payload)), []
def test_fixed__bug_cache_issue_in_lambdas(self): payload = {"params": ["go_js", "graph_MKF", "default"]} self.png_data = Lambda('browser.lambda_browser').invoke(payload) Dev.pprint(self.png_data) self.png_data = Lambda('browser.lambda_browser').invoke(payload) Dev.pprint(self.png_data)
def slack(team_id=None, channel=None, params=None): target = Misc.array_pop(params, 0) height = Misc.to_int(Misc.array_pop(params, 0)) width = Misc.to_int(Misc.array_pop(params, 0)) scroll_by = Misc.to_int(Misc.array_pop(params, 0)) delay = Misc.to_int(Misc.array_pop(params, 0)) if target is None: target = 'general' if width is None: width = 800 if height is None: height = 1000 if scroll_by is None: scroll_by = 0 if delay is None: delay = 0 target_url = '/messages/{0}'.format(target) slack_message( ":point_right: Taking screenshot of slack channel: `{0}` with height `{1}`, width `{2}`, scroll_by `{3}` and delay `{4}`" .format(target, height, width, scroll_by, delay), [], channel, team_id) payload = { 'target': target_url, 'channel': channel, 'team_id': team_id, 'width': width, 'height': height, 'scroll_by': scroll_by, 'delay': delay } aws_lambda = Lambda('osbot_browser.lambdas.slack_web') aws_lambda.invoke_async(payload)
def setUp(self, region, account_id): super().setUp() self.lambda_name = 'tmp_lambda_dev_test' self.setup = super().setUp() self.s3_bucket = self.setup.s3_bucket_lambdas self.s3_key = f'{Globals.lambda_s3_key_prefix}/{self.lambda_name}.zip' #'lambdas/{0}.zip'.format(self.lambda_name) self.aws_lambda = Lambda(self.lambda_name)
def slack(team_id=None, channel=None, params=None): target = Misc.array_pop(params,0) height = Misc.to_int(Misc.array_pop(params, 0)) width = Misc.to_int(Misc.array_pop(params, 0)) if target is None: target = 'general' if width is None: width = 800 if height is None: height = 1000 target_url = '/messages/{0}'.format(target) slack_message(":point_right: taking screenshot of slack channel: `{0}` with height `{1}` and width `{2}`".format(target, height,width), [], channel, team_id) payload = {'target' : target_url, 'channel': channel, 'team_id': team_id, 'width' : width, 'height' : height} aws_lambda = Lambda('osbot_browser.lambdas.slack_web') png_data = aws_lambda.invoke(payload) browser_helper = Browser_Lamdba_Helper() return browser_helper.send_png_data_to_slack(team_id, channel, target, png_data)
def setUp(self): self.oss_setup = super().setUp() # self.aws_lambda = Lambda_Package('oss_bot.lambdas.git_lambda') # self.aws_lambda._lambda.set_s3_bucket(self.oss_setup.s3_bucket_lambdas) \ # .set_role (self.oss_setup.role_lambdas) self.aws_lambda = Lambda('oss_bot.lambdas.git_lambda') self.result = None
def jira_links(start, direction, depth): view = None lambda_graph = Lambda('osbot_jira.lambdas.jira') payload = {"params": ['links', start, direction, depth, view]} result = lambda_graph.invoke(payload) return json.loads(result.get('text'))
def info(team_id=None, channel=None, params=None): name = " ".join(params) aws_lambda = Lambda('oss_bot.lambdas.git_lambda') payload = {'action' : 'participant_info' , 'name' : name , 'channel': channel , 'commit' : False } aws_lambda.invoke_async(payload)
def bucket_notification_set_lambda_permission(self, s3_bucket, lambda_arn): from osbot_aws.apis.Lambda import Lambda statement_id = 'allow_s3_notifications_to_invoke_function' action = 'lambda:InvokeFunction' principal = 's3.amazonaws.com' aws_lambda = Lambda() aws_lambda.permission_delete(lambda_arn, statement_id) return aws_lambda.permission_add(lambda_arn, statement_id, action, principal, )
def setUp(self): super().setUp() self.lambda_name = 'osbot_jupyter.lambdas.screenshot' self.short_id = 'ec6a1' self.aws_lambda = Lambda(self.lambda_name) #Deploy(self.lambda_name).deploy_screenshot() # use when wanting to update lambda function self.result = None self.png_data = None
def maps_create(self, code, height=300): aws_lambda = Lambda('osbot_browser.lambdas.lambda_browser') params = ["maps", "exec_js"] params.extend(code.split(' ')) payload = {"params": params, 'data': {}} png_data = aws_lambda.invoke(payload) self.show_png(png_data, height)
class test_jira_web(unittest.TestCase): def setUp(self): self.png_data = None self.result = None self._lambda = Lambda('osbot_browser.lambdas.slack_web') def tearDown(self): if self.png_data: if type(self.png_data) is str: png_file = '/tmp/tmp-jira-screenshot.png' with open(png_file, "wb") as fh: fh.write(base64.decodebytes(self.png_data.encode())) Dev.pprint("Png data with size {0} saved to {1}".format( len(self.png_data), png_file)) else: Dev.print(self.result) if self.result: Dev.print(self.result) #def test_invoke_directly(self): # result = run({},{}) # assert result == '*Here are the `Browser_Commands` commands available:*' def test_invoke(self): self.test_update_lambda() target = '/messages/random/' payload = { 'target': target, 'channel': 'DDKUZTK6X', # gsbot 'team_id': 'T7F3AUXGV', # GS-CST 'width': 800, 'height': 1000 } self.result = self._lambda.invoke(payload) #self.png_data = self.result# self._lambda.invoke(payload) self.png_data = self.result def test_invoke_oss(self): self.test_update_lambda() #target = '/messages/oss-helpdesk' #target = '/messages/oss-general' target = '/messages/t-wardley-maps' payload = { 'target': target, 'channel': 'DJ8UA0RFT', # OSS - gsbot 'team_id': 'TAULHPATC', # OSS 'width': 1000, 'height': 6000, 'delay': 3, 'scroll_by': 15000 } self.result = self._lambda.invoke(payload) #self.png_data = self._lambda.invoke(payload) def test_update_lambda(self): Deploy().setup().deploy_lambda__slack_web()
def template(*event): aws_lambda = Lambda('osbot_browser.lambdas.lambda_browser') payload = { "params": ["maps", "default"], 'data': { 'channel': event[1] } } aws_lambda.invoke_async(payload)
def cup_of_tea(*event): aws_lambda = Lambda('osbot_browser.lambdas.lambda_browser') payload = { "params": ["maps", "render", "cup-of-tea"], 'data': { 'channel': event[1] } } aws_lambda.invoke_async(payload)
def maps_create(code): display(Javascript("$('.container').width('95%')")) aws_lambda = Lambda('osbot_browser.lambdas.lambda_browser') params = ["maps", "exec_js"] params.extend(code.split(' ')) payload = {"params": params, 'data': {}} png_data = aws_lambda.invoke(payload) show_png(png_data, 600)
def test_invoke(self): self.deploy.update() assert self.deploy.invoke({"name": "world"}) == "hello world" #invoke directly aws_lambda = Lambda(name=self.deploy.lambda_name()) assert aws_lambda.invoke() == 'hello None' assert aws_lambda.invoke({'name': 'world'}) == 'hello world'
def test_create_dot_then_svg_then_png(self): dot_to_svg = Lambda('utils.dot_to_svg').invoke svg_to_png = Lambda('utils.svg_to_png').invoke dot = 'digraph { abc -> edfAAAAA \n abc [shape=box] } ' svg = dot_to_svg({"dot" : dot}) result = svg_to_png({"svg": svg }) png = result['image'] Show_Img.from_svg_string(png)
def issue(self,issue_id): #print('getting screenshot of issue {0} from jira'.format(issue_id)) from IPython.display import display_html jira_web = Lambda('osbot_browser.lambdas.jira_web') payload = {'issue_id': issue_id} png_data = jira_web.invoke(payload) html = '<img style="border:1px solid black" align="left" src="data:image/png;base64,{}"/>'.format(png_data) display_html(html, raw=True)
def __init__(self, lambda_name=None, delete_on_exit=True): self.lambda_name = lambda_name or "temp_lambda_{0}".format(random_string_and_numbers()) self.aws_lambda = Lambda(self.lambda_name) self.tmp_folder = Temp_Folder_With_Lambda_File(self.lambda_name).create_temp_file() self.role_arn = Temp_Aws_Roles().for_lambda_invocation__role_arn() # todo: refactor to have option to create the role programatically (needs feature to wait for role to be available) self.create_log = None self.delete_on_exit = delete_on_exit self.s3_bucket = AWS_Config().lambda_s3_bucket() self.s3_key = 'unit_tests/lambdas/{0}.zip'.format(self.lambda_name) self.s3 = self.aws_lambda.s3()