From 652f43cb69950306b70acd5609362305d4de0777 Mon Sep 17 00:00:00 2001 From: Adel Gaznanov Date: Wed, 28 Jan 2026 19:26:51 +0300 Subject: [PATCH 1/4] feat: implement lab01 devops info service --- app_python/.gitignore | 11 + app_python/README.md | 122 ++++++++ app_python/app.py | 123 ++++++++ app_python/docs/LAB01.md | 271 ++++++++++++++++++ .../docs/screenshots/01-main-endpoint.png | Bin 0 -> 41552 bytes .../docs/screenshots/02-health-check.png | Bin 0 -> 11635 bytes .../docs/screenshots/03-formatted-output.png | Bin 0 -> 165939 bytes app_python/requirements.txt | 1 + app_python/tests/__init__.py | 0 9 files changed, 528 insertions(+) create mode 100644 app_python/.gitignore create mode 100644 app_python/README.md create mode 100644 app_python/app.py create mode 100644 app_python/docs/LAB01.md create mode 100644 app_python/docs/screenshots/01-main-endpoint.png create mode 100644 app_python/docs/screenshots/02-health-check.png create mode 100644 app_python/docs/screenshots/03-formatted-output.png create mode 100644 app_python/requirements.txt create mode 100644 app_python/tests/__init__.py diff --git a/app_python/.gitignore b/app_python/.gitignore new file mode 100644 index 0000000000..112fedbb3c --- /dev/null +++ b/app_python/.gitignore @@ -0,0 +1,11 @@ +# Python +__pycache__/ +*.py[cod] +venv/ +*.log + +# IDE +.idea/ + +# OS +.DS_Store \ No newline at end of file diff --git a/app_python/README.md b/app_python/README.md new file mode 100644 index 0000000000..59a0779019 --- /dev/null +++ b/app_python/README.md @@ -0,0 +1,122 @@ +# DevOps Info Service + +## Overview + +DevOps Info Service is a lightweight HTTP service that exposes runtime, system, and application information. The service is suitable for containerization, health monitoring, and deployment in orchestration platforms such as Kubernetes. + +The application provides: + +* Service metadata (name, version, framework) +* System information (OS, architecture, CPU count, Python version) +* Runtime information (uptime, current time) +* Health check endpoint for monitoring + +--- + +## Prerequisites + +* Python **3.10+** (recommended: 3.12 or newer) +* pip (Python package manager) +* Virtual environment support (`venv`) + +To check the Python version: + +```bash +python3 --version +``` + +--- + +## Installation + +Clone the repository and navigate to the project directory: + +```bash +cd app_python +``` + +Create and activate a virtual environment: + +```bash +python3 -m venv venv +source venv/bin/activate +``` + +Install dependencies: + +```bash +pip install -r requirements.txt +``` + +--- + +## Running the Application + +Run with default configuration: + +```bash +python3 app.py +``` + +Run with custom configuration: + +```bash +PORT=8080 python3 app.py +HOST=127.0.0.1 PORT=3000 python3 app.py +``` + +By default, the service will be available at: + +``` +http://localhost:5000 +``` + +--- + +## API Endpoints + +### GET / + +Returns service, system, runtime, and request information. + +Example: + +```bash +curl http://localhost:5000/ +``` + +### GET /health + +Health check endpoint for monitoring and readiness probes. + +Example: + +```bash +curl http://localhost:5000/health +``` + +--- + +## Configuration + +The application can be configured using environment variables. + +| Variable | Description | Default | +| -------- | ------------------- | ------- | +| HOST | Server bind address | 0.0.0.0 | +| PORT | Server port | 5000 | +| DEBUG | Enable debug mode | False | + +Example: + +```bash +DEBUG=true PORT=8080 python3 app.py +``` + +--- + +## Notes + +* This project follows Python best practices and PEP 8 style guidelines. +* Dependencies are pinned for reproducibility. +* The `/health` endpoint is suitable for Kubernetes liveness and readiness probes. diff --git a/app_python/app.py b/app_python/app.py new file mode 100644 index 0000000000..7da396ac02 --- /dev/null +++ b/app_python/app.py @@ -0,0 +1,123 @@ +""" +DevOps Info Service +Main application module +""" + +import os +import socket +import platform +import logging +from datetime import datetime, timezone +from flask import Flask, jsonify, request + +app = Flask(__name__) + +# Configuration +HOST = os.getenv("HOST", "0.0.0.0") +PORT = int(os.getenv("PORT", 5000)) +DEBUG = os.getenv("DEBUG", "False").lower() == "true" + +SERVICE_NAME = "devops-info-service" +SERVICE_VERSION = "1.0.0" +SERVICE_DESCRIPTION = "DevOps course info service" +FRAMEWORK = "Flask" + +# Logging +logging.basicConfig( + level=logging.INFO, + format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' +) +logger = logging.getLogger(__name__) + +logger.info('Application starting...') + +# Application start time +start_time = datetime.now() + + +def get_uptime(): + delta = datetime.now() - start_time + seconds = int(delta.total_seconds()) + hours = seconds // 3600 + minutes = (seconds % 3600) // 60 + return { + 'seconds': seconds, + 'human': f"{hours} hours, {minutes} minutes" + } + + +@app.before_request +def log_request(): + logger.info(f"Request: {request.method} {request.path}") + +# Routes + + +@app.route("/", methods=["GET"]) +def index(): + """Main endpoint - service and system information.""" + uptime = get_uptime() + + response = { + "service": { + "name": SERVICE_NAME, + "version": SERVICE_VERSION, + "description": SERVICE_DESCRIPTION, + "framework": FRAMEWORK + }, + "system": { + "hostname": socket.gethostname(), + "platform": platform.system(), + "platform_version": platform.version(), + "architecture": platform.machine(), + "cpu_count": os.cpu_count(), + "python_version": platform.python_version() + }, + "runtime": { + "uptime_seconds": uptime["seconds"], + "uptime_human": uptime["human"], + "current_time": datetime.now(timezone.utc).isoformat(), + "timezone": "UTC" + }, + "request": { + "client_ip": request.remote_addr, + "user_agent": request.headers.get('User-Agent'), + "method": request.method, + "path": request.path + }, + "endpoints": [ + {"path": "/", "method": "GET", "description": "Service information"}, + {"path": "/health", "method": "GET", "description": "Health check"} + ] + } + + return jsonify(response) + + +@app.route("/health", methods=["GET"]) +def health(): + return jsonify({ + "status": "healthy", + "timestamp": datetime.now(timezone.utc).isoformat(), + "uptime_seconds": get_uptime()["seconds"] + }) + + +@app.errorhandler(404) +def not_found(error): + return jsonify({ + 'error': 'Not Found', + 'message': 'Endpoint does not exist' + }), 404 + + +@app.errorhandler(500) +def internal_error(error): + return jsonify({ + 'error': 'Internal Server Error', + 'message': 'An unexpected error occurred' + }), 500 + + +if __name__ == "__main__": + app.run(host=HOST, port=PORT, debug=DEBUG) diff --git a/app_python/docs/LAB01.md b/app_python/docs/LAB01.md new file mode 100644 index 0000000000..caad90ef69 --- /dev/null +++ b/app_python/docs/LAB01.md @@ -0,0 +1,271 @@ +# LAB01 — DevOps Info Service + +## 1. Framework Selection + +### Selected Framework: **Flask** + +### Justification + +* Flask is lightweight and minimal, making it easy to understand and maintain. +* The framework provides full control over application behavior without hidden abstractions. +* Routing as in Ktor-framework which I have experience with + +The goal of this lab is to demonstrate DevOps principles rather than complex backend logic, therefore Flask is an optimal choice. + +### Framework Comparison + +| Framework | Pros | Cons | +| --------- | ---------------------------------- | --------------------------------- | +| Flask | Simple, lightweight, easy to learn | Limited built-in features | +| FastAPI | Async, auto-generated docs, modern | Higher complexity, async overhead | +| Django | Full-featured, ORM, admin panel | Heavyweight, steep learning curve | + +--- + +## 2. Best Practices Applied + +### 2.1 Clean Code Organization + +**Practices:** + +* Clear and descriptive function names +* Grouped imports according to PEP 8 +* Minimal and meaningful comments +* Constants defined at module level + +**Example:** + +```python +""" +DevOps Info Service +Main application module +""" + +import os +import socket +import platform +import logging +from datetime import datetime, timezone +from flask import Flask, jsonify, request +``` + +```python +def get_uptime(): + delta = datetime.now() - start_time + ... + +def log_request(): + logger.info(f"Request: {request.method} {request.path}") + +@app.route("/", methods=["GET"]) +def index(): + """Main endpoint - service and system information.""" + ... + +@app.route("/health", methods=["GET"]) +def health(): + ... +``` + +**Importance:** +Clean code improves readability, maintainability, and reduces onboarding time for new developers. + +--- + +### 2.2 Error Handling + +Custom error handlers were implemented for common HTTP errors. + +**Example:** + +```python +@app.errorhandler(404) +def not_found(error): + return jsonify({ + 'error': 'Not Found', + 'message': 'Endpoint does not exist' + }), 404 + + +@app.errorhandler(500) +def internal_error(error): + return jsonify({ + 'error': 'Internal Server Error', + 'message': 'An unexpected error occurred' + }), 500 +``` + +**Importance:** +Graceful error handling provides consistent API responses and improves client-side debugging. + +--- + +### 2.3 Logging + +Application logging is implemented using Python’s built-in `logging` module. Each incoming request is logged. + +**Example:** + +```python +# Logging +logging.basicConfig( + level=logging.INFO, + format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' +) +logger = logging.getLogger(__name__) + +logger.info('Application starting...') + +@app.before_request +def log_request(): + logger.info(f"Request: {request.method} {request.path}") +``` + +**Importance:** +Logging is essential for monitoring, debugging, and observability in production environments. + +--- + +### 2.4 Environment-Based Configuration + +The application behavior can be configured using environment variables. + +**Example:** + +```python +HOST = os.getenv("HOST", "0.0.0.0") +PORT = int(os.getenv("PORT", 5000)) +DEBUG = os.getenv("DEBUG", "False").lower() == "true" +``` + +**Importance:** +Environment-based configuration is a core DevOps principle and allows seamless deployment across environments. + +--- + +## 3. API Documentation + +### GET / + +Returns service, system, runtime, and request information. + +**Request:** + +```bash +curl http://localhost:5000/ +``` + +**Response (excerpt):** + +```json +{ + "endpoints": [ + { + "description": "Service information", + "method": "GET", + "path": "/" + }, + { + "description": "Health check", + "method": "GET", + "path": "/health" + } + ], + "request": { + "client_ip": "127.0.0.1", + "method": "GET", + "path": "/", + "user_agent": "curl/7.81.0" + }, + "runtime": { + "current_time": "2026-01-28T15:40:35.714395+00:00", + "timezone": "UTC", + "uptime_human": "0 hours, 0 minutes", + "uptime_seconds": 4 + }, + "service": { + "description": "DevOps course info service", + "framework": "Flask", + "name": "devops-info-service", + "version": "1.0.0" + }, + "system": { + "architecture": "x86_64", + "cpu_count": 4, + "hostname": "californiawrld", + "platform": "Linux", + "platform_version": "#91~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Thu Nov 20 15:20:45 UTC 2", + "python_version": "3.10.12" + } +} +``` + +--- + +### GET /health + +Health check endpoint used for monitoring. + +**Request:** + +```bash +curl http://localhost:5000/health +``` + +**Response:** + +```json +{ + "status": "healthy", + "timestamp": "2026-01-28T15:43:11.421546+00:00", + "uptime_seconds": 160 +} +``` + +--- + +## Testing Commands + +Run the application: + +```bash +python3 app.py +``` + +Test endpoints: + +```bash +curl http://localhost:5000/ +curl http://localhost:5000/health +``` + +Run with custom configuration: + +```bash +PORT=8080 python app.py +``` + +--- + +## 4. Testing Evidence + +The following screenshots are provided in `docs/screenshots/`: + +* **01-main-endpoint.png** — main endpoint JSON response +* **02-health-check.png** — health check response +* **03-formatted-output.png** — pretty-printed JSON output + +--- + +## 5. Challenges & Solutions + +### Challenge 1: Request Context Errors + +**Problem:** Attempted to access request data in each endpoint directly. + +**Solution:** Moved request logging into a `before_request` handler provided by Flask. + +## 6. GitHub Community +### Discovery & Bookmarking: +1. Star count indicates project popularity and community trust. Starred repos appear in your GitHub profile, showing your interests +2. Learn from others' code and commits. See how experienced developers solve problems \ No newline at end of file diff --git a/app_python/docs/screenshots/01-main-endpoint.png b/app_python/docs/screenshots/01-main-endpoint.png new file mode 100644 index 0000000000000000000000000000000000000000..4f798ade906e087abafcbd9dd46131be11a4a61f GIT binary patch literal 41552 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%0AQFN52MzKk!e^W= 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 literal 0 HcmV?d00001 diff --git a/app_python/docs/screenshots/02-health-check.png b/app_python/docs/screenshots/02-health-check.png new file mode 100644 index 0000000000000000000000000000000000000000..9cfa89936ff465640ade6fe530db5ea3ad1524d4 GIT binary patch literal 11635 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 literal 0 HcmV?d00001 diff --git a/app_python/docs/screenshots/03-formatted-output.png b/app_python/docs/screenshots/03-formatted-output.png new file mode 100644 index 0000000000000000000000000000000000000000..a7ea185e8ad83ba1a8420d27676d31bf5fa86446 GIT binary patch literal 165939 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