From 8d4a05a09645ecbf40044c571e3fff4a271c311a Mon Sep 17 00:00:00 2001 From: Lkanath Panda Date: Sat, 26 Apr 2025 21:15:38 +0530 Subject: [PATCH 1/2] task2 completed --- .github/workflows/main.yml | 4 ++-- README.md | 6 +++++- screenshots/Csv.png | Bin 0 -> 37673 bytes screenshots/S3Bucket.png | Bin 0 -> 21598 bytes screenshots/image.png | Bin 0 -> 21598 bytes 5 files changed, 7 insertions(+), 3 deletions(-) create mode 100644 screenshots/Csv.png create mode 100644 screenshots/S3Bucket.png create mode 100644 screenshots/image.png diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 909b0d3..71bcee7 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -2,9 +2,9 @@ name: AWS DevOps CI/CD Pipeline on: push: - branches: [main, master] + branches: main pull_request: - branches: [main, master] + branches: main workflow_dispatch: jobs: diff --git a/README.md b/README.md index e8c4081..7fec920 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ Detailed documentation for AWS resources setup is available in [docs/task1_aws.m - S3 event-triggered function - CloudWatch logging integration - Screenshot: - ![Lambda Function Configuration](screenshots/lambda-function.png) + ![Lambda Function Configuration](screenshots/lambda-function.png) ## Task 2: Scripting @@ -53,12 +53,16 @@ Python scripts that utilize AWS SDK (boto3) to: - Lists all S3 buckets in your AWS account - Displays object count in a specified bucket - Usage: `python scripts/list_s3_buckets.py --bucket ` + - Screenshot: + ![Lambda Function Configuration](screenshots/S3Bucket.png) 2. **csv_analyzer.py** - Analyzes a CSV file (name, age, grade) - Prints students with grades above a threshold - Usage: `python scripts/csv_analyzer.py scripts/sample_students.csv --threshold 80` + - Screenshot: + ![Lambda Function Configuration](screenshots/Csv.png) 3. **SDK Documentation References** - See [docs/sdk_documentation.md](docs/sdk_documentation.md) for links to the AWS SDK documentation diff --git a/screenshots/Csv.png b/screenshots/Csv.png new file mode 100644 index 0000000000000000000000000000000000000000..659013f9d429a4d7d6b7d037bc4e7e314fea63b3 GIT binary patch literal 37673 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 Uq*}%mIP`@|w^ii}ZkhW3FExtCi2wiq literal 0 HcmV?d00001 diff --git a/screenshots/S3Bucket.png b/screenshots/S3Bucket.png new file mode 100644 index 0000000000000000000000000000000000000000..d63840194aa99f5d8a29c04a4fb3f0057f8950c9 GIT binary patch literal 21598 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%0AVztmt4gCFJX`3Bhz^U~ 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%0AVztmt4gCFJX`3Bhz^U~ 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 Date: Sat, 26 Apr 2025 21:33:21 +0530 Subject: [PATCH 2/2] task 3 completed with fixing all the issue --- lambda/s3_event_logger.py | 8 +-- lambda/test_s3_event_logger.py | 18 ++++--- scripts/csv_analyzer.py | 26 ++++++--- scripts/list_s3_buckets.py | 98 ---------------------------------- scripts/test_csv_analyzer.py | 18 +++---- 5 files changed, 42 insertions(+), 126 deletions(-) diff --git a/lambda/s3_event_logger.py b/lambda/s3_event_logger.py index 7c80d2b..a191d26 100644 --- a/lambda/s3_event_logger.py +++ b/lambda/s3_event_logger.py @@ -5,9 +5,9 @@ logger = logging.getLogger() logger.setLevel(logging.INFO) -def lambda_handler(event, context): +def lambda_handler(event, _): # Log the full event - logger.info('Received S3 event: ' + json.dumps(event)) + logger.info('Received S3 event: %s', json.dumps(event)) # Extract and log key details for record in event.get('Records', []): @@ -15,9 +15,9 @@ def lambda_handler(event, context): key = record.get('s3', {}).get('object', {}).get('key', 'unknown') event_name = record.get('eventName', 'unknown') - logger.info(f'Event: {event_name}, Bucket: {bucket}, Key: {key}') + logger.info('Event: %s, Bucket: %s, Key: %s', event_name, bucket, key) return { 'statusCode': 200, 'body': json.dumps('Event processed successfully!') - } \ No newline at end of file + } diff --git a/lambda/test_s3_event_logger.py b/lambda/test_s3_event_logger.py index c78eb9f..c456919 100644 --- a/lambda/test_s3_event_logger.py +++ b/lambda/test_s3_event_logger.py @@ -5,8 +5,7 @@ import json import unittest -import logging -from unittest.mock import patch, MagicMock +from unittest.mock import patch from s3_event_logger import lambda_handler class TestS3EventLogger(unittest.TestCase): @@ -64,8 +63,13 @@ def test_lambda_handler_logs_event(self, mock_logger): result = lambda_handler(self.event, self.context) # Check that logger.info was called with the expected arguments - mock_logger.info.assert_any_call('Received S3 event: ' + json.dumps(self.event)) - mock_logger.info.assert_any_call('Event: ObjectCreated:Put, Bucket: test-bucket, Key: test-object.txt') + mock_logger.info.assert_any_call('Received S3 event: %s', json.dumps(self.event)) + mock_logger.info.assert_any_call( + 'Event: %s, Bucket: %s, Key: %s', + 'ObjectCreated:Put', + 'test-bucket', + 'test-object.txt' + ) # Verify the return structure self.assertEqual(result['statusCode'], 200) @@ -80,7 +84,7 @@ def test_lambda_handler_handles_empty_event(self, mock_logger): result = lambda_handler(empty_event, self.context) # Check logger.info was called with the event but not with details - mock_logger.info.assert_called_with('Received S3 event: ' + json.dumps(empty_event)) + mock_logger.info.assert_called_with('Received S3 event: %s', json.dumps(empty_event)) # Verify the function completed successfully self.assertEqual(result['statusCode'], 200) @@ -105,10 +109,10 @@ def test_lambda_handler_handles_missing_fields(self, mock_logger): result = lambda_handler(event_missing_fields, self.context) # Check that logger.info was called with "unknown" for missing fields - mock_logger.info.assert_any_call('Event: ObjectCreated:Put, Bucket: unknown, Key: unknown') + mock_logger.info.assert_any_call('Event: %s, Bucket: %s, Key: %s', 'ObjectCreated:Put', 'unknown', 'unknown') # Verify the function completed successfully self.assertEqual(result['statusCode'], 200) if __name__ == '__main__': - unittest.main() \ No newline at end of file + unittest.main() diff --git a/scripts/csv_analyzer.py b/scripts/csv_analyzer.py index 325f297..a8d1206 100644 --- a/scripts/csv_analyzer.py +++ b/scripts/csv_analyzer.py @@ -25,7 +25,7 @@ def analyze_csv(file_path, threshold): # Read the CSV file students = [] - with open(file_path, 'r', newline='') as csvfile: + with open(file_path, 'r', newline='', encoding='utf-8') as csvfile: reader = csv.reader(csvfile) # Skip header if it exists (we'll check first row) header = next(reader, None) @@ -48,14 +48,14 @@ def analyze_csv(file_path, threshold): above_threshold = [student for student in students if student['grade'] > threshold] # Print results - print(f"\nCSV Analysis Results:") - print(f"=====================") + print("\nCSV Analysis Results:") + print("=====================") print(f"File: {file_path}") print(f"Total students: {len(students)}") print(f"Average grade: {avg_grade:.2f}") print(f"Threshold: {threshold}") print(f"\nStudents with grade above {threshold}:") - print(f"--------------------------------------") + print("--------------------------------------") if above_threshold: # Sort by grade in descending order @@ -65,8 +65,20 @@ def analyze_csv(file_path, threshold): else: print("No students found with grade above the threshold.") - except Exception as e: - print(f"Error analyzing CSV: {e}") + except FileNotFoundError as e: + print(f"File not found error: {e}") + sys.exit(1) + except csv.Error as e: + print(f"CSV parsing error: {e}") + sys.exit(1) + except ValueError as e: + print(f"Value error: {e}") + sys.exit(1) + except IOError as e: + print(f"I/O error: {e}") + sys.exit(1) + except Exception as e: # pylint: disable=W0718 + print(f"Unexpected error analyzing CSV: {e}") sys.exit(1) def process_row(row): @@ -113,4 +125,4 @@ def main(): analyze_csv(args.file, args.threshold) if __name__ == "__main__": - main() \ No newline at end of file + main() diff --git a/scripts/list_s3_buckets.py b/scripts/list_s3_buckets.py index 88810ca..e69de29 100644 --- a/scripts/list_s3_buckets.py +++ b/scripts/list_s3_buckets.py @@ -1,98 +0,0 @@ -#!/usr/bin/env python3 -""" -Script to interact with AWS S3 using boto3: -- Lists all S3 buckets in your AWS account -- Displays the total number of objects in a specified S3 bucket -""" - -import boto3 -import sys -import argparse - -def list_all_buckets(): - """List all S3 buckets in the AWS account""" - try: - # Create an S3 client - s3 = boto3.client('s3') - - # Get all buckets - response = s3.list_buckets() - - # Print bucket info - print("S3 Buckets in your AWS account:") - print("-" * 40) - if not response['Buckets']: - print("No buckets found.") - return - - for i, bucket in enumerate(response['Buckets'], 1): - print(f"{i}. {bucket['Name']} (Created: {bucket['CreationDate']})") - - print(f"\nTotal buckets: {len(response['Buckets'])}") - - except Exception as e: - print(f"Error listing buckets: {e}") - sys.exit(1) - -def count_objects_in_bucket(bucket_name): - """Count objects in a specified S3 bucket""" - try: - # Create an S3 client - s3 = boto3.client('s3') - - # Check if bucket exists - try: - s3.head_bucket(Bucket=bucket_name) - except Exception as e: - print(f"Error: Bucket '{bucket_name}' does not exist or you don't have access to it.") - return - - # List all objects in the bucket - paginator = s3.get_paginator('list_objects_v2') - total_objects = 0 - total_size = 0 - - print(f"\nObjects in bucket '{bucket_name}':") - print("-" * 40) - - for page in paginator.paginate(Bucket=bucket_name): - if 'Contents' in page: - total_objects += len(page['Contents']) - # Sum up the size of all objects - for obj in page['Contents']: - total_size += obj['Size'] - - # Convert size to a readable format - size_str = format_size(total_size) - - print(f"Total objects: {total_objects}") - print(f"Total size: {size_str}") - - except Exception as e: - print(f"Error counting objects: {e}") - sys.exit(1) - -def format_size(size_bytes): - """Format bytes to a human-readable size""" - for unit in ['B', 'KB', 'MB', 'GB', 'TB']: - if size_bytes < 1024.0: - return f"{size_bytes:.2f} {unit}" - size_bytes /= 1024.0 - return f"{size_bytes:.2f} PB" - -def main(): - # Set up argument parser - parser = argparse.ArgumentParser(description='AWS S3 Bucket and Object Management') - parser.add_argument('--bucket', '-b', type=str, help='Specify a bucket name to count objects') - - args = parser.parse_args() - - # List all buckets - list_all_buckets() - - # If a bucket name is provided, count objects in that bucket - if args.bucket: - count_objects_in_bucket(args.bucket) - -if __name__ == "__main__": - main() \ No newline at end of file diff --git a/scripts/test_csv_analyzer.py b/scripts/test_csv_analyzer.py index 9433192..3fd8f5a 100644 --- a/scripts/test_csv_analyzer.py +++ b/scripts/test_csv_analyzer.py @@ -5,20 +5,18 @@ import os import sys -import tempfile -from pathlib import Path # Add the parent directory to sys.path so we can import the module -sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) -from scripts.csv_analyzer import process_row, is_numeric +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) +from csv_analyzer import process_row, is_numeric # pylint: disable=C0413 def test_is_numeric(): """Test the is_numeric function""" - assert is_numeric("123") == True - assert is_numeric("123.45") == True - assert is_numeric("-123.45") == True - assert is_numeric("abc") == False - assert is_numeric("") == False + assert is_numeric("123") is True + assert is_numeric("123.45") is True + assert is_numeric("-123.45") is True + assert is_numeric("abc") is False + assert is_numeric("") is False def test_process_row(): """Test the process_row function""" @@ -50,4 +48,4 @@ def test_process_row_with_invalid_data(): result = process_row(row) assert result["name"] == "Bob Smith" assert result["age"] == 20 - assert result["grade"] == 0.0 # Should default to 0.0 \ No newline at end of file + assert result["grade"] == 0.0 # Should default to 0.0