Exemple #1
0
    def test_get_task_details(self):
        from osbot_aws.apis.Logs import Logs

        def find_starts(array, text):
            return [item for item in array if item.startswith(text)]

        def find_in(array, text):
            return [item for item in array if text in item]

        #build_id = 'OSBot-Jupyter:a553dda5-953a-41b8-ae91-e068cba4f56b'

        result = self.api.code_build.project_builds_ids(self.api.project_name)
        build_id = result.__next__()  # get last one
        build_info = self.api.code_build.build_info(build_id)
        group_name = build_info.get('logs').get('groupName')
        stream_name = build_info.get('logs').get('streamName')
        #Dev.pprint(group_name,stream_name)
        logs = Logs(group_name=group_name, stream_name=stream_name)

        messages = logs.messages()
        #ngrok_messages = find_starts(messages,'t=')
        ngrok_url = find_in(
            messages, 'name=command_line addr')[0].split('url=')[1].strip()
        jupyter_token = find_in(messages,
                                'token=')[0].split('token=')[1].strip()

        Dev.pprint("{0}?token={1}".format(ngrok_url, jupyter_token))
def run(event, context):
    group_name   = event.get('group_name' )
    stream_name  = event.get('stream_name')
    message      = event.get('message'    )
    logs         = Logs(group_name=group_name,
                        stream_name=stream_name)
    return logs.event_add(message)
    def test_lambda_write_cloud_watch(self):
        group_name      = '/aws/lambda/unit-tests/test_log_group'
        stream_name     = Misc.random_string_and_numbers(prefix='tmp_stream_')
        message         = 'this is a message sent from an lambda function'
        lambda_name     = 'osbot_aws.lambdas.dev.write_cloud_watch_log'
        logs            = Logs(group_name=group_name, stream_name=stream_name).create()
        lambda_obj      = Lambda_Package(lambda_name)

        payload = {'group_name': group_name, 'stream_name': stream_name, 'message': message}

        assert lambda_obj.invoke(payload).get('status') == 'ok'

        #sleep(0.8)
        # assert logs.messages() == ['this is a message sent from an lambda function']
        assert logs.group_delete() is True
Exemple #4
0
 def test_log_group_create_delete_exists_info(self):
     tmp_log_group = Misc.random_string_and_numbers(
         prefix='/unit-tests/test_log_group_')
     temp_logs = Logs(tmp_log_group, '')
     assert temp_logs.group_exists() is False
     assert temp_logs.group_create() is True
     assert temp_logs.group_exists() is True
     assert temp_logs.group_info().get('logGroupName') == tmp_log_group
     assert temp_logs.group_delete() == True
     assert temp_logs.group_exists() is False
    def delete_temp_logs(self):
        all_groups       = self.logs().groups_names()
        temp_ids         = ['temp_lambda', 'osbot']
        groups_to_delete = []
        for temp_id in temp_ids:
            groups_to_delete.extend(list_filter_contains(all_groups, temp_id))

        for group_to_delete in groups_to_delete:
            if Logs(group_name=group_to_delete).group_delete():
                print(f'deleted cloudwatch group: {group_to_delete}')
        return groups_to_delete
    def test_lambdas_cloud_watch_logs(self):
        with Temp_Lambda() as _:
            assert _.invoke() == 'hello None'
            log_name = '/aws/lambda/{0}'.format(_.name)
            logs = Logs(group_name=log_name)
            assert logs.group_exists() is True
            logs.stream_name = logs.streams()[0].get('logStreamName')

            sleep(
                1.0
            )  # wait for logs to be updated (0.5 has failed in CodeBuild)
            messages = logs.messages()
            assert len(messages) > 0
            assert 'START RequestId: ' in messages.pop()
 def logs(self):
     return Logs()
Exemple #8
0
    def _test_lambda_write_cloud_watch__with_asserts(self):
        group_name = '/unit-tests/test_log_group'
        stream_name = Misc.random_string_and_numbers(prefix='tmp_stream_')
        message = 'this is a message sent from an lambda function'
        lambda_name = 'osbot_aws.lambdas.dev.write_cloud_watch_log'
        log_group_arn = 'arn:aws:logs:eu-west-2:244560807427:log-group:{0}*'.format(
            group_name)
        policy_name = 'temp_policy_for_lambda_write_cloud_watch'
        role_name = 'temp_role_for_lambda_invocation'
        policy_actions = ['logs:PutLogEvents']

        logs = Logs(group_name=group_name, stream_name=stream_name)
        logs.group_create()
        logs.stream_create()

        iam_role = IAM(role_name=role_name)
        iam_policy = IAM_Policy(policy_name=policy_name)
        iam_policy.add_statement_allow(policy_actions, [log_group_arn])

        policy_arn = iam_policy.create(
            delete_before_create=True).get('policy_arn')

        assert iam_policy.exists() is True
        assert iam_role.role_exists() is True
        assert logs.group_exists() is True
        assert logs.stream_exists() is True
        assert set(iam_role.role_policies()) == {
            'AWSXrayWriteOnlyAccess', 'policy_temp_role_for_lambda_invocation'
        }

        iam_role.role_policy_attach(policy_arn)

        assert set(iam_role.role_policies()) == {
            'AWSXrayWriteOnlyAccess', 'policy_temp_role_for_lambda_invocation',
            'temp_policy_for_lambda_write_cloud_watch'
        }

        sleep(10)  # wait for AWS to propagate role update
        payload = {
            'group_name': group_name,
            'stream_name': stream_name,
            'message': message
        }
        lambda_obj = Lambda_Package(lambda_name)  #.update_with_root_folder()
        result = lambda_obj.invoke(payload)

        sleep(1)  # wait for Cloudwatch to update
        assert result.get('status') == 'ok'
        assert logs.messages() == [message]

        assert iam_policy.delete() is True
        assert logs.group_delete() is True
        assert logs.group_exists() is False
        assert set(iam_role.role_policies()) == {
            'AWSXrayWriteOnlyAccess', 'policy_temp_role_for_lambda_invocation'
        }
Exemple #9
0
 def build_log_messages(self):
     build_info = self.build_info()
     group_name = build_info.get('logs').get('groupName')
     stream_name = build_info.get('logs').get('streamName')
     logs = Logs(group_name=group_name, stream_name=stream_name)
     return logs.messages()
Exemple #10
0
 def setUp(self):
     self.logs = Logs(test_Logs.log_group, test_Logs.stream_name)
     self.logs.stream_create()
Exemple #11
0
class test_Logs(TestCase):

    log_group = '/unit-tests/test_log_group'
    stream_name = 'tmp_stream'
    logs = Logs(log_group, stream_name)
    delete_on_exit = True

    @classmethod
    def setUpClass(cls):
        if test_Logs.delete_on_exit:
            assert test_Logs.logs.group_create() is True

    @classmethod
    def tearDownClass(cls):
        if test_Logs.delete_on_exit:
            assert test_Logs.logs.group_delete() is True

    def setUp(self):
        self.logs = Logs(test_Logs.log_group, test_Logs.stream_name)
        self.logs.stream_create()

    def test_events(self):
        assert self.logs.events().get('events') == []
        message_1 = 'an message'
        message_2 = 'another message'
        result = self.logs.event_add(message_1)
        assert result.get('status') == 'ok'
        assert 'An error occurred (DataAlreadyAcceptedException)' in self.logs.event_add(
            'an message').get('data')
        assert self.logs.event_add(
            message_2, sequence_token=result.get('nextSequenceToken')).get(
                'status') == 'ok'
        max_attempts = 20
        sleep_for = 0.5
        for i in range(1, max_attempts):  # wait for log events to be processed
            if len(self.logs.events().get('events')) == 2:
                break
            sleep(sleep_for)
        assert len(self.logs.events().get('events')) == 2
        assert self.logs.messages() == [message_1, message_2]

    def test_log_group_create_delete_exists_info(self):
        tmp_log_group = Misc.random_string_and_numbers(
            prefix='/unit-tests/test_log_group_')
        temp_logs = Logs(tmp_log_group, '')
        assert temp_logs.group_exists() is False
        assert temp_logs.group_create() is True
        assert temp_logs.group_exists() is True
        assert temp_logs.group_info().get('logGroupName') == tmp_log_group
        assert temp_logs.group_delete() == True
        assert temp_logs.group_exists() is False

    def test_groups(self):
        assert len(list(self.logs.groups())) > 1
        assert len(self.logs.groups()) > 10

    def test_streams__exists_delete_create(self):
        assert self.logs.stream_exists(
        ) is True  # log stream is created by setUpClass
        assert self.logs.streams().pop().get(
            'logStreamName') == test_Logs.stream_name
        assert self.logs.stream_delete() is True
        assert self.logs.stream_delete() is False
        assert self.logs.streams() == []
        assert self.logs.stream_create() is True
        assert self.logs.stream_create() is False
Exemple #12
0
 def log_group(self):
     return Logs(group_name=f'/aws/lambda/{self.name}')