From 46842448e97d3dd6f619e0214bc3cfbbbd2ba56b Mon Sep 17 00:00:00 2001 From: LocalT0aster Dan <90502400+LocalT0aster@users.noreply.github.com> Date: Thu, 29 Jan 2026 00:09:53 +0300 Subject: [PATCH 01/21] Lab01 Completed (#1) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * lab01 python app done * lab01 docs and small fixes * forgot about 2.4 💀 * lab01 go app implemented --- .gitattributes | 99 ++++++++++++ app_go/.gitignore | 33 ++++ app_go/README.md | 30 ++++ app_go/build.sh | 2 + app_go/docs/GO.md | 10 ++ app_go/docs/LAB01.md | 42 +++++ app_go/docs/img/lab01go.png | Bin 0 -> 278577 bytes app_go/go.mod | 3 + app_go/main.go | 286 ++++++++++++++++++++++++++++++++++ app_python/.gitattributes | 30 ++++ app_python/.gitignore | 217 ++++++++++++++++++++++++++ app_python/README.md | 39 +++++ app_python/app.py | 184 ++++++++++++++++++++++ app_python/docs/LAB01.md | 191 +++++++++++++++++++++++ app_python/docs/img/lab01.png | Bin 0 -> 353760 bytes app_python/requirements.txt | 12 ++ app_python/tests/__init__.py | 0 17 files changed, 1178 insertions(+) create mode 100644 .gitattributes create mode 100644 app_go/.gitignore create mode 100644 app_go/README.md create mode 100644 app_go/build.sh create mode 100644 app_go/docs/GO.md create mode 100644 app_go/docs/LAB01.md create mode 100644 app_go/docs/img/lab01go.png create mode 100644 app_go/go.mod create mode 100644 app_go/main.go create mode 100644 app_python/.gitattributes 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/img/lab01.png create mode 100644 app_python/requirements.txt create mode 100644 app_python/tests/__init__.py diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000000..fe8a581226 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,99 @@ +# https://github.com/gitattributes/gitattributes/blob/fddc586cf0f10ec4485028d0d2dd6f73197a4258/Common.gitattributes +# Common settings that generally should always be used with your language specific settings + +# Auto detect text files and perform LF normalization +* text=auto + +# +# The above will handle all files NOT found below +# + +# Documents +*.bibtex text diff=bibtex +*.doc diff=astextplain +*.DOC diff=astextplain +*.docx diff=astextplain +*.DOCX diff=astextplain +*.dot diff=astextplain +*.DOT diff=astextplain +*.pdf diff=astextplain +*.PDF diff=astextplain +*.rtf diff=astextplain +*.RTF diff=astextplain +*.md text diff=markdown +*.mdx text diff=markdown +*.tex text diff=tex +*.adoc text +*.textile text +*.mustache text +*.csv text eol=crlf +*.tab text +*.tsv text +*.txt text +*.sql text +*.epub diff=astextplain + +# Graphics +*.png binary +*.jpg binary +*.jpeg binary +*.gif binary +*.tif binary +*.tiff binary +*.ico binary +# SVG treated as text by default. +*.svg text +# If you want to treat it as binary, +# use the following line instead. +# *.svg binary +*.eps binary + +# Scripts +*.bash text eol=lf +*.fish text eol=lf +*.ksh text eol=lf +*.sh text eol=lf +*.zsh text eol=lf +# These are explicitly windows files and should use crlf +*.bat text eol=crlf +*.cmd text eol=crlf +*.ps1 text eol=crlf + +# Serialisation +*.json text +*.toml text +*.xml text +*.yaml text +*.yml text + +# Archives +*.7z binary +*.bz binary +*.bz2 binary +*.bzip2 binary +*.gz binary +*.lz binary +*.lzma binary +*.rar binary +*.tar binary +*.taz binary +*.tbz binary +*.tbz2 binary +*.tgz binary +*.tlz binary +*.txz binary +*.xz binary +*.Z binary +*.zip binary +*.zst binary + +# Text files where line endings should be preserved +*.patch -text + +# +# Exclude files from exporting +# + +.gitattributes export-ignore +.gitignore export-ignore +.gitkeep export-ignore diff --git a/app_go/.gitignore b/app_go/.gitignore new file mode 100644 index 0000000000..add20bc5eb --- /dev/null +++ b/app_go/.gitignore @@ -0,0 +1,33 @@ +# https://github.com/github/gitignore/blob/53fee13f20a05efc93ef4edcad0c62863520e268/Go.gitignore +# If you prefer the allow list template instead of the deny list, see community template: +# https://github.com/github/gitignore/blob/main/community/Golang/Go.AllowList.gitignore +# +# Binaries for programs and plugins +*.exe +*.exe~ +*.dll +*.so +*.dylib + +# Test binary, built with `go test -c` +*.test + +# Code coverage profiles and other test artifacts +*.out +coverage.* +*.coverprofile +profile.cov + +# Dependency directories (remove the comment below to include it) +# vendor/ + +# Go workspace file +go.work +go.work.sum + +# env file +.env + +# Editor/IDE +.idea/ +.vscode/ diff --git a/app_go/README.md b/app_go/README.md new file mode 100644 index 0000000000..22a27fa787 --- /dev/null +++ b/app_go/README.md @@ -0,0 +1,30 @@ +# DevOps Info Service (Go) + +## Overview +Simple Go web service that exposes system/runtime details and a health check. + +## Prerequisites +- Go 1.25+ + +## Build +```bash +go build -o devops-info-service.out . +``` + +## Run +```bash +./devops-info-service.out +# Or with custom config +HOST=127.0.0.1 PORT=8080 ./devops-info-service.out +``` + +## Endpoints +- `GET /` - service + system + runtime + request info +- `GET /health` - health check + +## Configuration + +| Variable | Default | Description | +| --- | --- | --- | +| `HOST` | `0.0.0.0` | Bind address for the server | +| `PORT` | `5000` | Port to listen on | diff --git a/app_go/build.sh b/app_go/build.sh new file mode 100644 index 0000000000..2832311420 --- /dev/null +++ b/app_go/build.sh @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +go build -o devops-info-service.out . diff --git a/app_go/docs/GO.md b/app_go/docs/GO.md new file mode 100644 index 0000000000..3f4073e0d8 --- /dev/null +++ b/app_go/docs/GO.md @@ -0,0 +1,10 @@ +# Go Language Justification + +## Why Go + +I chose Go because it produces small, static binaries, compiles quickly, and has a minimal standard library that already covers HTTP servers. That makes it a good fit for a tiny service and for multi‑stage Docker builds later in the course. + +## Tradeoffs + +- **Pros:** fast compile/run, simple deployment, good concurrency model, no runtime dependency chain. +- **Cons:** less dynamic than Python for quick iteration, and JSON struct definitions add some boilerplate. diff --git a/app_go/docs/LAB01.md b/app_go/docs/LAB01.md new file mode 100644 index 0000000000..d80e7b00b9 --- /dev/null +++ b/app_go/docs/LAB01.md @@ -0,0 +1,42 @@ +# LAB01 — DevOps Info Service (Go) + +## Implementation Overview + +This Go version mirrors the Python service and exposes the same two endpoints using the standard `net/http` package. + +### Endpoints + +- `GET /` returns service, system, runtime, request info, and a list of endpoints. +- `GET /health` returns a health status, timestamp, and uptime in seconds. + +### Runtime Behavior + +- **Uptime:** computed from a `startTime` set at process start. +- **System info:** hostname via `os.Hostname`, OS/arch via `runtime`. +- **Request info:** client IP from `X-Forwarded-For` or `RemoteAddr`. +- **Errors:** JSON 404 for unknown paths and JSON 500 on panics (recovery middleware). + +## Build & Run + +```bash +go build -o devops-info-service.out . +./devops-info-service.out +# Custom config +HOST=127.0.0.1 PORT=8080 ./devops-info-service.out +``` + +## API Examples + +```bash +curl -sS http://127.0.0.1:5000/ | jq +curl -sS http://127.0.0.1:5000/health | jq +``` + +## Notes + +- `python_version` in the JSON is populated with the Go runtime version to keep the output shape identical to the Python app. +- The advertised endpoint list is a static slice to match the Python output. + +## Screenshot + +![Screenshot](img/lab01go.png) \ No newline at end of file diff --git a/app_go/docs/img/lab01go.png b/app_go/docs/img/lab01go.png new file mode 100644 index 0000000000000000000000000000000000000000..42652a163c8696676fea868e21f708372ed8a02b GIT binary patch literal 278577 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

~+K<}37~89?1!Vl}B6S%& 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

sI_$lDU%YsEw`h7+Xzkt0779LbG5 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

Xsmul-H^b=tl3W}`YK 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: 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 literal 0 HcmV?d00001 diff --git a/app_go/go.mod b/app_go/go.mod new file mode 100644 index 0000000000..ed5d7b4f3e --- /dev/null +++ b/app_go/go.mod @@ -0,0 +1,3 @@ +module example.com/devops-info-service + +go 1.25 diff --git a/app_go/main.go b/app_go/main.go new file mode 100644 index 0000000000..194aa657fc --- /dev/null +++ b/app_go/main.go @@ -0,0 +1,286 @@ +// DevOps Info Service in Go. +package main + +import ( + "encoding/json" + "fmt" + "log" + "net" + "net/http" + "os" + "runtime" + "strings" + "time" +) + +const ( + serviceName = "devops-info-service" + serviceVersion = "1.0.0" + serviceDescription = "DevOps course info service" + serviceFramework = "Go net/http" +) + +type ServiceInfo struct { + Name string `json:"name"` + Version string `json:"version"` + Description string `json:"description"` + Framework string `json:"framework"` +} + +type SystemInfo struct { + Hostname string `json:"hostname"` + Platform string `json:"platform"` + PlatformVersion string `json:"platform_version"` + Architecture string `json:"architecture"` + CPUCount int `json:"cpu_count"` + PythonVersion string `json:"python_version"` +} + +type UptimeInfo struct { + Seconds int64 `json:"seconds"` + Human string `json:"human"` +} + +type RequestInfo struct { + ClientIP string `json:"client_ip"` + UserAgent string `json:"user_agent"` + Method string `json:"method"` + Path string `json:"path"` +} + +type EndpointInfo struct { + Path string `json:"path"` + Method string `json:"method"` + Description string `json:"description"` +} + +type RootResponse struct { + Service ServiceInfo `json:"service"` + System SystemInfo `json:"system"` + Runtime UptimeInfo `json:"runtime"` + Request RequestInfo `json:"request"` + Endpoints []EndpointInfo `json:"endpoints"` +} + +type HealthResponse struct { + Status string `json:"status"` + Timestamp string `json:"timestamp"` + UptimeSeconds int64 `json:"uptime_seconds"` +} + +var ( + // startTime is used for uptime calculations. + startTime = time.Now().UTC() + // endpoints is a static list used to mirror the Python app output. + endpoints = []EndpointInfo{ + {Path: "/", Method: http.MethodGet, Description: "Service information."}, + {Path: "/health", Method: http.MethodGet, Description: "Health check endpoint."}, + } +) + +// getServiceInfo returns static service metadata. +func getServiceInfo() ServiceInfo { + return ServiceInfo{ + Name: serviceName, + Version: serviceVersion, + Description: serviceDescription, + Framework: serviceFramework, + } +} + +// getSystemInfo returns host and runtime information. +func getSystemInfo() SystemInfo { + hostname, err := os.Hostname() + if err != nil { + hostname = "unknown" + } + + return SystemInfo{ + Hostname: hostname, + Platform: platformName(), + PlatformVersion: platformVersion(), + Architecture: runtime.GOARCH, + CPUCount: runtime.NumCPU(), + PythonVersion: runtime.Version(), + } +} + +// platformName maps GOOS to a human-readable name. +func platformName() string { + switch runtime.GOOS { + case "linux": + return "Linux" + case "windows": + return "Windows" + case "darwin": + return "Darwin" + default: + return runtime.GOOS + } +} + +// platformVersion attempts to return a friendly OS version. +func platformVersion() string { + switch runtime.GOOS { + case "linux": + if pretty := linuxPrettyName(); pretty != "" { + return pretty + } + case "windows": + if osName := os.Getenv("OS"); osName != "" { + return osName + } + } + + return runtime.GOOS +} + +// linuxPrettyName reads PRETTY_NAME from /etc/os-release if available. +func linuxPrettyName() string { + data, err := os.ReadFile("/etc/os-release") + if err != nil { + return "" + } + + for _, line := range strings.Split(string(data), "\n") { + line = strings.TrimSpace(line) + if strings.HasPrefix(line, "PRETTY_NAME=") { + value := strings.TrimPrefix(line, "PRETTY_NAME=") + return strings.Trim(value, "\"") + } + } + + return "" +} + +// getUptime returns elapsed time since startTime. +func getUptime() UptimeInfo { + seconds := int64(time.Since(startTime).Seconds()) + hours := seconds / 3600 + minutes := (seconds % 3600) / 60 + + return UptimeInfo{ + Seconds: seconds, + Human: fmt.Sprintf("%d hours, %d minutes", hours, minutes), + } +} + +// getRequestInfo captures minimal request metadata. +func getRequestInfo(r *http.Request) RequestInfo { + return RequestInfo{ + ClientIP: clientIP(r), + UserAgent: r.Header.Get("User-Agent"), + Method: r.Method, + Path: r.URL.Path, + } +} + +// clientIP attempts to derive the client IP from proxy headers or RemoteAddr. +func clientIP(r *http.Request) string { + if forwarded := r.Header.Get("X-Forwarded-For"); forwarded != "" { + parts := strings.Split(forwarded, ",") + return strings.TrimSpace(parts[0]) + } + + host, _, err := net.SplitHostPort(r.RemoteAddr) + if err == nil { + return host + } + + return r.RemoteAddr +} + +// listEndpoints returns the advertised endpoints for the root response. +func listEndpoints() []EndpointInfo { + return endpoints +} + +// mainHandler serves GET /. +func mainHandler(w http.ResponseWriter, r *http.Request) { + payload := RootResponse{ + Service: getServiceInfo(), + System: getSystemInfo(), + Runtime: getUptime(), + Request: getRequestInfo(r), + Endpoints: listEndpoints(), + } + + writeJSON(w, http.StatusOK, payload) +} + +// healthHandler serves GET /health. +func healthHandler(w http.ResponseWriter, r *http.Request) { + payload := HealthResponse{ + Status: "healthy", + Timestamp: time.Now().UTC().Format("2006-01-02T15:04:05.000000-07:00"), + UptimeSeconds: getUptime().Seconds, + } + + writeJSON(w, http.StatusOK, payload) +} + +// notFound returns a JSON 404. +func notFound(w http.ResponseWriter, r *http.Request) { + writeJSON(w, http.StatusNotFound, map[string]string{ + "error": "Not Found", + "message": "Endpoint does not exist", + }) +} + +// router dispatches requests to handlers. +func router(w http.ResponseWriter, r *http.Request) { + switch { + case r.URL.Path == "/" && r.Method == http.MethodGet: + mainHandler(w, r) + case r.URL.Path == "/health" && r.Method == http.MethodGet: + healthHandler(w, r) + default: + notFound(w, r) + } +} + +// recoverMiddleware converts panics into JSON 500 responses. +func recoverMiddleware(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + defer func() { + if err := recover(); err != nil { + log.Printf("panic: %v", err) + writeJSON(w, http.StatusInternalServerError, map[string]string{ + "error": "Internal Server Error", + "message": "An unexpected error occurred", + }) + } + }() + log.Printf("Request: %s %s", r.Method, r.URL.Path) + next.ServeHTTP(w, r) + }) +} + +// writeJSON serializes a payload with the given status code. +func writeJSON(w http.ResponseWriter, status int, payload any) { + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(status) + if err := json.NewEncoder(w).Encode(payload); err != nil { + log.Printf("encode error: %v", err) + } +} + +func main() { + host := os.Getenv("HOST") + if host == "" { + host = "0.0.0.0" + } + + port := os.Getenv("PORT") + if port == "" { + port = "5000" + } + + addr := net.JoinHostPort(host, port) + log.Printf("Application starting on %s", addr) + + handler := recoverMiddleware(http.HandlerFunc(router)) + if err := http.ListenAndServe(addr, handler); err != nil { + log.Fatalf("server error: %v", err) + } +} diff --git a/app_python/.gitattributes b/app_python/.gitattributes new file mode 100644 index 0000000000..e48505a0fe --- /dev/null +++ b/app_python/.gitattributes @@ -0,0 +1,30 @@ +# https://github.com/gitattributes/gitattributes/blob/fddc586cf0f10ec4485028d0d2dd6f73197a4258/Python.gitattributes +# Basic .gitattributes for a python repo. + +# Source files +# ============ +*.pxd text diff=python +*.py text diff=python +*.py3 text diff=python +*.pyw text diff=python +*.pyx text diff=python +*.pyz text diff=python +*.pyi text diff=python + +# Binary files +# ============ +*.db binary +*.p binary +*.pkl binary +*.pickle binary +*.pyc binary export-ignore +*.pyo binary export-ignore +*.pyd binary + +# Jupyter notebook +*.ipynb text eol=lf + +# Note: .db, .p, and .pkl files are associated +# with the python modules ``pickle``, ``dbm.*``, +# ``shelve``, ``marshal``, ``anydbm``, & ``bsddb`` +# (among others). diff --git a/app_python/.gitignore b/app_python/.gitignore new file mode 100644 index 0000000000..c33866fe47 --- /dev/null +++ b/app_python/.gitignore @@ -0,0 +1,217 @@ +# https://github.com/github/gitignore/blob/53fee13f20a05efc93ef4edcad0c62863520e268/Python.gitignore +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[codz] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py.cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +# Pipfile.lock + +# UV +# Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# uv.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +# poetry.lock +# poetry.toml + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +# pdm recommends including project-wide configuration in pdm.toml, but excluding .pdm-python. +# https://pdm-project.org/en/latest/usage/project/#working-with-version-control +# pdm.lock +# pdm.toml +.pdm-python +.pdm-build/ + +# pixi +# Similar to Pipfile.lock, it is generally recommended to include pixi.lock in version control. +# pixi.lock +# Pixi creates a virtual environment in the .pixi directory, just like venv module creates one +# in the .venv directory. It is recommended not to include this directory in version control. +.pixi + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# Redis +*.rdb +*.aof +*.pid + +# RabbitMQ +mnesia/ +rabbitmq/ +rabbitmq-data/ + +# ActiveMQ +activemq-data/ + +# SageMath parsed files +*.sage.py + +# Environments +.env +.envrc +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +.idea/ + +# Abstra +# Abstra is an AI-powered process automation framework. +# Ignore directories containing user credentials, local state, and settings. +# Learn more at https://abstra.io/docs +.abstra/ + +# Visual Studio Code +# Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore +# that can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore +# and can be added to the global gitignore or merged into this file. However, if you prefer, +# you could uncomment the following to ignore the entire vscode folder +.vscode/ + +# Ruff stuff: +.ruff_cache/ + +# PyPI configuration file +.pypirc + +# Marimo +marimo/_static/ +marimo/_lsp/ +__marimo__/ + +# Streamlit +.streamlit/secrets.toml \ No newline at end of file diff --git a/app_python/README.md b/app_python/README.md new file mode 100644 index 0000000000..8c2642e984 --- /dev/null +++ b/app_python/README.md @@ -0,0 +1,39 @@ +# DevOps Info Service + +## Overview + +Small Flask web service that reports service metadata, system information, runtime uptime, and basic request details. Includes a simple health check endpoint for monitoring. + +## Prerequisites + +- Python 3.14 +- Dependencies from `requirements.txt` + +## Installation + +```bash +python -m venv .venv +source .venv/bin/activate +pip install -r requirements.txt +``` + +## Running the Application + +```bash +python app.py +# Or with custom config +PORT=8080 HOST=127.0.0.1 python app.py +``` + +## API Endpoints + +- `GET /` - Service and system information +- `GET /health` - Health check + +## Configuration + +| Variable | Default | Description | +| -------- | --------- | ---------------------------------------- | +| `HOST` | `0.0.0.0` | Bind address for the server | +| `PORT` | `5000` | Port to listen on | +| `DEBUG` | `False` | Enable Flask debug mode (`true`/`false`) | diff --git a/app_python/app.py b/app_python/app.py new file mode 100644 index 0000000000..ffce15ef58 --- /dev/null +++ b/app_python/app.py @@ -0,0 +1,184 @@ +""" +DevOps Info Service +Main application module +""" + +__version__ = "1.0.0" + +# Basics +import os +from datetime import datetime, timezone +import logging + +logging.basicConfig( + level=logging.INFO, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s" +) +logger = logging.getLogger(__name__) + +# Metadata gathering +from multiprocessing import cpu_count +import platform +import inspect + +# Web +import socket + +from flask import Flask, jsonify, request + +# Configuration +HOST = os.getenv("HOST", "0.0.0.0") +PORT = int(os.getenv("PORT", 5000)) +DEBUG = os.getenv("DEBUG", "False").lower() == "true" + +app = Flask(__name__) + + +def get_service_info() -> dict[str, str]: + """Collect info about service""" + return { + "name": "devops-info-service", + "version": __version__, + "description": "DevOps course info service", + "framework": "Flask", + } + + +def get_platform_info() -> dict[str, str | int]: + """Collect system information""" + + def _platform_version() -> str: + """Return a human-friendly OS version string.""" + match (platform.system().lower()): + case "linux": + return platform.freedesktop_os_release()["PRETTY_NAME"] + case "windows": + return f"{platform.system()} {platform.win32_ver()[1]}" + case _: + return platform.version() + + return { + "hostname": socket.gethostname(), + "platform": platform.system(), + "platform_version": _platform_version(), + "architecture": platform.machine(), + "cpu_count": cpu_count(), + "python_version": platform.python_version(), + } + + +def get_uptime(): + """Return uptime in seconds and a simple human string.""" + delta = datetime.now(tz=timezone.utc) - START_TIME + up_seconds = int(delta.total_seconds()) + up_hours = up_seconds // 3600 + up_minutes = (up_seconds % 3600) // 60 + return { + "seconds": up_seconds, + "human": f"{up_hours} hours, {up_minutes} minutes", + } + + +def get_runtime(): + """Return current runtime metadata (uptime + UTC timestamp).""" + up = get_uptime() + return { + "uptime_seconds": up["seconds"], + "uptime_human": up["human"], + "current_time": datetime.now(tz=timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ"), + "timezone": "UTC", + } + + +def get_request_info(request): + """Return basic request metadata for debugging/telemetry.""" + return { + "client_ip": request.remote_addr, + "user_agent": request.headers.get("User-Agent"), + "method": request.method, + "path": request.path, + } + + +def list_routes() -> list[dict[str, str]]: + """Return a flat list of route + method + description.""" + out: list[dict[str, str]] = [] + + for rule in sorted(app.url_map.iter_rules(), key=lambda r: (r.rule, r.endpoint)): + # Skip Flask's built-in static handler + if rule.endpoint == "static": + continue + + view = app.view_functions.get(rule.endpoint) + + # Description is pulled from docstring's brief (first line) + desc = "" + if view is not None: + desc = inspect.getdoc(view) or "" + desc = desc.splitlines()[0].strip() or "" + + for method in sorted(rule.methods - {"HEAD", "OPTIONS"}): + out.append( + { + "path": rule.rule, + "method": method, + "description": desc, + } + ) + return out + + +@app.route("/") +def index(): + """Service information""" + logger.debug(f"Request: {request.method} {request.path}") + return jsonify( + { + "service": get_service_info(), + "system": get_platform_info(), + "runtime": get_uptime(), + "request": get_request_info(request), + "endpoints": list_routes(), + } + ) + + +@app.route("/health") +def health(): + """Health check""" + logger.debug(f"Request: {request.method} {request.path}") + return jsonify( + { + "status": "healthy", + "timestamp": datetime.now(timezone.utc).isoformat(), + "uptime_seconds": get_uptime()["seconds"], + } + ) + + +@app.errorhandler(404) +def not_found(error): + """Return a JSON 404 payload.""" + logger.debug(f"Request: {request.method} {request.path}") + return jsonify({"error": "Not Found", "message": "Endpoint does not exist"}), 404 + + +@app.errorhandler(500) +def internal_error(error): + """Return a JSON 500 payload.""" + return ( + jsonify( + { + "error": "Internal Server Error", + "message": "An unexpected error occurred", + } + ), + 500, + ) + + +START_TIME = datetime.now(timezone.utc) # Application start time (UTC). +logger.info("Application starting...") + +# TODO use WSGI in production. +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..07894b7146 --- /dev/null +++ b/app_python/docs/LAB01.md @@ -0,0 +1,191 @@ +# LAB01 - DevOps Info Service (Python) + +## Framework Selection + +**Choice:** Flask +**Why:** I did not know any Python web framework for APIs, and Flask felt simplest to start with. Most lab examples were in Flask, so it reduced friction. + +**Comparison (concise):** + +| Framework | Pros | Cons | Fit for this lab | +| -------------- | ------------------------------------ | ------------------------------ | ----------------------------------------- | +| Flask (chosen) | Minimal, easy to learn, flexible | Fewer batteries included | Best for a small info service | +| FastAPI | Great typing, auto docs, async ready | Slightly more concepts upfront | Good, but extra overhead for a simple lab | +| Django | Full stack, ORM, auth | Heavy for a tiny API | Overkill here | + +## Best Practices Applied + +Below are concrete examples from `app.py` and why they matter. + +1. **Configuration via env vars** - makes the service configurable without code changes. + +```python +HOST = os.getenv("HOST", "0.0.0.0") +PORT = int(os.getenv("PORT", 5000)) +DEBUG = os.getenv("DEBUG", "False").lower() == "true" +``` + +2. **Clear separation into helper functions** - keeps endpoints small and readable. + +```python +def get_system_info() -> dict[str, str | int]: + ... + +def get_uptime(): + ... +``` + +3. **Logging** - provides startup and request diagnostics. + +```python +logging.basicConfig( + level=logging.INFO, + format="%(asctime)s - %(name)s - %(levelname)s - %(message)s" +) +logger.info("Application starting...") +``` + +4. **Error handling** - consistent JSON errors for clients. + +```python +@app.errorhandler(404) +def not_found(error): + return jsonify({"error": "Not Found", "message": "Endpoint does not exist"}), 404 +``` + +## API Documentation + +### Endpoints + +- `GET /` - service + system + runtime + request info +- `GET /health` - health check + +### Example Requests + +```bash +curl -sS http://127.0.0.1:5000/ | jq +curl -sS http://127.0.0.1:5000/health | jq +``` + +### Example Responses + +`GET /`: + +```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/8.18.0" + }, + "runtime": { + "human": "0 hours, 6 minutes", + "seconds": 418 + }, + "service": { + "description": "DevOps course info service", + "framework": "Flask", + "name": "devops-info-service", + "version": "1.0.0" + }, + "system": { + "architecture": "x86_64", + "cpu_count": 8, + "hostname": "aSUS-sTUFf-arch", + "platform": "Linux", + "platform_version": "Arch Linux", + "python_version": "3.14.2" + } +} +``` + +`GET /health`: + +```json +{ + "status": "healthy", + "timestamp": "2026-01-28T20:04:59.234201+00:00", + "uptime_seconds": 426 +} +``` + +## Testing Evidence + +### Screenshot + +![Screenshot of a terminal](img/lab01.png) + +### Output + +```js +$ curl -sS 127.0.0.1:3926 | jq +{ + "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/8.18.0" + }, + "runtime": { + "human": "0 hours, 6 minutes", + "seconds": 418 + }, + "service": { + "description": "DevOps course info service", + "framework": "Flask", + "name": "devops-info-service", + "version": "1.0.0" + }, + "system": { + "architecture": "x86_64", + "cpu_count": 8, + "hostname": "aSUS-sTUFf-arch", + "platform": "Linux", + "platform_version": "Arch Linux", + "python_version": "3.14.2" + } +} +``` + +```js +$ curl -sS 127.0.0.1:3926/health | jq +{ + "status": "healthy", + "timestamp": "2026-01-28T20:04:59.234201+00:00", + "uptime_seconds": 426 +} +``` + +## Challenges & Solutions + +1. **Framework choice** - I went with Flask because I did not know any Python API framework and Flask looked simplest; the lab examples were already in Flask. +2. **Listing endpoints dynamically** - I struggled with Flask's routing introspection; a StackOverflow snippet didn't work, and ChatGPT helped me craft a working approach. + +## GitHub Community + +Starring repositories helps me bookmark useful projects and signal appreciation, which improves visibility in open source. Following developers keeps me aware of what classmates and maintainers are doing, supporting collaboration and professional growth. diff --git a/app_python/docs/img/lab01.png b/app_python/docs/img/lab01.png new file mode 100644 index 0000000000000000000000000000000000000000..5316f2f18a193778827f153dc23e0f42cc64cd4d GIT binary patch literal 353760 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

yx8ng@JWQ}vPa$4zpJDCsLs7A4-msethu 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 z%0AW2Q$AQ4*z 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 O-f*(tXIEhBbN(;o$*%SQ literal 0 HcmV?d00001 diff --git a/app_python/requirements.txt b/app_python/requirements.txt new file mode 100644 index 0000000000..91714b4eb2 --- /dev/null +++ b/app_python/requirements.txt @@ -0,0 +1,12 @@ +blinker==1.9.0 +certifi==2026.1.4 +charset-normalizer==3.4.4 +click==8.3.1 +Flask==3.1.2 +idna==3.11 +itsdangerous==2.2.0 +Jinja2==3.1.6 +MarkupSafe==3.0.3 +requests==2.32.5 +urllib3==2.6.3 +Werkzeug==3.1.5 diff --git a/app_python/tests/__init__.py b/app_python/tests/__init__.py new file mode 100644 index 0000000000..e69de29bb2 From f3a7d5a5431a616c488f03c48d3171a1154c5815 Mon Sep 17 00:00:00 2001 From: LocalT0aster Dan <90502400+LocalT0aster@users.noreply.github.com> Date: Tue, 10 Feb 2026 23:09:07 +0300 Subject: [PATCH 02/21] Lab02 Completed (#2) * lab02 Dockerfile * fix: small adjustments * upd: lab02 docker docs * upd: Dockerized app_go * upd: app_go/LAB02.md --- app_go/.dockerignore | 4 + app_go/Dockerfile | 13 ++ app_go/docs/LAB02.md | 300 +++++++++++++++++++++++++++++++++++++++ app_python/.dockerignore | 4 + app_python/Dockerfile | 13 ++ app_python/README.md | 18 +++ app_python/docs/LAB02.md | 288 +++++++++++++++++++++++++++++++++++++ 7 files changed, 640 insertions(+) create mode 100644 app_go/.dockerignore create mode 100644 app_go/Dockerfile create mode 100644 app_go/docs/LAB02.md create mode 100644 app_python/.dockerignore create mode 100644 app_python/Dockerfile create mode 100644 app_python/docs/LAB02.md diff --git a/app_go/.dockerignore b/app_go/.dockerignore new file mode 100644 index 0000000000..6f1931b7cd --- /dev/null +++ b/app_go/.dockerignore @@ -0,0 +1,4 @@ +* +!go.mod +!go.sum +!*.go diff --git a/app_go/Dockerfile b/app_go/Dockerfile new file mode 100644 index 0000000000..aa269d06e2 --- /dev/null +++ b/app_go/Dockerfile @@ -0,0 +1,13 @@ +FROM golang:1.25-alpine AS build +WORKDIR /app +# Uncomment for dependency installation +# COPY go.mod go.sum ./ +# RUN go mod download +COPY go.mod *.go ./ +RUN CGO_ENABLED=0 GOOS=linux go build -o devops-info-service.out + +FROM scratch +COPY --from=build /app/devops-info-service.out / +# Use UID:GID to avoid copying user info (/etc/passwd) +USER 10001:10001 +CMD ["/devops-info-service.out"] diff --git a/app_go/docs/LAB02.md b/app_go/docs/LAB02.md new file mode 100644 index 0000000000..d906ab57fb --- /dev/null +++ b/app_go/docs/LAB02.md @@ -0,0 +1,300 @@ +# LAB02 — Multi-Stage Docker Build (Go) + +## Multi-Stage Build Strategy + +The Go service is built with a two-stage Dockerfile: + +1. **Build stage (`golang:1.25-alpine`)** +- Compiles the application binary with `CGO_ENABLED=0 GOOS=linux`. +- Keeps compiler/toolchain in the build environment only. + +2. **Runtime stage (`scratch`)** +- Copies only `devops-info-service.out` from the build stage. +- Runs as non-root with `USER 10001:10001`. +- Contains no package manager, shell, or compiler. + +Dockerfile used: `app_go/Dockerfile` + +```dockerfile +FROM golang:1.25-alpine AS build +WORKDIR /app +COPY go.mod *.go ./ +RUN CGO_ENABLED=0 GOOS=linux go build -o devops-info-service.out + +FROM scratch +COPY --from=build /app/devops-info-service.out / +USER 10001:10001 +CMD ["/devops-info-service.out"] +``` + +Also, `.dockerignore` keeps context minimal: + +```dockerignore +* +!go.mod +!go.sum +!*.go +``` + +## Technical Explanation of Each Stage + +- **`FROM golang:1.25-alpine AS build`** + Provides Go toolchain and Alpine userspace needed to compile. +- **`WORKDIR /app` + `COPY go.mod *.go ./`** + Copies only build inputs (module file and source files). +- **`RUN CGO_ENABLED=0 GOOS=linux go build ...`** + Produces a Linux static binary suitable for `scratch` runtime. +- **`FROM scratch`** + Starts an empty runtime image. +- **`COPY --from=build ...`** + Transfers only the compiled artifact, not compilers or source. +- **`USER 10001:10001`** + Drops root privileges in runtime. + +## Build Process (Terminal Output) + +

+🔨 Build target + +```log +$ docker build --no-cache --progress=plain --target build -t lab02-go:builder . +#0 building with "default" instance using docker driver + +#1 [internal] load build definition from Dockerfile +#1 transferring dockerfile: 424B 0.0s done +#1 DONE 0.1s + +#2 [internal] load metadata for docker.io/library/golang:1.25-alpine +#2 DONE 1.0s + +#3 [internal] load .dockerignore +#3 transferring context: 64B 0.0s done +#3 DONE 0.0s + +#4 [internal] load build context +#4 DONE 0.0s + +#5 [build 1/4] FROM docker.io/library/golang:1.25-alpine@sha256:f6751d823c26342f9506c03797d2527668d095b0a15f1862cddb4d927a7a4ced +#5 resolve docker.io/library/golang:1.25-alpine@sha256:f6751d823c26342f9506c03797d2527668d095b0a15f1862cddb4d927a7a4ced 0.0s done +#5 DONE 0.1s + +#6 [build 2/4] WORKDIR /app +#6 CACHED + +#4 [internal] load build context +#4 transferring context: 54B done +#4 DONE 0.0s + +#7 [build 3/4] COPY go.mod *.go ./ +#7 DONE 0.1s + +#8 [build 4/4] RUN CGO_ENABLED=0 GOOS=linux go build -o devops-info-service.out +#8 DONE 62.8s + +#9 exporting to image +#9 exporting layers +#9 exporting layers 7.4s done +#9 exporting manifest sha256:f3e73461dd53d9f346f612d14a5d7db25b865b7aab912ba8d3cb89a098da0546 +#9 exporting manifest sha256:f3e73461dd53d9f346f612d14a5d7db25b865b7aab912ba8d3cb89a098da0546 0.0s done +#9 exporting config sha256:06ba3662b02750d25c0817c4d26a4d0f77805f722bb6d60fa2b8c04b4308e480 0.0s done +#9 exporting attestation manifest sha256:844a56a9b83102a634becbc82128fa16fd1c41bba4fd9f5c56cf7ed84ec0b2ad 0.0s done +#9 exporting manifest list sha256:f2f7690814f0d4b01954394858a41285da9b7a2a425a2525c36f4f7dfe1577aa done +#9 naming to docker.io/library/lab02-go:builder 0.0s done +#9 unpacking to docker.io/library/lab02-go:builder +#9 unpacking to docker.io/library/lab02-go:builder 1.7s done +#9 DONE 9.4 +``` + +
+ +
+🔨 Final multi-stage target + +```log +$ docker build --no-cache --progress=plain -t lab02-go:final . +#0 building with "default" instance using docker driver + +#1 [internal] load build definition from Dockerfile +#1 transferring dockerfile: 424B 0.0s done +#1 DONE 0.0s + +#2 [internal] load metadata for docker.io/library/golang:1.25-alpine +#2 DONE 0.9s + +#3 [internal] load .dockerignore +#3 transferring context: 64B done +#3 DONE 0.0s + +#4 [internal] load build context +#4 DONE 0.0s + +#5 [build 1/4] FROM docker.io/library/golang:1.25-alpine@sha256:f6751d823c26342f9506c03797d2527668d095b0a15f1862cddb4d927a7a4ced +#5 resolve docker.io/library/golang:1.25-alpine@sha256:f6751d823c26342f9506c03797d2527668d095b0a15f1862cddb4d927a7a4ced 0.0s done +#5 DONE 0.0s + +#6 [build 2/4] WORKDIR /app +#6 CACHED + +#4 [internal] load build context +#4 transferring context: 54B done +#4 DONE 0.0s + +#7 [build 3/4] COPY go.mod *.go ./ +#7 DONE 0.1s + +#8 [build 4/4] RUN CGO_ENABLED=0 GOOS=linux go build -o devops-info-service.out +#8 DONE 67.4s + +#9 [stage-1 1/1] COPY --from=build /app/devops-info-service.out / +#9 DONE 0.1s + +#10 exporting to image +#10 exporting layers +#10 exporting layers 1.0s done +#10 exporting manifest sha256:b3ddddd75de1b8fe87ecf287b479ae5804ae9b73e3c8c88b58553ae1e949d209 +#10 exporting manifest sha256:b3ddddd75de1b8fe87ecf287b479ae5804ae9b73e3c8c88b58553ae1e949d209 0.0s done +#10 exporting config sha256:65c1bd7c8937841b2bb1e5d455bd1ec37dab85a4e0ac4eab15bf50d1fb61d19a done +#10 exporting attestation manifest sha256:2c7f952e05e64da351b651ceb30a12d35c0304ef9fb21d7dd5089b365862464e 0.0s done +#10 exporting manifest list sha256:2d3f56459e956a745bfe802d54a7f652677a6a993406ec23d7d0334f9ec99af5 0.0s done +#10 naming to docker.io/library/lab02-go:final done +#10 unpacking to docker.io/library/lab02-go:final +#10 unpacking to docker.io/library/lab02-go:final 0.2s done +#10 DONE 1.4s +``` + +
+ +## Working Containerized Application (Terminal Output) + +
+Server + +```bash +$ docker run --rm -p 5000:5000 lab02-go:final +2026/02/10 20:02:11 Application starting on 0.0.0.0:5000 +2026/02/10 20:02:27 Request: GET / +2026/02/10 20:03:55 Request: GET /health +``` + +
+ +
+Client + +```json +$ curl -sS 127.0.0.1:5000 | jq +{ + "service": { + "name": "devops-info-service", + "version": "1.0.0", + "description": "DevOps course info service", + "framework": "Go net/http" + }, + "system": { + "hostname": "1208319f6a92", + "platform": "Linux", + "platform_version": "linux", + "architecture": "amd64", + "cpu_count": 1, + "python_version": "go1.25.7" + }, + "runtime": { + "seconds": 15, + "human": "0 hours, 0 minutes" + }, + "request": { + "client_ip": "172.17.0.1", + "user_agent": "curl/8.14.1", + "method": "GET", + "path": "/" + }, + "endpoints": [ + { + "path": "/", + "method": "GET", + "description": "Service information." + }, + { + "path": "/health", + "method": "GET", + "description": "Health check endpoint." + } + ] +} +``` + +```json +$ curl -sS 127.0.0.1:5000/health | jq +{ + "status": "healthy", + "timestamp": "2026-02-10T20:03:55.538319+00:00", + "uptime_seconds": 104 +} +``` + +
+ +## Image Size Comparison and Analysis + + +| Image | Image size | +| ------------------------------------ | ------------ | +| Builder (`lab02-go:builder`) | **85.50MiB** | +| Final multi-stage (`lab02-go:final`) | **4.41MiB** | + +
+⚖️ Measuring command + +```bash +docker inspect -f "{{ .Size }}" | numfmt --to=iec-i --format="%.2f" +``` +
+ +Reduction from builder to final: +- **94.84%** smaller +- **19.39x** smaller runtime image + +These metrics come from the same `docker inspect` size source, so they are directly comparable. + +## Why Multi-Stage Builds Matter for Compiled Languages + +For Go (and similarly Rust/C/C++), the compiler and build toolchain are large and needed only at build time. Multi-stage builds let us: + +- Keep full SDK only in builder stage. +- Ship only the compiled binary in runtime. +- Reduce registry transfer and startup pull time. +- Reduce operational footprint and patch surface in production. + +Without multi-stage, runtime image carries unnecessary build dependencies, increasing size and risk. + +## Security Implications (Smaller Attack Surface) + +Security improvements in this implementation: + +- `scratch` runtime has no shell/package manager/toolchain. +- Non-root runtime user via `USER 10001:10001`. +- Fewer filesystem artifacts (only binary), reducing exposure. + +Practical impact: + +- Fewer components to scan/patch. +- Lower chance of post-exploitation tooling availability inside container. +- Simpler SBOM/runtime dependency graph. + +## Trade-Offs and Decisions + +### Decisions made + +- **Chose `scratch`** for maximal size/security reduction. +- **Used static build (`CGO_ENABLED=0`)** so binary runs in empty base image. +- **Used numeric UID:GID (`10001:10001`)** because `scratch` has no user-management tools. + +### Trade-offs + +- `scratch` is harder to debug (no shell utilities). +- No bundled CA certs/timezone data by default (important if app adds outbound TLS or timezone-sensitive logic later). +- Builder-stage caching is currently simple; if dependencies grow, splitting module download and source copy can improve cache efficiency further. + +## Summary + +The multi-stage approach in `app_go/Dockerfile` produces a working, non-root runtime image and achieves major size reduction compared with keeping the full Go toolchain in the final image. The result is a materially smaller and safer production artifact while preserving application functionality. diff --git a/app_python/.dockerignore b/app_python/.dockerignore new file mode 100644 index 0000000000..2944c29a24 --- /dev/null +++ b/app_python/.dockerignore @@ -0,0 +1,4 @@ +* +!app.py +!requirements.txt +!tests/* diff --git a/app_python/Dockerfile b/app_python/Dockerfile new file mode 100644 index 0000000000..5b1a868024 --- /dev/null +++ b/app_python/Dockerfile @@ -0,0 +1,13 @@ +FROM python:3.14-alpine +RUN addgroup appgroup && adduser --disabled-password --gecos "" --no-create-home -s /bin/sh appuser -G appgroup +WORKDIR /app +COPY requirements.txt . +RUN pip install --no-cache-dir -r requirements.txt +COPY . . +RUN rm requirements.txt + +ENV PORT=5000 +ENV HOST="0.0.0.0" + +USER appuser +CMD ["python", "app.py"] diff --git a/app_python/README.md b/app_python/README.md index 8c2642e984..4258b0b0ee 100644 --- a/app_python/README.md +++ b/app_python/README.md @@ -17,6 +17,17 @@ source .venv/bin/activate pip install -r requirements.txt ``` +### Docker + +- Pull the container: + ```bash + docker pull localt0aster/devops-app-py + ``` +- OR build the container yourself: + ```bash + docker build -t localt0aster/devops-app-py . + ``` + ## Running the Application ```bash @@ -25,6 +36,13 @@ python app.py PORT=8080 HOST=127.0.0.1 python app.py ``` +### Docker + +- Run the container: + ```bash + docker run -p 5000:5000 -e HOST="0.0.0.0" -d localt0aster/devops-app-py + ``` + ## API Endpoints - `GET /` - Service and system information diff --git a/app_python/docs/LAB02.md b/app_python/docs/LAB02.md new file mode 100644 index 0000000000..e650b5a669 --- /dev/null +++ b/app_python/docs/LAB02.md @@ -0,0 +1,288 @@ +# LAB02 - Docker Containerization (Python) + +## Docker Best Practices Applied + +1. **Pinned base image version** - guarantees repeatable builds and avoids unexpected upstream changes. + +```Dockerfile +FROM python:3.14-alpine +``` + +2. **Non-root user** - reduces blast radius if the app is compromised. + +```Dockerfile +RUN addgroup appgroup && adduser --disabled-password --gecos "" --no-create-home -s /bin/sh appuser -G appgroup +USER appuser +``` + +3. **Layer caching for dependencies** - installing requirements before copying the full app keeps rebuilds fast when only code changes. + +```Dockerfile +COPY requirements.txt . +RUN pip install --no-cache-dir -r requirements.txt +COPY . . +``` + +4. **Minimal build context via .dockerignore** - avoids sending unrelated files (venv, git, docs) to the build context. + +```dockerignore +* +!app.py +!requirements.txt +!tests/* +``` + +5. **No pip cache** - prevents leaving package download caches in the image. + +```Dockerfile +RUN pip install --no-cache-dir -r requirements.txt +``` + +6. **Explicit workdir** - ensures all app files live under a single predictable path. + +```Dockerfile +WORKDIR /app +``` + +## Image Information & Decisions + +**Base image chosen:** `python:3.14-alpine` + +**Why:** + +- Pinned Python version for reproducibility. +- Alpine variant keeps the runtime small and reduces attack surface. +- The app is pure-Python, so musl vs glibc compatibility is not an issue here. + +**Final image size:** + +```bash +$ docker inspect -f "{{ .Size }}" localt0aster/devops-app-py:lab.2 | numfmt --to=iec-i --format="%.2f" +22.82Mi +``` + +**Layer structure (top to bottom):** + +- Base image: Python runtime on Alpine. +- User/group creation: creates `appuser` and drops root privileges. +- Workdir: standardizes file locations. +- Dependency layer: copy `requirements.txt`, then install dependencies. +- App layer: copy remaining files into `/app`. +- Cleanup: remove `requirements.txt` (runtime tidiness). +- Runtime config: set `HOST` and `PORT` env vars. +- Switch to non-root user and start app. + +**Optimization choices:** + +- Used Alpine for smaller base image. +- Copied `requirements.txt` separately to maximize build cache hits. +- Used `pip --no-cache-dir` to avoid cached wheel files. +- `.dockerignore` reduces context size and speeds up builds. +- Note: `RUN rm requirements.txt` in a separate layer does not reduce image size; it only removes it from the final filesystem view. + +## Build & Run Process + +
+🔨 Build output + +```log +$ docker build --no-cache --progress=plain -t localt0aster/devops-app-py . +#0 building with "default" instance using docker driver + +#1 [internal] load build definition from Dockerfile +#1 transferring dockerfile: 369B done +#1 DONE 0.0s + +#2 [internal] load metadata for docker.io/library/python:3.14-alpine +#2 DONE 0.5s + +#3 [internal] load .dockerignore +#3 transferring context: 77B done +#3 DONE 0.0s + +#4 [1/7] FROM docker.io/library/python:3.14-alpine@sha256:faee120f7885a06fcc9677922331391fa690d911c020abb9e8025ff3d908e510 +#4 resolve docker.io/library/python:3.14-alpine@sha256:faee120f7885a06fcc9677922331391fa690d911c020abb9e8025ff3d908e510 0.0s done +#4 CACHED + +#5 [internal] load build context +#5 transferring context: 123B done +#5 DONE 0.0s + +#6 [2/7] RUN addgroup appgroup && adduser --disabled-password --gecos "" --no-create-home -s /bin/sh appuser -G appgroup +#6 DONE 0.3s + +#7 [3/7] WORKDIR /app +#7 DONE 0.1s + +#8 [4/7] COPY requirements.txt . +#8 DONE 0.1s + +#9 [5/7] RUN pip install --no-cache-dir -r requirements.txt +#9 4.545 Collecting blinker==1.9.0 (from -r requirements.txt (line 1)) +#9 4.736 Downloading blinker-1.9.0-py3-none-any.whl.metadata (1.6 kB) +#9 4.814 Collecting certifi==2026.1.4 (from -r requirements.txt (line 2)) +#9 4.855 Downloading certifi-2026.1.4-py3-none-any.whl.metadata (2.5 kB) +#9 5.098 Collecting charset-normalizer==3.4.4 (from -r requirements.txt (line 3)) +#9 5.140 Downloading charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_x86_64.whl.metadata (37 kB) +#9 5.229 Collecting click==8.3.1 (from -r requirements.txt (line 4)) +#9 5.270 Downloading click-8.3.1-py3-none-any.whl.metadata (2.6 kB) +#9 5.417 Collecting Flask==3.1.2 (from -r requirements.txt (line 5)) +#9 5.458 Downloading flask-3.1.2-py3-none-any.whl.metadata (3.2 kB) +#9 5.517 Collecting idna==3.11 (from -r requirements.txt (line 6)) +#9 5.560 Downloading idna-3.11-py3-none-any.whl.metadata (8.4 kB) +#9 5.608 Collecting itsdangerous==2.2.0 (from -r requirements.txt (line 7)) +#9 5.648 Downloading itsdangerous-2.2.0-py3-none-any.whl.metadata (1.9 kB) +#9 5.711 Collecting Jinja2==3.1.6 (from -r requirements.txt (line 8)) +#9 5.752 Downloading jinja2-3.1.6-py3-none-any.whl.metadata (2.9 kB) +#9 5.877 Collecting MarkupSafe==3.0.3 (from -r requirements.txt (line 9)) +#9 5.928 Downloading markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl.metadata (2.7 kB) +#9 6.003 Collecting requests==2.32.5 (from -r requirements.txt (line 10)) +#9 6.048 Downloading requests-2.32.5-py3-none-any.whl.metadata (4.9 kB) +#9 6.120 Collecting urllib3==2.6.3 (from -r requirements.txt (line 11)) +#9 6.160 Downloading urllib3-2.6.3-py3-none-any.whl.metadata (6.9 kB) +#9 6.251 Collecting Werkzeug==3.1.5 (from -r requirements.txt (line 12)) +#9 6.296 Downloading werkzeug-3.1.5-py3-none-any.whl.metadata (4.0 kB) +#9 6.399 Downloading blinker-1.9.0-py3-none-any.whl (8.5 kB) +#9 6.440 Downloading certifi-2026.1.4-py3-none-any.whl (152 kB) +#9 6.530 Downloading charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_x86_64.whl (154 kB) +#9 6.577 Downloading click-8.3.1-py3-none-any.whl (108 kB) +#9 6.620 Downloading flask-3.1.2-py3-none-any.whl (103 kB) +#9 6.662 Downloading idna-3.11-py3-none-any.whl (71 kB) +#9 6.704 Downloading itsdangerous-2.2.0-py3-none-any.whl (16 kB) +#9 6.743 Downloading jinja2-3.1.6-py3-none-any.whl (134 kB) +#9 6.792 Downloading markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl (23 kB) +#9 6.831 Downloading requests-2.32.5-py3-none-any.whl (64 kB) +#9 6.871 Downloading urllib3-2.6.3-py3-none-any.whl (131 kB) +#9 6.915 Downloading werkzeug-3.1.5-py3-none-any.whl (225 kB) +#9 6.985 Installing collected packages: urllib3, MarkupSafe, itsdangerous, idna, click, charset-normalizer, certifi, blinker, Werkzeug, requests, Jinja2, Flask +#9 8.701 +#9 8.709 Successfully installed Flask-3.1.2 Jinja2-3.1.6 MarkupSafe-3.0.3 Werkzeug-3.1.5 blinker-1.9.0 certifi-2026.1.4 charset-normalizer-3.4.4 click-8.3.1 idna-3.11 itsdangerous-2.2.0 requests-2.32.5 urllib3-2.6.3 +#9 8.710 WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager, possibly rendering your system unusable. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv. Use the --root-user-action option if you know what you are doing and want to suppress this warning. +#9 9.000 +#9 9.000 [notice] A new release of pip is available: 25.3 -> 26.0.1 +#9 9.000 [notice] To update, run: pip install --upgrade pip +#9 DONE 9.4s + +#10 [6/7] COPY . . +#10 DONE 0.1s + +#11 [7/7] RUN rm requirements.txt +#11 DONE 0.3s + +#12 exporting to image +#12 exporting layers +#12 exporting layers 1.4s done +#12 exporting manifest sha256:0e08d9c814e82ba9bfc64ab9bffca15d59c52f63d1b9db264e10723bf23c2daf +#12 exporting manifest sha256:0e08d9c814e82ba9bfc64ab9bffca15d59c52f63d1b9db264e10723bf23c2daf 0.0s done +#12 exporting config sha256:89b3883bbcb401b8bc8aa815aef1cde31083c25f245921185ce4acae286a51fb 0.0s done +#12 exporting attestation manifest sha256:fbcf722602c9bb0c149874e7052029e55cebf067e88f7448a0282f3b3fb1b926 0.0s done +#12 exporting manifest list sha256:24ce3d2f1f6270cedba6257c73fd1b5105b821025b9e38f87798ca75fba493d7 +#12 exporting manifest list sha256:24ce3d2f1f6270cedba6257c73fd1b5105b821025b9e38f87798ca75fba493d7 0.0s done +#12 naming to docker.io/localt0aster/devops-app-py:latest done +#12 unpacking to docker.io/localt0aster/devops-app-py:latest +#12 unpacking to docker.io/localt0aster/devops-app-py:latest 0.5s done +#12 DONE 2.1s + + 1 warning found (use docker --debug to expand): + - CopyIgnoredFile: Attempting to Copy file "." that is excluded by .dockerignore (line 6) +``` + +
+ +
+🏃 Run output + +```log +$ docker run -p 5000:5000 --rm localt0aster/devops-app-py +2026-02-10 16:52:32,232 - __main__ - INFO - Application starting... + * Serving Flask app 'app' + * Debug mode: off +2026-02-10 16:52:32,238 - werkzeug - INFO - WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. + * Running on all addresses (0.0.0.0) + * Running on http://127.0.0.1:5000 + * Running on http://172.17.0.2:5000 +2026-02-10 16:52:32,239 - werkzeug - INFO - Press CTRL+C to quit +2026-02-10 16:53:49,498 - werkzeug - INFO - 172.17.0.1 - - [10/Feb/2026 16:53:49] "GET / HTTP/1.1" 200 - +``` + +
+ +
+🛰️ Endpoint test output + +```json +$ curl -Ss 127.0.0.1:5000 | jq +{ + "endpoints": [ + { + "description": "Service information", + "method": "GET", + "path": "/" + }, + { + "description": "Health check", + "method": "GET", + "path": "/health" + } + ], + "request": { + "client_ip": "172.17.0.1", + "method": "GET", + "path": "/", + "user_agent": "curl/8.14.1" + }, + "runtime": { + "human": "0 hours, 1 minutes", + "seconds": 86 + }, + "service": { + "description": "DevOps course info service", + "framework": "Flask", + "name": "devops-info-service", + "version": "1.0.0" + }, + "system": { + "architecture": "x86_64", + "cpu_count": 1, + "hostname": "bd45062076fd", + "platform": "Linux", + "platform_version": "Alpine Linux v3.23", + "python_version": "3.14.3" + } +} +``` + +
+ +Docker Hub repository URL: + +## Technical Analysis + +**Why this Dockerfile works:** + +- Dependencies are installed before application code, enabling Docker cache reuse. +- Environment variables set defaults that match the Flask app’s config. +- The `CMD` runs the app with `python app.py`, which is the same startup command as local development. +- `USER appuser` prevents the Flask process from running as root. + +**What happens if you change the layer order:** + +- If `COPY . .` comes before `pip install`, any code change will invalidate the cache and force a full dependency reinstall. +- If you install dependencies after copying everything, small edits trigger slower rebuilds. + +**Security considerations implemented:** + +- Non-root user for runtime. +- Minimal base image reduces available tooling and attack surface. +- Pinned base image version reduces supply-chain drift. + +**How .dockerignore improves the build:** + +- Less data sent to the Docker daemon means faster builds. +- Prevents accidental inclusion of venvs, git history, and local artifacts. + +## Challenges & Solutions + +- **Debian to Alpine command differences.** + - Issue: `python:3.14-slim` (Debian) lab examples use `useradd/groupadd`, which don’t exist in `python:3.14-alpine`. + - Fix: use `addgroup` & `adduser` From 7cce8375cce30a34741101f77f56a1f2083dd7fc Mon Sep 17 00:00:00 2001 From: LocalT0aster Dan <90502400+LocalT0aster@users.noreply.github.com> Date: Thu, 19 Feb 2026 22:26:18 +0300 Subject: [PATCH 03/21] Lab03 Completed (#3) * feat: switch to poetry * feat: add gunicorn as prod. ready server * feat: actions * Testing * fix: the actions * snyk * fix: disable snyk skip message * docker build every push * upd: docs --- .github/actions/python-setup/action.yml | 57 ++ .github/workflows/python-ci.yml | 56 ++ .github/workflows/python-docker.yml | 82 +++ .github/workflows/python-snyk.yml | 37 ++ app_python/.dockerignore | 6 +- app_python/.flake8 | 4 + app_python/Dockerfile | 22 +- app_python/README.md | 42 +- app_python/docs/LAB03.md | 124 ++++ app_python/poetry.lock | 714 ++++++++++++++++++++++++ app_python/pyproject.toml | 25 + app_python/requirements.txt | 12 - app_python/src/flask_instance.py | 16 + app_python/src/main.py | 27 + app_python/{app.py => src/router.py} | 75 +-- app_python/tests/conftest.py | 14 + app_python/tests/test_endpoints.py | 118 ++++ app_python/tests/test_unit_helpers.py | 93 +++ 18 files changed, 1446 insertions(+), 78 deletions(-) create mode 100644 .github/actions/python-setup/action.yml create mode 100644 .github/workflows/python-ci.yml create mode 100644 .github/workflows/python-docker.yml create mode 100644 .github/workflows/python-snyk.yml create mode 100644 app_python/.flake8 create mode 100644 app_python/docs/LAB03.md create mode 100644 app_python/poetry.lock create mode 100644 app_python/pyproject.toml delete mode 100644 app_python/requirements.txt create mode 100644 app_python/src/flask_instance.py create mode 100644 app_python/src/main.py rename app_python/{app.py => src/router.py} (71%) create mode 100644 app_python/tests/conftest.py create mode 100644 app_python/tests/test_endpoints.py create mode 100644 app_python/tests/test_unit_helpers.py diff --git a/.github/actions/python-setup/action.yml b/.github/actions/python-setup/action.yml new file mode 100644 index 0000000000..25c87fa7c7 --- /dev/null +++ b/.github/actions/python-setup/action.yml @@ -0,0 +1,57 @@ +name: Python Poetry Setup +description: Set up Python + Poetry, cache dependencies, and install project deps + +inputs: + python-version: + description: Python version to install + required: false + default: "3.14" + poetry-version: + description: Poetry version to install + required: false + default: "2.3.2" + working-directory: + description: Project directory containing pyproject.toml + required: false + default: "app_python" + lockfile-path: + description: Path to poetry.lock for cache key invalidation + required: false + default: "app_python/poetry.lock" + install-args: + description: Extra arguments passed to poetry install + required: false + default: "--with dev --no-interaction --no-ansi" + +runs: + using: composite + steps: + - name: Setup Python + uses: actions/setup-python@v4 + with: + python-version: ${{ inputs.python-version }} + + - name: Install Poetry + uses: snok/install-poetry@v1 + with: + version: ${{ inputs.poetry-version }} + + - name: Configure Poetry virtualenv location + shell: bash + working-directory: ${{ inputs.working-directory }} + run: poetry config virtualenvs.in-project true + + - name: Cache Poetry dependencies + uses: actions/cache@v4 + with: + path: | + ~/.cache/pypoetry + ${{ inputs.working-directory }}/.venv + key: ${{ runner.os }}-py${{ inputs.python-version }}-poetry${{ inputs.poetry-version }}-${{ hashFiles(inputs.lockfile-path) }} + restore-keys: | + ${{ runner.os }}-py${{ inputs.python-version }}-poetry${{ inputs.poetry-version }}- + + - name: Install dependencies + shell: bash + working-directory: ${{ inputs.working-directory }} + run: poetry install ${{ inputs.install-args }} diff --git a/.github/workflows/python-ci.yml b/.github/workflows/python-ci.yml new file mode 100644 index 0000000000..712fe39c42 --- /dev/null +++ b/.github/workflows/python-ci.yml @@ -0,0 +1,56 @@ +name: Python CI + +on: + push: + paths: + - app_python/** + - .github/actions/python-setup/** + - .github/workflows/python-ci.yml + pull_request: + branches: + - master + paths: + - app_python/** + - .github/actions/python-setup/** + - .github/workflows/python-ci.yml + +jobs: + test: + strategy: + fail-fast: false + matrix: + python-version: [3.14] + poetry-version: [2.3.2] + os: [ubuntu-latest] + runs-on: ${{ matrix.os }} + defaults: + run: + working-directory: ./app_python + steps: + - uses: actions/checkout@v2 + - name: Setup Python tooling and dependencies + uses: ./.github/actions/python-setup + with: + python-version: ${{ matrix.python-version }} + poetry-version: ${{ matrix.poetry-version }} + working-directory: app_python + lockfile-path: app_python/poetry.lock + install-args: --with dev --no-interaction --no-ansi + - name: Lint with flake8 + run: poetry run flake8 src tests + - name: Test using pytest with coverage report + run: | + mkdir -p test-results + poetry run pytest \ + --junitxml=test-results/pytest-report.xml \ + --cov=src \ + --cov-report=term-missing \ + --cov-report=xml:test-results/coverage.xml + - name: Upload pytest and coverage reports + if: always() + uses: actions/upload-artifact@v4 + with: + name: python-test-reports + path: | + app_python/test-results/pytest-report.xml + app_python/test-results/coverage.xml diff --git a/.github/workflows/python-docker.yml b/.github/workflows/python-docker.yml new file mode 100644 index 0000000000..dde175a645 --- /dev/null +++ b/.github/workflows/python-docker.yml @@ -0,0 +1,82 @@ +name: Python Docker Publish + +on: + push: + branches: + - "lab*" + paths: + - app_python/** + - .github/workflows/python-docker.yml + pull_request: + branches: + - master + types: + - closed + paths: + - app_python/** + - .github/workflows/python-docker.yml + +jobs: + build-and-push-branch: + if: github.event_name == 'push' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Derive lab+sha tag from branch + id: version + run: | + source_branch="${{ github.ref_name }}" + if [[ "$source_branch" =~ ([0-9]+) ]]; then + lab_number="${BASH_REMATCH[1]}" + lab_number=$((10#$lab_number)) + short_sha="${GITHUB_SHA::7}" + echo "branch_tag=1.${lab_number}.${short_sha}" >> "$GITHUB_OUTPUT" + else + echo "Failed to extract lab number from branch: $source_branch" >&2 + exit 1 + fi + - name: Log in to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Build and push Docker image (branch) + uses: docker/build-push-action@v6 + with: + context: ./app_python + file: ./app_python/Dockerfile + push: true + tags: | + ${{ secrets.DOCKERHUB_USERNAME }}/devops-app-py:${{ steps.version.outputs.branch_tag }} + + build-and-push: + if: github.event.pull_request.merged == true + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Derive lab version tag from merged branch + id: version + run: | + source_branch="${{ github.event.pull_request.head.ref }}" + if [[ "$source_branch" =~ ([0-9]+) ]]; then + lab_number="${BASH_REMATCH[1]}" + lab_number=$((10#$lab_number)) + echo "version_tag=1.${lab_number}" >> "$GITHUB_OUTPUT" + else + echo "Failed to extract lab number from merged branch: $source_branch" >&2 + exit 1 + fi + - name: Log in to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Build and push Docker image + uses: docker/build-push-action@v6 + with: + context: ./app_python + file: ./app_python/Dockerfile + push: true + tags: | + ${{ secrets.DOCKERHUB_USERNAME }}/devops-app-py:${{ steps.version.outputs.version_tag }} + ${{ secrets.DOCKERHUB_USERNAME }}/devops-app-py:latest diff --git a/.github/workflows/python-snyk.yml b/.github/workflows/python-snyk.yml new file mode 100644 index 0000000000..c3297eccc1 --- /dev/null +++ b/.github/workflows/python-snyk.yml @@ -0,0 +1,37 @@ +name: Python Snyk Scan + +on: + push: + paths: + - app_python/** + - .github/actions/python-setup/** + - .github/workflows/python-snyk.yml + pull_request: + branches: + - master + paths: + - app_python/** + - .github/actions/python-setup/** + - .github/workflows/python-snyk.yml + +jobs: + snyk: + runs-on: ubuntu-latest + defaults: + run: + working-directory: ./app_python + steps: + - uses: actions/checkout@v4 + - name: Setup Python tooling and dependencies + uses: ./.github/actions/python-setup + - name: Setup Snyk CLI + uses: snyk/actions/setup@master + - name: Run Snyk dependency scan (or skip) + env: + SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }} + run: | + if [ -z "${SNYK_TOKEN:-}" ]; then + echo "SNYK_TOKEN secret not set; skipping Snyk dependency scan." + exit 0 + fi + snyk test --severity-threshold=high diff --git a/app_python/.dockerignore b/app_python/.dockerignore index 2944c29a24..511a810855 100644 --- a/app_python/.dockerignore +++ b/app_python/.dockerignore @@ -1,4 +1,4 @@ * -!app.py -!requirements.txt -!tests/* +!src/** +!pyproject.toml +!poetry.lock diff --git a/app_python/.flake8 b/app_python/.flake8 new file mode 100644 index 0000000000..63c477b455 --- /dev/null +++ b/app_python/.flake8 @@ -0,0 +1,4 @@ +[flake8] +max-line-length = 100 +max-complexity = 10 +exclude = .*,docs,*/__pycache__ diff --git a/app_python/Dockerfile b/app_python/Dockerfile index 5b1a868024..e9b02ed024 100644 --- a/app_python/Dockerfile +++ b/app_python/Dockerfile @@ -1,13 +1,23 @@ FROM python:3.14-alpine -RUN addgroup appgroup && adduser --disabled-password --gecos "" --no-create-home -s /bin/sh appuser -G appgroup + +ENV PYTHONDONTWRITEBYTECODE=1 +ENV PYTHONUNBUFFERED=1 +ENV POETRY_VERSION=2.3.2 + +RUN pip install --no-cache-dir "poetry==$POETRY_VERSION" \ + && addgroup appgroup \ + && adduser --disabled-password --gecos "" --no-create-home -s /bin/sh appuser -G appgroup + WORKDIR /app -COPY requirements.txt . -RUN pip install --no-cache-dir -r requirements.txt -COPY . . -RUN rm requirements.txt + +COPY pyproject.toml poetry.lock ./ +RUN poetry config virtualenvs.create false \ + && poetry install --only main --no-interaction --no-ansi --no-root + +COPY src ./src ENV PORT=5000 ENV HOST="0.0.0.0" USER appuser -CMD ["python", "app.py"] +CMD ["sh", "-c", "gunicorn --bind ${HOST:-0.0.0.0}:${PORT:-5000} src.flask_instance:app"] diff --git a/app_python/README.md b/app_python/README.md index 4258b0b0ee..1979c45e82 100644 --- a/app_python/README.md +++ b/app_python/README.md @@ -1,20 +1,20 @@ # DevOps Info Service +[![Python CI](https://github.com/LocalT0aster/DevOps-Core-S26/actions/workflows/python-ci.yml/badge.svg)](https://github.com/LocalT0aster/DevOps-Core-S26/actions/workflows/python-ci.yml) + ## Overview Small Flask web service that reports service metadata, system information, runtime uptime, and basic request details. Includes a simple health check endpoint for monitoring. ## Prerequisites -- Python 3.14 -- Dependencies from `requirements.txt` +- Python 3.13+ +- Poetry ## Installation ```bash -python -m venv .venv -source .venv/bin/activate -pip install -r requirements.txt +poetry install ``` ### Docker @@ -27,13 +27,19 @@ pip install -r requirements.txt ```bash docker build -t localt0aster/devops-app-py . ``` + The Docker build installs dependencies with: + ```bash + poetry install --only main --no-root + ``` ## Running the Application +Production-style local run with Gunicorn: + ```bash -python app.py +poetry run gunicorn --bind 0.0.0.0:5000 src.flask_instance:app # Or with custom config -PORT=8080 HOST=127.0.0.1 python app.py +HOST=127.0.0.1 PORT=8080 poetry run gunicorn --bind 127.0.0.1:8080 src.flask_instance:app ``` ### Docker @@ -55,3 +61,25 @@ PORT=8080 HOST=127.0.0.1 python app.py | `HOST` | `0.0.0.0` | Bind address for the server | | `PORT` | `5000` | Port to listen on | | `DEBUG` | `False` | Enable Flask debug mode (`true`/`false`) | + +## Testing + +The project uses `pytest` for unit tests. + +```bash +poetry install --with dev +poetry run pytest --cov=src --cov-report=term-missing +``` + +## Linting + +```bash +poetry run flake8 src tests +``` + +Current test coverage includes: + +- `GET /` successful response schema and types +- `GET /health` successful response schema and types +- `404` JSON error handling for unknown routes +- `500` JSON error handling for simulated internal failures diff --git a/app_python/docs/LAB03.md b/app_python/docs/LAB03.md new file mode 100644 index 0000000000..5f12e800e1 --- /dev/null +++ b/app_python/docs/LAB03.md @@ -0,0 +1,124 @@ +# LAB03 - Continuous Integration (Python) + +## 1. Overview + +**Testing framework used:** `pytest` + +**Why this choice:** + +- concise assertions and clear failure output +- fixtures simplify Flask test-client setup +- `monkeypatch` enables controlled error-path testing + +**What is covered by tests:** + +- endpoint tests for `GET /` and `GET /health` (success + error behavior) +- JSON schema/type assertions +- helper/unit tests for runtime/platform/request metadata +- entrypoint behavior test for `main.run()` argument wiring + +**Current CI trigger configuration:** + +- workflow files: + - `.github/workflows/python-ci.yml` (lint + tests + coverage reports) + - `.github/workflows/python-snyk.yml` (security scan) + - `.github/workflows/python-docker.yml` (container publish) +- note: Docker login/build/push is intentionally separated into `python-docker.yml` rather than embedded in `python-ci.yml`. +- triggers: + - CI/Snyk: `push` + `pull_request` with path filters + - Docker publish: + - branch pushes to `lab*` publish `1..` + - merged PRs to `master` publish `1.` + `latest` + +**Versioning strategy (SemVer/CalVer):** + +- SemVer-style lab release tags: `1.` + `latest` +- lab number is extracted from merged branch name (example: `lab03` -> `1.3`) + +## 2. Workflow Evidence + +Provide links/terminal output for: + +- Tests passing locally (terminal output below) +- Successful workflow run links (GitHub Actions): + - Python CI: + - Python Docker Publish: + - Python Snyk Scan: +- Docker image on Docker Hub (links): + - Tags page: + - Example pushed tag (`1.3.d4ae1ce`): +- Status badge in `app_python/README.md`: + - + +
+pytest output log + +```log +$ poetry run pytest --cov=src --cov-report=term-missing +========================= test session starts ========================= +platform linux -- Python 3.14.2, pytest-9.0.2, pluggy-1.6.0 +rootdir: /home/t0ast/Repos/DevOps-Core-S26/app_python +configfile: pyproject.toml +plugins: anyio-4.12.1, mock-3.15.1, cov-7.0.0 +collected 10 items + +tests/test_endpoints.py ..... [ 50%] +tests/test_unit_helpers.py ..... [100%] + +=========================== tests coverage ============================ +___________ coverage: platform linux, python 3.14.2-final-0 ___________ + +Name Stmts Miss Cover Missing +----------------------------------------------------- +src/flask_instance.py 7 0 100% +src/main.py 10 0 100% +src/router.py 60 0 100% +----------------------------------------------------- +TOTAL 77 0 100% +========================= 10 passed in 0.06s ========================== +``` + +
+ +## 3. Best Practices Implemented + +- **Practice 1: Path-based trigger filtering**: avoids running Python CI when unrelated folders change. +- **Practice 2: Lint + test stages in CI**: catches style and functional issues early. +- **Practice 3: Coverage reporting in CI command**: makes test quality visible, not just pass/fail. +- **Practice 4: Pipeline separation by concern**: test, security, and deploy concerns run independently for clearer failure diagnosis. +- **Practice 5: Reusable setup action**: shared Python/Poetry setup is centralized in `.github/actions/python-setup/action.yml` to avoid duplication. +- **Caching**: `actions/cache` stores `~/.cache/pypoetry` and `app_python/.venv` using a `poetry.lock`-based key. +- **Snyk**: integrated via `snyk/actions/setup` + `snyk test --severity-threshold=high`. +- **Snyk token handling**: workflow skips Snyk step if `SNYK_TOKEN` secret is missing. + +
+Snyk result (run #21961075835) + +``` +Testing /home/runner/work/DevOps-Core-S26/DevOps-Core-S26/app_python... + +Organization: localt0aster +Package manager: poetry +Target file: pyproject.toml +Project name: devops-info-service +Open source: no +Project path: /home/runner/work/DevOps-Core-S26/DevOps-Core-S26/app_python +Licenses: enabled + +✔ Tested 15 dependencies for known issues, no vulnerable paths found. +``` + +
+ +## 4. Key Decisions + +- **Versioning Strategy:** SemVer-style `1.` because releases happen once per lab and are easy to map back to coursework milestones. +- **Docker Tags:** branch builds publish `1..`; merged lab releases publish `1.` and `latest`. +- **Workflow Triggers:** path-filtered pushes/PRs for CI and Snyk, with container publishing gated on merged PRs to `master`. +- **Test Coverage:** endpoint and helper logic are covered; launcher-only code is excluded with pragma. +- **Snyk policy:** CI fails only for vulnerabilities at `high` severity or above. + +## 5. Challenges (Optional) + +- Moving from endpoint-only tests to helper-level unit tests increased meaningful coverage. +- Local and CI environments may have different tool availability; Poetry-based commands are used for reproducibility. diff --git a/app_python/poetry.lock b/app_python/poetry.lock new file mode 100644 index 0000000000..e4918ed237 --- /dev/null +++ b/app_python/poetry.lock @@ -0,0 +1,714 @@ +# This file is automatically @generated by Poetry 2.3.2 and should not be changed by hand. + +[[package]] +name = "blinker" +version = "1.9.0" +description = "Fast, simple object-to-object and broadcast signaling" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "blinker-1.9.0-py3-none-any.whl", hash = "sha256:ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc"}, + {file = "blinker-1.9.0.tar.gz", hash = "sha256:b4ce2265a7abece45e7cc896e98dbebe6cead56bcf805a3d23136d145f5445bf"}, +] + +[[package]] +name = "certifi" +version = "2026.1.4" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "certifi-2026.1.4-py3-none-any.whl", hash = "sha256:9943707519e4add1115f44c2bc244f782c0249876bf51b6599fee1ffbedd685c"}, + {file = "certifi-2026.1.4.tar.gz", hash = "sha256:ac726dd470482006e014ad384921ed6438c457018f4b3d204aea4281258b2120"}, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.4" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "charset_normalizer-3.4.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e824f1492727fa856dd6eda4f7cee25f8518a12f3c4a56a74e8095695089cf6d"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4bd5d4137d500351a30687c2d3971758aac9a19208fc110ccb9d7188fbe709e8"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:027f6de494925c0ab2a55eab46ae5129951638a49a34d87f4c3eda90f696b4ad"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f820802628d2694cb7e56db99213f930856014862f3fd943d290ea8438d07ca8"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:798d75d81754988d2565bff1b97ba5a44411867c0cf32b77a7e8f8d84796b10d"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d1bb833febdff5c8927f922386db610b49db6e0d4f4ee29601d71e7c2694313"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9cd98cdc06614a2f768d2b7286d66805f94c48cde050acdbbb7db2600ab3197e"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:077fbb858e903c73f6c9db43374fd213b0b6a778106bc7032446a8e8b5b38b93"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:244bfb999c71b35de57821b8ea746b24e863398194a4014e4c76adc2bbdfeff0"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:64b55f9dce520635f018f907ff1b0df1fdc31f2795a922fb49dd14fbcdf48c84"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:faa3a41b2b66b6e50f84ae4a68c64fcd0c44355741c6374813a800cd6695db9e"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:6515f3182dbe4ea06ced2d9e8666d97b46ef4c75e326b79bb624110f122551db"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cc00f04ed596e9dc0da42ed17ac5e596c6ccba999ba6bd92b0e0aef2f170f2d6"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-win32.whl", hash = "sha256:f34be2938726fc13801220747472850852fe6b1ea75869a048d6f896838c896f"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:a61900df84c667873b292c3de315a786dd8dac506704dea57bc957bd31e22c7d"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-win_arm64.whl", hash = "sha256:cead0978fc57397645f12578bfd2d5ea9138ea0fac82b2f63f7f7c6877986a69"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6e1fcf0720908f200cd21aa4e6750a48ff6ce4afe7ff5a79a90d5ed8a08296f8"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f819d5fe9234f9f82d75bdfa9aef3a3d72c4d24a6e57aeaebba32a704553aa0"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a59cb51917aa591b1c4e6a43c132f0cdc3c76dbad6155df4e28ee626cc77a0a3"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8ef3c867360f88ac904fd3f5e1f902f13307af9052646963ee08ff4f131adafc"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d9e45d7faa48ee908174d8fe84854479ef838fc6a705c9315372eacbc2f02897"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:840c25fb618a231545cbab0564a799f101b63b9901f2569faecd6b222ac72381"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ca5862d5b3928c4940729dacc329aa9102900382fea192fc5e52eb69d6093815"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d9c7f57c3d666a53421049053eaacdd14bbd0a528e2186fcb2e672effd053bb0"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:277e970e750505ed74c832b4bf75dac7476262ee2a013f5574dd49075879e161"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:31fd66405eaf47bb62e8cd575dc621c56c668f27d46a61d975a249930dd5e2a4"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:0d3d8f15c07f86e9ff82319b3d9ef6f4bf907608f53fe9d92b28ea9ae3d1fd89"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:9f7fcd74d410a36883701fafa2482a6af2ff5ba96b9a620e9e0721e28ead5569"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ebf3e58c7ec8a8bed6d66a75d7fb37b55e5015b03ceae72a8e7c74495551e224"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-win32.whl", hash = "sha256:eecbc200c7fd5ddb9a7f16c7decb07b566c29fa2161a16cf67b8d068bd21690a"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:5ae497466c7901d54b639cf42d5b8c1b6a4fead55215500d2f486d34db48d016"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-win_arm64.whl", hash = "sha256:65e2befcd84bc6f37095f5961e68a6f077bf44946771354a28ad434c2cce0ae1"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0a98e6759f854bd25a58a73fa88833fba3b7c491169f86ce1180c948ab3fd394"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b5b290ccc2a263e8d185130284f8501e3e36c5e02750fc6b6bdeb2e9e96f1e25"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74bb723680f9f7a6234dcf67aea57e708ec1fbdf5699fb91dfd6f511b0a320ef"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f1e34719c6ed0b92f418c7c780480b26b5d9c50349e9a9af7d76bf757530350d"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2437418e20515acec67d86e12bf70056a33abdacb5cb1655042f6538d6b085a8"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11d694519d7f29d6cd09f6ac70028dba10f92f6cdd059096db198c283794ac86"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ac1c4a689edcc530fc9d9aa11f5774b9e2f33f9a0c6a57864e90908f5208d30a"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:21d142cc6c0ec30d2efee5068ca36c128a30b0f2c53c1c07bd78cb6bc1d3be5f"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:5dbe56a36425d26d6cfb40ce79c314a2e4dd6211d51d6d2191c00bed34f354cc"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5bfbb1b9acf3334612667b61bd3002196fe2a1eb4dd74d247e0f2a4d50ec9bbf"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:d055ec1e26e441f6187acf818b73564e6e6282709e9bcb5b63f5b23068356a15"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:af2d8c67d8e573d6de5bc30cdb27e9b95e49115cd9baad5ddbd1a6207aaa82a9"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:780236ac706e66881f3b7f2f32dfe90507a09e67d1d454c762cf642e6e1586e0"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-win32.whl", hash = "sha256:5833d2c39d8896e4e19b689ffc198f08ea58116bee26dea51e362ecc7cd3ed26"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:a79cfe37875f822425b89a82333404539ae63dbdddf97f84dcbc3d339aae9525"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-win_arm64.whl", hash = "sha256:376bec83a63b8021bb5c8ea75e21c4ccb86e7e45ca4eb81146091b56599b80c3"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e1f185f86a6f3403aa2420e815904c67b2f9ebc443f045edd0de921108345794"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b39f987ae8ccdf0d2642338faf2abb1862340facc796048b604ef14919e55ed"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3162d5d8ce1bb98dd51af660f2121c55d0fa541b46dff7bb9b9f86ea1d87de72"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:81d5eb2a312700f4ecaa977a8235b634ce853200e828fbadf3a9c50bab278328"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5bd2293095d766545ec1a8f612559f6b40abc0eb18bb2f5d1171872d34036ede"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8a8b89589086a25749f471e6a900d3f662d1d3b6e2e59dcecf787b1cc3a1894"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc7637e2f80d8530ee4a78e878bce464f70087ce73cf7c1caf142416923b98f1"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f8bf04158c6b607d747e93949aa60618b61312fe647a6369f88ce2ff16043490"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:554af85e960429cf30784dd47447d5125aaa3b99a6f0683589dbd27e2f45da44"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:74018750915ee7ad843a774364e13a3db91682f26142baddf775342c3f5b1133"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c0463276121fdee9c49b98908b3a89c39be45d86d1dbaa22957e38f6321d4ce3"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:362d61fd13843997c1c446760ef36f240cf81d3ebf74ac62652aebaf7838561e"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a26f18905b8dd5d685d6d07b0cdf98a79f3c7a918906af7cc143ea2e164c8bc"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-win32.whl", hash = "sha256:9b35f4c90079ff2e2edc5b26c0c77925e5d2d255c42c74fdb70fb49b172726ac"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-win_amd64.whl", hash = "sha256:b435cba5f4f750aa6c0a0d92c541fb79f69a387c91e61f1795227e4ed9cece14"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-win_arm64.whl", hash = "sha256:542d2cee80be6f80247095cc36c418f7bddd14f4a6de45af91dfad36d817bba2"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:da3326d9e65ef63a817ecbcc0df6e94463713b754fe293eaa03da99befb9a5bd"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8af65f14dc14a79b924524b1e7fffe304517b2bff5a58bf64f30b98bbc5079eb"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74664978bb272435107de04e36db5a9735e78232b85b77d45cfb38f758efd33e"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:752944c7ffbfdd10c074dc58ec2d5a8a4cd9493b314d367c14d24c17684ddd14"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d1f13550535ad8cff21b8d757a3257963e951d96e20ec82ab44bc64aeb62a191"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ecaae4149d99b1c9e7b88bb03e3221956f68fd6d50be2ef061b2381b61d20838"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cb6254dc36b47a990e59e1068afacdcd02958bdcce30bb50cc1700a8b9d624a6"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c8ae8a0f02f57a6e61203a31428fa1d677cbe50c93622b4149d5c0f319c1d19e"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:47cc91b2f4dd2833fddaedd2893006b0106129d4b94fdb6af1f4ce5a9965577c"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:82004af6c302b5d3ab2cfc4cc5f29db16123b1a8417f2e25f9066f91d4411090"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2b7d8f6c26245217bd2ad053761201e9f9680f8ce52f0fcd8d0755aeae5b2152"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:799a7a5e4fb2d5898c60b640fd4981d6a25f1c11790935a44ce38c54e985f828"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:99ae2cffebb06e6c22bdc25801d7b30f503cc87dbd283479e7b606f70aff57ec"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-win32.whl", hash = "sha256:f9d332f8c2a2fcbffe1378594431458ddbef721c1769d78e2cbc06280d8155f9"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-win_amd64.whl", hash = "sha256:8a6562c3700cce886c5be75ade4a5db4214fda19fede41d9792d100288d8f94c"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-win_arm64.whl", hash = "sha256:de00632ca48df9daf77a2c65a484531649261ec9f25489917f09e455cb09ddb2"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ce8a0633f41a967713a59c4139d29110c07e826d131a316b50ce11b1d79b4f84"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eaabd426fe94daf8fd157c32e571c85cb12e66692f15516a83a03264b08d06c3"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c4ef880e27901b6cc782f1b95f82da9313c0eb95c3af699103088fa0ac3ce9ac"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2aaba3b0819274cc41757a1da876f810a3e4d7b6eb25699253a4effef9e8e4af"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:778d2e08eda00f4256d7f672ca9fef386071c9202f5e4607920b86d7803387f2"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f155a433c2ec037d4e8df17d18922c3a0d9b3232a396690f17175d2946f0218d"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a8bf8d0f749c5757af2142fe7903a9df1d2e8aa3841559b2bad34b08d0e2bcf3"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:194f08cbb32dc406d6e1aea671a68be0823673db2832b38405deba2fb0d88f63"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:6aee717dcfead04c6eb1ce3bd29ac1e22663cdea57f943c87d1eab9a025438d7"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:cd4b7ca9984e5e7985c12bc60a6f173f3c958eae74f3ef6624bb6b26e2abbae4"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_riscv64.whl", hash = "sha256:b7cf1017d601aa35e6bb650b6ad28652c9cd78ee6caff19f3c28d03e1c80acbf"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:e912091979546adf63357d7e2ccff9b44f026c075aeaf25a52d0e95ad2281074"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:5cb4d72eea50c8868f5288b7f7f33ed276118325c1dfd3957089f6b519e1382a"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-win32.whl", hash = "sha256:837c2ce8c5a65a2035be9b3569c684358dfbf109fd3b6969630a87535495ceaa"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:44c2a8734b333e0578090c4cd6b16f275e07aa6614ca8715e6c038e865e70576"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a9768c477b9d7bd54bc0c86dbaebdec6f03306675526c9927c0e8a04e8f94af9"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1bee1e43c28aa63cb16e5c14e582580546b08e535299b8b6158a7c9c768a1f3d"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:fd44c878ea55ba351104cb93cc85e74916eb8fa440ca7903e57575e97394f608"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0f04b14ffe5fdc8c4933862d8306109a2c51e0704acfa35d51598eb45a1e89fc"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:cd09d08005f958f370f539f186d10aec3377d55b9eeb0d796025d4886119d76e"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4fe7859a4e3e8457458e2ff592f15ccb02f3da787fcd31e0183879c3ad4692a1"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fa09f53c465e532f4d3db095e0c55b615f010ad81803d383195b6b5ca6cbf5f3"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:7fa17817dc5625de8a027cb8b26d9fefa3ea28c8253929b8d6649e705d2835b6"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:5947809c8a2417be3267efc979c47d76a079758166f7d43ef5ae8e9f92751f88"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:4902828217069c3c5c71094537a8e623f5d097858ac6ca8252f7b4d10b7560f1"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:7c308f7e26e4363d79df40ca5b2be1c6ba9f02bdbccfed5abddb7859a6ce72cf"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:2c9d3c380143a1fedbff95a312aa798578371eb29da42106a29019368a475318"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:cb01158d8b88ee68f15949894ccc6712278243d95f344770fa7593fa2d94410c"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-win32.whl", hash = "sha256:2677acec1a2f8ef614c6888b5b4ae4060cc184174a938ed4e8ef690e15d3e505"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:f8e160feb2aed042cd657a72acc0b481212ed28b1b9a95c0cee1621b524e1966"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-win_arm64.whl", hash = "sha256:b5d84d37db046c5ca74ee7bb47dd6cbc13f80665fdde3e8040bdd3fb015ecb50"}, + {file = "charset_normalizer-3.4.4-py3-none-any.whl", hash = "sha256:7a32c560861a02ff789ad905a2fe94e3f840803362c84fecf1851cb4cf3dc37f"}, + {file = "charset_normalizer-3.4.4.tar.gz", hash = "sha256:94537985111c35f28720e43603b8e7b43a6ecfb2ce1d3058bbe955b73404e21a"}, +] + +[[package]] +name = "click" +version = "8.3.1" +description = "Composable command line interface toolkit" +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "click-8.3.1-py3-none-any.whl", hash = "sha256:981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6"}, + {file = "click-8.3.1.tar.gz", hash = "sha256:12ff4785d337a1bb490bb7e9c2b1ee5da3112e94a8622f26a6c77f5d2fc6842a"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +groups = ["main", "dev"] +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] +markers = {main = "platform_system == \"Windows\"", dev = "sys_platform == \"win32\""} + +[[package]] +name = "coverage" +version = "7.13.4" +description = "Code coverage measurement for Python" +optional = false +python-versions = ">=3.10" +groups = ["dev"] +files = [ + {file = "coverage-7.13.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0fc31c787a84f8cd6027eba44010517020e0d18487064cd3d8968941856d1415"}, + {file = "coverage-7.13.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a32ebc02a1805adf637fc8dec324b5cdacd2e493515424f70ee33799573d661b"}, + {file = "coverage-7.13.4-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:e24f9156097ff9dc286f2f913df3a7f63c0e333dcafa3c196f2c18b4175ca09a"}, + {file = "coverage-7.13.4-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8041b6c5bfdc03257666e9881d33b1abc88daccaf73f7b6340fb7946655cd10f"}, + {file = "coverage-7.13.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2a09cfa6a5862bc2fc6ca7c3def5b2926194a56b8ab78ffcf617d28911123012"}, + {file = "coverage-7.13.4-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:296f8b0af861d3970c2a4d8c91d48eb4dd4771bcef9baedec6a9b515d7de3def"}, + {file = "coverage-7.13.4-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e101609bcbbfb04605ea1027b10dc3735c094d12d40826a60f897b98b1c30256"}, + {file = "coverage-7.13.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:aa3feb8db2e87ff5e6d00d7e1480ae241876286691265657b500886c98f38bda"}, + {file = "coverage-7.13.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:4fc7fa81bbaf5a02801b65346c8b3e657f1d93763e58c0abdf7c992addd81a92"}, + {file = "coverage-7.13.4-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:33901f604424145c6e9c2398684b92e176c0b12df77d52db81c20abd48c3794c"}, + {file = "coverage-7.13.4-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:bb28c0f2cf2782508a40cec377935829d5fcc3ad9a3681375af4e84eb34b6b58"}, + {file = "coverage-7.13.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9d107aff57a83222ddbd8d9ee705ede2af2cc926608b57abed8ef96b50b7e8f9"}, + {file = "coverage-7.13.4-cp310-cp310-win32.whl", hash = "sha256:a6f94a7d00eb18f1b6d403c91a88fd58cfc92d4b16080dfdb774afc8294469bf"}, + {file = "coverage-7.13.4-cp310-cp310-win_amd64.whl", hash = "sha256:2cb0f1e000ebc419632bbe04366a8990b6e32c4e0b51543a6484ffe15eaeda95"}, + {file = "coverage-7.13.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d490ba50c3f35dd7c17953c68f3270e7ccd1c6642e2d2afe2d8e720b98f5a053"}, + {file = "coverage-7.13.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:19bc3c88078789f8ef36acb014d7241961dbf883fd2533d18cb1e7a5b4e28b11"}, + {file = "coverage-7.13.4-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3998e5a32e62fdf410c0dbd3115df86297995d6e3429af80b8798aad894ca7aa"}, + {file = "coverage-7.13.4-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8e264226ec98e01a8e1054314af91ee6cde0eacac4f465cc93b03dbe0bce2fd7"}, + {file = "coverage-7.13.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a3aa4e7b9e416774b21797365b358a6e827ffadaaca81b69ee02946852449f00"}, + {file = "coverage-7.13.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:71ca20079dd8f27fcf808817e281e90220475cd75115162218d0e27549f95fef"}, + {file = "coverage-7.13.4-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e2f25215f1a359ab17320b47bcdaca3e6e6356652e8256f2441e4ef972052903"}, + {file = "coverage-7.13.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d65b2d373032411e86960604dc4edac91fdfb5dca539461cf2cbe78327d1e64f"}, + {file = "coverage-7.13.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:94eb63f9b363180aff17de3e7c8760c3ba94664ea2695c52f10111244d16a299"}, + {file = "coverage-7.13.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e856bf6616714c3a9fbc270ab54103f4e685ba236fa98c054e8f87f266c93505"}, + {file = "coverage-7.13.4-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:65dfcbe305c3dfe658492df2d85259e0d79ead4177f9ae724b6fb245198f55d6"}, + {file = "coverage-7.13.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b507778ae8a4c915436ed5c2e05b4a6cecfa70f734e19c22a005152a11c7b6a9"}, + {file = "coverage-7.13.4-cp311-cp311-win32.whl", hash = "sha256:784fc3cf8be001197b652d51d3fd259b1e2262888693a4636e18879f613a62a9"}, + {file = "coverage-7.13.4-cp311-cp311-win_amd64.whl", hash = "sha256:2421d591f8ca05b308cf0092807308b2facbefe54af7c02ac22548b88b95c98f"}, + {file = "coverage-7.13.4-cp311-cp311-win_arm64.whl", hash = "sha256:79e73a76b854d9c6088fe5d8b2ebe745f8681c55f7397c3c0a016192d681045f"}, + {file = "coverage-7.13.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:02231499b08dabbe2b96612993e5fc34217cdae907a51b906ac7fca8027a4459"}, + {file = "coverage-7.13.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40aa8808140e55dc022b15d8aa7f651b6b3d68b365ea0398f1441e0b04d859c3"}, + {file = "coverage-7.13.4-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5b856a8ccf749480024ff3bd7310adaef57bf31fd17e1bfc404b7940b6986634"}, + {file = "coverage-7.13.4-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2c048ea43875fbf8b45d476ad79f179809c590ec7b79e2035c662e7afa3192e3"}, + {file = "coverage-7.13.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b7b38448866e83176e28086674fe7368ab8590e4610fb662b44e345b86d63ffa"}, + {file = "coverage-7.13.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:de6defc1c9badbf8b9e67ae90fd00519186d6ab64e5cc5f3d21359c2a9b2c1d3"}, + {file = "coverage-7.13.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7eda778067ad7ffccd23ecffce537dface96212576a07924cbf0d8799d2ded5a"}, + {file = "coverage-7.13.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e87f6c587c3f34356c3759f0420693e35e7eb0e2e41e4c011cb6ec6ecbbf1db7"}, + {file = "coverage-7.13.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:8248977c2e33aecb2ced42fef99f2d319e9904a36e55a8a68b69207fb7e43edc"}, + {file = "coverage-7.13.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:25381386e80ae727608e662474db537d4df1ecd42379b5ba33c84633a2b36d47"}, + {file = "coverage-7.13.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:ee756f00726693e5ba94d6df2bdfd64d4852d23b09bb0bc700e3b30e6f333985"}, + {file = "coverage-7.13.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fdfc1e28e7c7cdce44985b3043bc13bbd9c747520f94a4d7164af8260b3d91f0"}, + {file = "coverage-7.13.4-cp312-cp312-win32.whl", hash = "sha256:01d4cbc3c283a17fc1e42d614a119f7f438eabb593391283adca8dc86eff1246"}, + {file = "coverage-7.13.4-cp312-cp312-win_amd64.whl", hash = "sha256:9401ebc7ef522f01d01d45532c68c5ac40fb27113019b6b7d8b208f6e9baa126"}, + {file = "coverage-7.13.4-cp312-cp312-win_arm64.whl", hash = "sha256:b1ec7b6b6e93255f952e27ab58fbc68dcc468844b16ecbee881aeb29b6ab4d8d"}, + {file = "coverage-7.13.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b66a2da594b6068b48b2692f043f35d4d3693fb639d5ea8b39533c2ad9ac3ab9"}, + {file = "coverage-7.13.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3599eb3992d814d23b35c536c28df1a882caa950f8f507cef23d1cbf334995ac"}, + {file = "coverage-7.13.4-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:93550784d9281e374fb5a12bf1324cc8a963fd63b2d2f223503ef0fd4aa339ea"}, + {file = "coverage-7.13.4-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b720ce6a88a2755f7c697c23268ddc47a571b88052e6b155224347389fdf6a3b"}, + {file = "coverage-7.13.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7b322db1284a2ed3aa28ffd8ebe3db91c929b7a333c0820abec3d838ef5b3525"}, + {file = "coverage-7.13.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f4594c67d8a7c89cf922d9df0438c7c7bb022ad506eddb0fdb2863359ff78242"}, + {file = "coverage-7.13.4-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:53d133df809c743eb8bce33b24bcababb371f4441340578cd406e084d94a6148"}, + {file = "coverage-7.13.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:76451d1978b95ba6507a039090ba076105c87cc76fc3efd5d35d72093964d49a"}, + {file = "coverage-7.13.4-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:7f57b33491e281e962021de110b451ab8a24182589be17e12a22c79047935e23"}, + {file = "coverage-7.13.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:1731dc33dc276dafc410a885cbf5992f1ff171393e48a21453b78727d090de80"}, + {file = "coverage-7.13.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:bd60d4fe2f6fa7dff9223ca1bbc9f05d2b6697bc5961072e5d3b952d46e1b1ea"}, + {file = "coverage-7.13.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9181a3ccead280b828fae232df12b16652702b49d41e99d657f46cc7b1f6ec7a"}, + {file = "coverage-7.13.4-cp313-cp313-win32.whl", hash = "sha256:f53d492307962561ac7de4cd1de3e363589b000ab69617c6156a16ba7237998d"}, + {file = "coverage-7.13.4-cp313-cp313-win_amd64.whl", hash = "sha256:e6f70dec1cc557e52df5306d051ef56003f74d56e9c4dd7ddb07e07ef32a84dd"}, + {file = "coverage-7.13.4-cp313-cp313-win_arm64.whl", hash = "sha256:fb07dc5da7e849e2ad31a5d74e9bece81f30ecf5a42909d0a695f8bd1874d6af"}, + {file = "coverage-7.13.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:40d74da8e6c4b9ac18b15331c4b5ebc35a17069410cad462ad4f40dcd2d50c0d"}, + {file = "coverage-7.13.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4223b4230a376138939a9173f1bdd6521994f2aff8047fae100d6d94d50c5a12"}, + {file = "coverage-7.13.4-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:1d4be36a5114c499f9f1f9195e95ebf979460dbe2d88e6816ea202010ba1c34b"}, + {file = "coverage-7.13.4-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:200dea7d1e8095cc6e98cdabe3fd1d21ab17d3cee6dab00cadbb2fe35d9c15b9"}, + {file = "coverage-7.13.4-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b8eb931ee8e6d8243e253e5ed7336deea6904369d2fd8ae6e43f68abbf167092"}, + {file = "coverage-7.13.4-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:75eab1ebe4f2f64d9509b984f9314d4aa788540368218b858dad56dc8f3e5eb9"}, + {file = "coverage-7.13.4-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c35eb28c1d085eb7d8c9b3296567a1bebe03ce72962e932431b9a61f28facf26"}, + {file = "coverage-7.13.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:eb88b316ec33760714a4720feb2816a3a59180fd58c1985012054fa7aebee4c2"}, + {file = "coverage-7.13.4-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:7d41eead3cc673cbd38a4417deb7fd0b4ca26954ff7dc6078e33f6ff97bed940"}, + {file = "coverage-7.13.4-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:fb26a934946a6afe0e326aebe0730cdff393a8bc0bbb65a2f41e30feddca399c"}, + {file = "coverage-7.13.4-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:dae88bc0fc77edaa65c14be099bd57ee140cf507e6bfdeea7938457ab387efb0"}, + {file = "coverage-7.13.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:845f352911777a8e722bfce168958214951e07e47e5d5d9744109fa5fe77f79b"}, + {file = "coverage-7.13.4-cp313-cp313t-win32.whl", hash = "sha256:2fa8d5f8de70688a28240de9e139fa16b153cc3cbb01c5f16d88d6505ebdadf9"}, + {file = "coverage-7.13.4-cp313-cp313t-win_amd64.whl", hash = "sha256:9351229c8c8407645840edcc277f4a2d44814d1bc34a2128c11c2a031d45a5dd"}, + {file = "coverage-7.13.4-cp313-cp313t-win_arm64.whl", hash = "sha256:30b8d0512f2dc8c8747557e8fb459d6176a2c9e5731e2b74d311c03b78451997"}, + {file = "coverage-7.13.4-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:300deaee342f90696ed186e3a00c71b5b3d27bffe9e827677954f4ee56969601"}, + {file = "coverage-7.13.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:29e3220258d682b6226a9b0925bc563ed9a1ebcff3cad30f043eceea7eaf2689"}, + {file = "coverage-7.13.4-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:391ee8f19bef69210978363ca930f7328081c6a0152f1166c91f0b5fdd2a773c"}, + {file = "coverage-7.13.4-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0dd7ab8278f0d58a0128ba2fca25824321f05d059c1441800e934ff2efa52129"}, + {file = "coverage-7.13.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:78cdf0d578b15148b009ccf18c686aa4f719d887e76e6b40c38ffb61d264a552"}, + {file = "coverage-7.13.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:48685fee12c2eb3b27c62f2658e7ea21e9c3239cba5a8a242801a0a3f6a8c62a"}, + {file = "coverage-7.13.4-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4e83efc079eb39480e6346a15a1bcb3e9b04759c5202d157e1dd4303cd619356"}, + {file = "coverage-7.13.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ecae9737b72408d6a950f7e525f30aca12d4bd8dd95e37342e5beb3a2a8c4f71"}, + {file = "coverage-7.13.4-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:ae4578f8528569d3cf303fef2ea569c7f4c4059a38c8667ccef15c6e1f118aa5"}, + {file = "coverage-7.13.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:6fdef321fdfbb30a197efa02d48fcd9981f0d8ad2ae8903ac318adc653f5df98"}, + {file = "coverage-7.13.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2b0f6ccf3dbe577170bebfce1318707d0e8c3650003cb4b3a9dd744575daa8b5"}, + {file = "coverage-7.13.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:75fcd519f2a5765db3f0e391eb3b7d150cce1a771bf4c9f861aeab86c767a3c0"}, + {file = "coverage-7.13.4-cp314-cp314-win32.whl", hash = "sha256:8e798c266c378da2bd819b0677df41ab46d78065fb2a399558f3f6cae78b2fbb"}, + {file = "coverage-7.13.4-cp314-cp314-win_amd64.whl", hash = "sha256:245e37f664d89861cf2329c9afa2c1fe9e6d4e1a09d872c947e70718aeeac505"}, + {file = "coverage-7.13.4-cp314-cp314-win_arm64.whl", hash = "sha256:ad27098a189e5838900ce4c2a99f2fe42a0bf0c2093c17c69b45a71579e8d4a2"}, + {file = "coverage-7.13.4-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:85480adfb35ffc32d40918aad81b89c69c9cc5661a9b8a81476d3e645321a056"}, + {file = "coverage-7.13.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:79be69cf7f3bf9b0deeeb062eab7ac7f36cd4cc4c4dd694bd28921ba4d8596cc"}, + {file = "coverage-7.13.4-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:caa421e2684e382c5d8973ac55e4f36bed6821a9bad5c953494de960c74595c9"}, + {file = "coverage-7.13.4-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:14375934243ee05f56c45393fe2ce81fe5cc503c07cee2bdf1725fb8bef3ffaf"}, + {file = "coverage-7.13.4-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:25a41c3104d08edb094d9db0d905ca54d0cd41c928bb6be3c4c799a54753af55"}, + {file = "coverage-7.13.4-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6f01afcff62bf9a08fb32b2c1d6e924236c0383c02c790732b6537269e466a72"}, + {file = "coverage-7.13.4-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:eb9078108fbf0bcdde37c3f4779303673c2fa1fe8f7956e68d447d0dd426d38a"}, + {file = "coverage-7.13.4-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:0e086334e8537ddd17e5f16a344777c1ab8194986ec533711cbe6c41cde841b6"}, + {file = "coverage-7.13.4-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:725d985c5ab621268b2edb8e50dfe57633dc69bda071abc470fed55a14935fd3"}, + {file = "coverage-7.13.4-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:3c06f0f1337c667b971ca2f975523347e63ec5e500b9aa5882d91931cd3ef750"}, + {file = "coverage-7.13.4-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:590c0ed4bf8e85f745e6b805b2e1c457b2e33d5255dd9729743165253bc9ad39"}, + {file = "coverage-7.13.4-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:eb30bf180de3f632cd043322dad5751390e5385108b2807368997d1a92a509d0"}, + {file = "coverage-7.13.4-cp314-cp314t-win32.whl", hash = "sha256:c4240e7eded42d131a2d2c4dec70374b781b043ddc79a9de4d55ca71f8e98aea"}, + {file = "coverage-7.13.4-cp314-cp314t-win_amd64.whl", hash = "sha256:4c7d3cc01e7350f2f0f6f7036caaf5673fb56b6998889ccfe9e1c1fe75a9c932"}, + {file = "coverage-7.13.4-cp314-cp314t-win_arm64.whl", hash = "sha256:23e3f687cf945070d1c90f85db66d11e3025665d8dafa831301a0e0038f3db9b"}, + {file = "coverage-7.13.4-py3-none-any.whl", hash = "sha256:1af1641e57cf7ba1bd67d677c9abdbcd6cc2ab7da3bca7fa1e2b7e50e65f2ad0"}, + {file = "coverage-7.13.4.tar.gz", hash = "sha256:e5c8f6ed1e61a8b2dcdf31eb0b9bbf0130750ca79c1c49eb898e2ad86f5ccc91"}, +] + +[package.extras] +toml = ["tomli ; python_full_version <= \"3.11.0a6\""] + +[[package]] +name = "flake8" +version = "7.3.0" +description = "the modular source code checker: pep8 pyflakes and co" +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "flake8-7.3.0-py2.py3-none-any.whl", hash = "sha256:b9696257b9ce8beb888cdbe31cf885c90d31928fe202be0889a7cdafad32f01e"}, + {file = "flake8-7.3.0.tar.gz", hash = "sha256:fe044858146b9fc69b551a4b490d69cf960fcb78ad1edcb84e7fbb1b4a8e3872"}, +] + +[package.dependencies] +mccabe = ">=0.7.0,<0.8.0" +pycodestyle = ">=2.14.0,<2.15.0" +pyflakes = ">=3.4.0,<3.5.0" + +[[package]] +name = "flask" +version = "3.1.2" +description = "A simple framework for building complex web applications." +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "flask-3.1.2-py3-none-any.whl", hash = "sha256:ca1d8112ec8a6158cc29ea4858963350011b5c846a414cdb7a954aa9e967d03c"}, + {file = "flask-3.1.2.tar.gz", hash = "sha256:bf656c15c80190ed628ad08cdfd3aaa35beb087855e2f494910aa3774cc4fd87"}, +] + +[package.dependencies] +blinker = ">=1.9.0" +click = ">=8.1.3" +itsdangerous = ">=2.2.0" +jinja2 = ">=3.1.2" +markupsafe = ">=2.1.1" +werkzeug = ">=3.1.0" + +[package.extras] +async = ["asgiref (>=3.2)"] +dotenv = ["python-dotenv"] + +[[package]] +name = "gunicorn" +version = "25.0.3" +description = "WSGI HTTP Server for UNIX" +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "gunicorn-25.0.3-py3-none-any.whl", hash = "sha256:aca364c096c81ca11acd4cede0aaeea91ba76ca74e2c0d7f879154db9d890f35"}, + {file = "gunicorn-25.0.3.tar.gz", hash = "sha256:b53a7fff1a07b825b962af320554de44ae77a26abfa373711ff3f83d57d3506d"}, +] + +[package.dependencies] +packaging = "*" + +[package.extras] +eventlet = ["eventlet (>=0.40.3)"] +gevent = ["gevent (>=24.10.1)"] +http2 = ["h2 (>=4.1.0)"] +setproctitle = ["setproctitle"] +testing = ["coverage", "eventlet (>=0.40.3)", "gevent (>=24.10.1)", "h2 (>=4.1.0)", "httpx[http2]", "pytest", "pytest-asyncio", "pytest-cov", "uvloop (>=0.19.0)"] +tornado = ["tornado (>=6.5.0)"] + +[[package]] +name = "idna" +version = "3.11" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea"}, + {file = "idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902"}, +] + +[package.extras] +all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] + +[[package]] +name = "iniconfig" +version = "2.3.0" +description = "brain-dead simple config-ini parsing" +optional = false +python-versions = ">=3.10" +groups = ["dev"] +files = [ + {file = "iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12"}, + {file = "iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730"}, +] + +[[package]] +name = "itsdangerous" +version = "2.2.0" +description = "Safely pass data to untrusted environments and back." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "itsdangerous-2.2.0-py3-none-any.whl", hash = "sha256:c6242fc49e35958c8b15141343aa660db5fc54d4f13a1db01a3f5891b98700ef"}, + {file = "itsdangerous-2.2.0.tar.gz", hash = "sha256:e0050c0b7da1eea53ffaf149c0cfbb5c6e2e2b69c4bef22c81fa6eb73e5f6173"}, +] + +[[package]] +name = "jinja2" +version = "3.1.6" +description = "A very fast and expressive template engine." +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67"}, + {file = "jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d"}, +] + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "markupsafe" +version = "3.0.3" +description = "Safely add untrusted strings to HTML/XML markup." +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "markupsafe-3.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f981d352f04553a7171b8e44369f2af4055f888dfb147d55e42d29e29e74559"}, + {file = "markupsafe-3.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e1c1493fb6e50ab01d20a22826e57520f1284df32f2d8601fdd90b6304601419"}, + {file = "markupsafe-3.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1ba88449deb3de88bd40044603fafffb7bc2b055d626a330323a9ed736661695"}, + {file = "markupsafe-3.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f42d0984e947b8adf7dd6dde396e720934d12c506ce84eea8476409563607591"}, + {file = "markupsafe-3.0.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c0c0b3ade1c0b13b936d7970b1d37a57acde9199dc2aecc4c336773e1d86049c"}, + {file = "markupsafe-3.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0303439a41979d9e74d18ff5e2dd8c43ed6c6001fd40e5bf2e43f7bd9bbc523f"}, + {file = "markupsafe-3.0.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:d2ee202e79d8ed691ceebae8e0486bd9a2cd4794cec4824e1c99b6f5009502f6"}, + {file = "markupsafe-3.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:177b5253b2834fe3678cb4a5f0059808258584c559193998be2601324fdeafb1"}, + {file = "markupsafe-3.0.3-cp310-cp310-win32.whl", hash = "sha256:2a15a08b17dd94c53a1da0438822d70ebcd13f8c3a95abe3a9ef9f11a94830aa"}, + {file = "markupsafe-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:c4ffb7ebf07cfe8931028e3e4c85f0357459a3f9f9490886198848f4fa002ec8"}, + {file = "markupsafe-3.0.3-cp310-cp310-win_arm64.whl", hash = "sha256:e2103a929dfa2fcaf9bb4e7c091983a49c9ac3b19c9061b6d5427dd7d14d81a1"}, + {file = "markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad"}, + {file = "markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a"}, + {file = "markupsafe-3.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50"}, + {file = "markupsafe-3.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0bf2a864d67e76e5c9a34dc26ec616a66b9888e25e7b9460e1c76d3293bd9dbf"}, + {file = "markupsafe-3.0.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc51efed119bc9cfdf792cdeaa4d67e8f6fcccab66ed4bfdd6bde3e59bfcbb2f"}, + {file = "markupsafe-3.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:068f375c472b3e7acbe2d5318dea141359e6900156b5b2ba06a30b169086b91a"}, + {file = "markupsafe-3.0.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:7be7b61bb172e1ed687f1754f8e7484f1c8019780f6f6b0786e76bb01c2ae115"}, + {file = "markupsafe-3.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a"}, + {file = "markupsafe-3.0.3-cp311-cp311-win32.whl", hash = "sha256:0db14f5dafddbb6d9208827849fad01f1a2609380add406671a26386cdf15a19"}, + {file = "markupsafe-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:de8a88e63464af587c950061a5e6a67d3632e36df62b986892331d4620a35c01"}, + {file = "markupsafe-3.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:3b562dd9e9ea93f13d53989d23a7e775fdfd1066c33494ff43f5418bc8c58a5c"}, + {file = "markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e"}, + {file = "markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce"}, + {file = "markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d"}, + {file = "markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d"}, + {file = "markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a"}, + {file = "markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b"}, + {file = "markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f"}, + {file = "markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b"}, + {file = "markupsafe-3.0.3-cp312-cp312-win32.whl", hash = "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d"}, + {file = "markupsafe-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c"}, + {file = "markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f"}, + {file = "markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795"}, + {file = "markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219"}, + {file = "markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6"}, + {file = "markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676"}, + {file = "markupsafe-3.0.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9"}, + {file = "markupsafe-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1"}, + {file = "markupsafe-3.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc"}, + {file = "markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12"}, + {file = "markupsafe-3.0.3-cp313-cp313-win32.whl", hash = "sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed"}, + {file = "markupsafe-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5"}, + {file = "markupsafe-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485"}, + {file = "markupsafe-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73"}, + {file = "markupsafe-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37"}, + {file = "markupsafe-3.0.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19"}, + {file = "markupsafe-3.0.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025"}, + {file = "markupsafe-3.0.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6"}, + {file = "markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f"}, + {file = "markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb"}, + {file = "markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009"}, + {file = "markupsafe-3.0.3-cp313-cp313t-win32.whl", hash = "sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354"}, + {file = "markupsafe-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218"}, + {file = "markupsafe-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287"}, + {file = "markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe"}, + {file = "markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026"}, + {file = "markupsafe-3.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737"}, + {file = "markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97"}, + {file = "markupsafe-3.0.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d"}, + {file = "markupsafe-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda"}, + {file = "markupsafe-3.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf"}, + {file = "markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe"}, + {file = "markupsafe-3.0.3-cp314-cp314-win32.whl", hash = "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9"}, + {file = "markupsafe-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581"}, + {file = "markupsafe-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4"}, + {file = "markupsafe-3.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab"}, + {file = "markupsafe-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175"}, + {file = "markupsafe-3.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634"}, + {file = "markupsafe-3.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50"}, + {file = "markupsafe-3.0.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e"}, + {file = "markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5"}, + {file = "markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523"}, + {file = "markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc"}, + {file = "markupsafe-3.0.3-cp314-cp314t-win32.whl", hash = "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d"}, + {file = "markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9"}, + {file = "markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa"}, + {file = "markupsafe-3.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:15d939a21d546304880945ca1ecb8a039db6b4dc49b2c5a400387cdae6a62e26"}, + {file = "markupsafe-3.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f71a396b3bf33ecaa1626c255855702aca4d3d9fea5e051b41ac59a9c1c41edc"}, + {file = "markupsafe-3.0.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0f4b68347f8c5eab4a13419215bdfd7f8c9b19f2b25520968adfad23eb0ce60c"}, + {file = "markupsafe-3.0.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e8fc20152abba6b83724d7ff268c249fa196d8259ff481f3b1476383f8f24e42"}, + {file = "markupsafe-3.0.3-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:949b8d66bc381ee8b007cd945914c721d9aba8e27f71959d750a46f7c282b20b"}, + {file = "markupsafe-3.0.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:3537e01efc9d4dccdf77221fb1cb3b8e1a38d5428920e0657ce299b20324d758"}, + {file = "markupsafe-3.0.3-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:591ae9f2a647529ca990bc681daebdd52c8791ff06c2bfa05b65163e28102ef2"}, + {file = "markupsafe-3.0.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a320721ab5a1aba0a233739394eb907f8c8da5c98c9181d1161e77a0c8e36f2d"}, + {file = "markupsafe-3.0.3-cp39-cp39-win32.whl", hash = "sha256:df2449253ef108a379b8b5d6b43f4b1a8e81a061d6537becd5582fba5f9196d7"}, + {file = "markupsafe-3.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:7c3fb7d25180895632e5d3148dbdc29ea38ccb7fd210aa27acbd1201a1902c6e"}, + {file = "markupsafe-3.0.3-cp39-cp39-win_arm64.whl", hash = "sha256:38664109c14ffc9e7437e86b4dceb442b0096dfe3541d7864d9cbe1da4cf36c8"}, + {file = "markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698"}, +] + +[[package]] +name = "mccabe" +version = "0.7.0" +description = "McCabe checker, plugin for flake8" +optional = false +python-versions = ">=3.6" +groups = ["dev"] +files = [ + {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, + {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, +] + +[[package]] +name = "packaging" +version = "26.0" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.8" +groups = ["main", "dev"] +files = [ + {file = "packaging-26.0-py3-none-any.whl", hash = "sha256:b36f1fef9334a5588b4166f8bcd26a14e521f2b55e6b9de3aaa80d3ff7a37529"}, + {file = "packaging-26.0.tar.gz", hash = "sha256:00243ae351a257117b6a241061796684b084ed1c516a08c48a3f7e147a9d80b4"}, +] + +[[package]] +name = "pep8-naming" +version = "0.15.1" +description = "Check PEP-8 naming conventions, plugin for flake8" +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "pep8_naming-0.15.1-py3-none-any.whl", hash = "sha256:eb63925e7fd9e028c7f7ee7b1e413ec03d1ee5de0e627012102ee0222c273c86"}, + {file = "pep8_naming-0.15.1.tar.gz", hash = "sha256:f6f4a499aba2deeda93c1f26ccc02f3da32b035c8b2db9696b730ef2c9639d29"}, +] + +[package.dependencies] +flake8 = ">=5.0.0" + +[[package]] +name = "pluggy" +version = "1.6.0" +description = "plugin and hook calling mechanisms for python" +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746"}, + {file = "pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["coverage", "pytest", "pytest-benchmark"] + +[[package]] +name = "pycodestyle" +version = "2.14.0" +description = "Python style guide checker" +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "pycodestyle-2.14.0-py2.py3-none-any.whl", hash = "sha256:dd6bf7cb4ee77f8e016f9c8e74a35ddd9f67e1d5fd4184d86c3b98e07099f42d"}, + {file = "pycodestyle-2.14.0.tar.gz", hash = "sha256:c4b5b517d278089ff9d0abdec919cd97262a3367449ea1c8b49b91529167b783"}, +] + +[[package]] +name = "pyflakes" +version = "3.4.0" +description = "passive checker of Python programs" +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "pyflakes-3.4.0-py2.py3-none-any.whl", hash = "sha256:f742a7dbd0d9cb9ea41e9a24a918996e8170c799fa528688d40dd582c8265f4f"}, + {file = "pyflakes-3.4.0.tar.gz", hash = "sha256:b24f96fafb7d2ab0ec5075b7350b3d2d2218eab42003821c06344973d3ea2f58"}, +] + +[[package]] +name = "pygments" +version = "2.19.2" +description = "Pygments is a syntax highlighting package written in Python." +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b"}, + {file = "pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887"}, +] + +[package.extras] +windows-terminal = ["colorama (>=0.4.6)"] + +[[package]] +name = "pytest" +version = "9.0.2" +description = "pytest: simple powerful testing with Python" +optional = false +python-versions = ">=3.10" +groups = ["dev"] +files = [ + {file = "pytest-9.0.2-py3-none-any.whl", hash = "sha256:711ffd45bf766d5264d487b917733b453d917afd2b0ad65223959f59089f875b"}, + {file = "pytest-9.0.2.tar.gz", hash = "sha256:75186651a92bd89611d1d9fc20f0b4345fd827c41ccd5c299a868a05d70edf11"}, +] + +[package.dependencies] +colorama = {version = ">=0.4", markers = "sys_platform == \"win32\""} +iniconfig = ">=1.0.1" +packaging = ">=22" +pluggy = ">=1.5,<2" +pygments = ">=2.7.2" + +[package.extras] +dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "requests", "setuptools", "xmlschema"] + +[[package]] +name = "pytest-cov" +version = "7.0.0" +description = "Pytest plugin for measuring coverage." +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "pytest_cov-7.0.0-py3-none-any.whl", hash = "sha256:3b8e9558b16cc1479da72058bdecf8073661c7f57f7d3c5f22a1c23507f2d861"}, + {file = "pytest_cov-7.0.0.tar.gz", hash = "sha256:33c97eda2e049a0c5298e91f519302a1334c26ac65c1a483d6206fd458361af1"}, +] + +[package.dependencies] +coverage = {version = ">=7.10.6", extras = ["toml"]} +pluggy = ">=1.2" +pytest = ">=7" + +[package.extras] +testing = ["process-tests", "pytest-xdist", "virtualenv"] + +[[package]] +name = "requests" +version = "2.32.5" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6"}, + {file = "requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset_normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "urllib3" +version = "2.6.3" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4"}, + {file = "urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed"}, +] + +[package.extras] +brotli = ["brotli (>=1.2.0) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=1.2.0.0) ; platform_python_implementation != \"CPython\""] +h2 = ["h2 (>=4,<5)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["backports-zstd (>=1.0.0) ; python_version < \"3.14\""] + +[[package]] +name = "werkzeug" +version = "3.1.5" +description = "The comprehensive WSGI web application library." +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "werkzeug-3.1.5-py3-none-any.whl", hash = "sha256:5111e36e91086ece91f93268bb39b4a35c1e6f1feac762c9c822ded0a4e322dc"}, + {file = "werkzeug-3.1.5.tar.gz", hash = "sha256:6a548b0e88955dd07ccb25539d7d0cc97417ee9e179677d22c7041c8f078ce67"}, +] + +[package.dependencies] +markupsafe = ">=2.1.1" + +[package.extras] +watchdog = ["watchdog (>=2.3)"] + +[metadata] +lock-version = "2.1" +python-versions = ">=3.13" +content-hash = "5bcb333e951818ca4706d50bae307ab22a95462b6e393691b1a6d0992e4ffc41" diff --git a/app_python/pyproject.toml b/app_python/pyproject.toml new file mode 100644 index 0000000000..1e8b7fba15 --- /dev/null +++ b/app_python/pyproject.toml @@ -0,0 +1,25 @@ +[tool.poetry] +name = "devops-info-service" +version = "0.1.0" +description = "" +authors = ["LocalT0aster"] +readme = "README.md" +packages = [{ include = "src" }] + +[tool.poetry.dependencies] +python = ">=3.13" +flask = ">=3.1.2,<4.0.0" +requests = ">=2.32.5,<3.0.0" +gunicorn = "^25.0.3" + +[build-system] +requires = ["poetry-core>=2.0.0,<3.0.0"] +build-backend = "poetry.core.masonry.api" + +[dependency-groups] +dev = [ + "pytest (>=9.0.2,<10.0.0)", + "pytest-cov (>=7.0.0,<8.0.0)", + "flake8 (>=7.3.0,<8.0.0)", + "pep8-naming (>=0.15.1,<0.16.0)" +] diff --git a/app_python/requirements.txt b/app_python/requirements.txt deleted file mode 100644 index 91714b4eb2..0000000000 --- a/app_python/requirements.txt +++ /dev/null @@ -1,12 +0,0 @@ -blinker==1.9.0 -certifi==2026.1.4 -charset-normalizer==3.4.4 -click==8.3.1 -Flask==3.1.2 -idna==3.11 -itsdangerous==2.2.0 -Jinja2==3.1.6 -MarkupSafe==3.0.3 -requests==2.32.5 -urllib3==2.6.3 -Werkzeug==3.1.5 diff --git a/app_python/src/flask_instance.py b/app_python/src/flask_instance.py new file mode 100644 index 0000000000..7f3267ba03 --- /dev/null +++ b/app_python/src/flask_instance.py @@ -0,0 +1,16 @@ +""" +Flask app instance and shared process-level state. +""" + +from datetime import datetime, timezone +import logging + +from flask import Flask + +logging.basicConfig( + level=logging.INFO, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s" +) +logger = logging.getLogger(__name__) + +app = Flask("DevOps Info Service") +START_TIME = datetime.now(timezone.utc) # Application start time (UTC). diff --git a/app_python/src/main.py b/app_python/src/main.py new file mode 100644 index 0000000000..d2d7356067 --- /dev/null +++ b/app_python/src/main.py @@ -0,0 +1,27 @@ +""" +DevOps Info Service +Application runtime entrypoint. +""" + +import os + +try: + from .flask_instance import app, logger + from . import router # noqa: F401 +except ImportError: # pragma: no cover - allows `python src/main.py` + from flask_instance import app, logger + import router # noqa: F401 + +HOST = os.getenv("HOST", "0.0.0.0") +PORT = int(os.getenv("PORT", 5000)) +DEBUG = os.getenv("DEBUG", "False").lower() == "true" + + +def run() -> None: + """Run development server.""" + logger.info("Application starting...") + app.run(host=HOST, port=PORT, debug=DEBUG) + + +if __name__ == "__main__": # pragma: no cover + run() diff --git a/app_python/app.py b/app_python/src/router.py similarity index 71% rename from app_python/app.py rename to app_python/src/router.py index ffce15ef58..994b1340e4 100644 --- a/app_python/app.py +++ b/app_python/src/router.py @@ -1,40 +1,25 @@ """ -DevOps Info Service -Main application module +Route handlers and response helpers. """ -__version__ = "1.0.0" - -# Basics -import os from datetime import datetime, timezone -import logging - -logging.basicConfig( - level=logging.INFO, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s" -) -logger = logging.getLogger(__name__) - -# Metadata gathering +import inspect from multiprocessing import cpu_count import platform -import inspect - -# Web import socket -from flask import Flask, jsonify, request +from flask import jsonify, request -# Configuration -HOST = os.getenv("HOST", "0.0.0.0") -PORT = int(os.getenv("PORT", 5000)) -DEBUG = os.getenv("DEBUG", "False").lower() == "true" +try: + from .flask_instance import START_TIME, app, logger +except ImportError: # pragma: no cover - allows `python src/main.py` + from flask_instance import START_TIME, app, logger -app = Flask(__name__) +__version__ = "1.0.0" def get_service_info() -> dict[str, str]: - """Collect info about service""" + """Collect info about service.""" return { "name": "devops-info-service", "version": __version__, @@ -44,11 +29,11 @@ def get_service_info() -> dict[str, str]: def get_platform_info() -> dict[str, str | int]: - """Collect system information""" + """Collect system information.""" def _platform_version() -> str: """Return a human-friendly OS version string.""" - match (platform.system().lower()): + match platform.system().lower(): case "linux": return platform.freedesktop_os_release()["PRETTY_NAME"] case "windows": @@ -66,7 +51,7 @@ def _platform_version() -> str: } -def get_uptime(): +def get_uptime() -> dict[str, str | int]: """Return uptime in seconds and a simple human string.""" delta = datetime.now(tz=timezone.utc) - START_TIME up_seconds = int(delta.total_seconds()) @@ -78,7 +63,7 @@ def get_uptime(): } -def get_runtime(): +def get_runtime() -> dict[str, str | int]: """Return current runtime metadata (uptime + UTC timestamp).""" up = get_uptime() return { @@ -89,13 +74,13 @@ def get_runtime(): } -def get_request_info(request): +def get_request_info(req) -> dict[str, str | None]: """Return basic request metadata for debugging/telemetry.""" return { - "client_ip": request.remote_addr, - "user_agent": request.headers.get("User-Agent"), - "method": request.method, - "path": request.path, + "client_ip": req.remote_addr, + "user_agent": req.headers.get("User-Agent"), + "method": req.method, + "path": req.path, } @@ -104,13 +89,11 @@ def list_routes() -> list[dict[str, str]]: out: list[dict[str, str]] = [] for rule in sorted(app.url_map.iter_rules(), key=lambda r: (r.rule, r.endpoint)): - # Skip Flask's built-in static handler if rule.endpoint == "static": continue view = app.view_functions.get(rule.endpoint) - # Description is pulled from docstring's brief (first line) desc = "" if view is not None: desc = inspect.getdoc(view) or "" @@ -129,8 +112,8 @@ def list_routes() -> list[dict[str, str]]: @app.route("/") def index(): - """Service information""" - logger.debug(f"Request: {request.method} {request.path}") + """Service information.""" + logger.debug("Request: %s %s", request.method, request.path) return jsonify( { "service": get_service_info(), @@ -144,8 +127,8 @@ def index(): @app.route("/health") def health(): - """Health check""" - logger.debug(f"Request: {request.method} {request.path}") + """Health check.""" + logger.debug("Request: %s %s", request.method, request.path) return jsonify( { "status": "healthy", @@ -156,14 +139,14 @@ def health(): @app.errorhandler(404) -def not_found(error): +def not_found(error): # noqa: ARG001 """Return a JSON 404 payload.""" - logger.debug(f"Request: {request.method} {request.path}") + logger.debug("Request: %s %s", request.method, request.path) return jsonify({"error": "Not Found", "message": "Endpoint does not exist"}), 404 @app.errorhandler(500) -def internal_error(error): +def internal_error(error): # noqa: ARG001 """Return a JSON 500 payload.""" return ( jsonify( @@ -174,11 +157,3 @@ def internal_error(error): ), 500, ) - - -START_TIME = datetime.now(timezone.utc) # Application start time (UTC). -logger.info("Application starting...") - -# TODO use WSGI in production. -if __name__ == "__main__": - app.run(host=HOST, port=PORT, debug=DEBUG) diff --git a/app_python/tests/conftest.py b/app_python/tests/conftest.py new file mode 100644 index 0000000000..eef52e6a63 --- /dev/null +++ b/app_python/tests/conftest.py @@ -0,0 +1,14 @@ +"""Shared pytest fixtures for app endpoint tests.""" + +import pytest + +from src.flask_instance import app +import src.router # noqa: F401 # Ensure route decorators are loaded. + + +@pytest.fixture() +def client(): + """Return a Flask test client without starting a real HTTP server.""" + app.config.update(TESTING=True, PROPAGATE_EXCEPTIONS=False) + with app.test_client() as test_client: + yield test_client diff --git a/app_python/tests/test_endpoints.py b/app_python/tests/test_endpoints.py new file mode 100644 index 0000000000..d0aca40338 --- /dev/null +++ b/app_python/tests/test_endpoints.py @@ -0,0 +1,118 @@ +"""Unit tests for HTTP endpoints and error handling.""" + +from datetime import datetime + +import src.router as router + + +def _raise_runtime_error() -> None: + raise RuntimeError("simulated failure") + + +def test_index_returns_expected_json_structure_and_types(client): + """GET / should return the expected nested schema with stable field types.""" + response = client.get( + "/", + headers={"User-Agent": "pytest-suite/1.0"}, + environ_overrides={"REMOTE_ADDR": "203.0.113.7"}, + ) + + assert response.status_code == 200 + payload = response.get_json() + assert payload is not None + + assert {"service", "system", "runtime", "request", "endpoints"} <= payload.keys() + + service = payload["service"] + assert service["name"] == "devops-info-service" + assert service["framework"] == "Flask" + assert isinstance(service["version"], str) + assert isinstance(service["description"], str) + + system = payload["system"] + assert isinstance(system["hostname"], str) + assert system["hostname"] + assert isinstance(system["platform"], str) + assert isinstance(system["platform_version"], str) + assert isinstance(system["architecture"], str) + assert isinstance(system["cpu_count"], int) + assert system["cpu_count"] >= 1 + assert isinstance(system["python_version"], str) + + runtime = payload["runtime"] + assert isinstance(runtime["seconds"], int) + assert runtime["seconds"] >= 0 + assert isinstance(runtime["human"], str) + + request = payload["request"] + assert request["client_ip"] == "203.0.113.7" + assert request["user_agent"] == "pytest-suite/1.0" + assert request["method"] == "GET" + assert request["path"] == "/" + + endpoints = payload["endpoints"] + assert isinstance(endpoints, list) + assert endpoints + for endpoint in endpoints: + assert {"path", "method", "description"} <= endpoint.keys() + assert isinstance(endpoint["path"], str) + assert isinstance(endpoint["method"], str) + assert isinstance(endpoint["description"], str) + + route_index = {(endpoint["method"], endpoint["path"]) for endpoint in endpoints} + assert ("GET", "/") in route_index + assert ("GET", "/health") in route_index + + +def test_health_returns_expected_json_structure_and_types(client): + """GET /health should report healthy status and typed runtime metadata.""" + response = client.get("/health") + + assert response.status_code == 200 + payload = response.get_json() + assert payload is not None + + assert {"status", "timestamp", "uptime_seconds"} <= payload.keys() + assert payload["status"] == "healthy" + assert isinstance(payload["uptime_seconds"], int) + assert payload["uptime_seconds"] >= 0 + + parsed_timestamp = datetime.fromisoformat(payload["timestamp"]) + assert parsed_timestamp.tzinfo is not None + + +def test_unknown_endpoint_returns_json_404(client): + """Unknown routes should be handled by JSON 404 error handler.""" + response = client.get("/definitely-does-not-exist") + + assert response.status_code == 404 + assert response.get_json() == { + "error": "Not Found", + "message": "Endpoint does not exist", + } + + +def test_index_returns_json_500_when_platform_probe_fails(client, monkeypatch): + """GET / should return JSON 500 when an internal helper crashes.""" + monkeypatch.setattr(router, "get_platform_info", _raise_runtime_error) + + response = client.get("/") + + assert response.status_code == 500 + assert response.get_json() == { + "error": "Internal Server Error", + "message": "An unexpected error occurred", + } + + +def test_health_returns_json_500_when_uptime_probe_fails(client, monkeypatch): + """GET /health should return JSON 500 when uptime collection crashes.""" + monkeypatch.setattr(router, "get_uptime", _raise_runtime_error) + + response = client.get("/health") + + assert response.status_code == 500 + assert response.get_json() == { + "error": "Internal Server Error", + "message": "An unexpected error occurred", + } diff --git a/app_python/tests/test_unit_helpers.py b/app_python/tests/test_unit_helpers.py new file mode 100644 index 0000000000..a17f071a61 --- /dev/null +++ b/app_python/tests/test_unit_helpers.py @@ -0,0 +1,93 @@ +"""Unit tests for helper functions and app entrypoint behavior.""" + +from datetime import datetime +from unittest.mock import Mock + +from flask import request + +from src.flask_instance import app +import src.main as main +import src.router as router + + +def test_run_calls_flask_app_with_configured_host_port_debug(monkeypatch): + """main.run should log startup and pass module config into app.run.""" + run_mock = Mock() + info_mock = Mock() + + monkeypatch.setattr(main, "HOST", "127.0.0.1") + monkeypatch.setattr(main, "PORT", 5050) + monkeypatch.setattr(main, "DEBUG", True) + monkeypatch.setattr(main.app, "run", run_mock) + monkeypatch.setattr(main.logger, "info", info_mock) + + main.run() + + info_mock.assert_called_once_with("Application starting...") + run_mock.assert_called_once_with(host="127.0.0.1", port=5050, debug=True) + + +def test_get_runtime_maps_uptime_payload(monkeypatch): + """get_runtime should map uptime fields and produce UTC timestamp text.""" + monkeypatch.setattr( + router, + "get_uptime", + lambda: {"seconds": 42, "human": "0 hours, 0 minutes"}, + ) + + runtime = router.get_runtime() + + assert runtime["uptime_seconds"] == 42 + assert runtime["uptime_human"] == "0 hours, 0 minutes" + assert runtime["timezone"] == "UTC" + assert runtime["current_time"].endswith("Z") + datetime.strptime(runtime["current_time"], "%Y-%m-%dT%H:%M:%SZ") + + +def test_get_platform_info_windows_platform_version_branch(monkeypatch): + """Windows branch should format platform_version from win32 metadata.""" + monkeypatch.setattr(router.platform, "system", lambda: "Windows") + monkeypatch.setattr(router.platform, "win32_ver", lambda: ("", "11", "", "")) + monkeypatch.setattr(router.platform, "machine", lambda: "AMD64") + monkeypatch.setattr(router.platform, "python_version", lambda: "3.14.2") + monkeypatch.setattr(router.socket, "gethostname", lambda: "test-host") + monkeypatch.setattr(router, "cpu_count", lambda: 8) + + payload = router.get_platform_info() + + assert payload["platform"] == "Windows" + assert payload["platform_version"] == "Windows 11" + assert payload["hostname"] == "test-host" + assert payload["cpu_count"] == 8 + + +def test_get_platform_info_default_platform_version_branch(monkeypatch): + """Non-Linux and non-Windows branch should use platform.version().""" + monkeypatch.setattr(router.platform, "system", lambda: "Darwin") + monkeypatch.setattr(router.platform, "version", lambda: "Darwin Kernel 25.0") + monkeypatch.setattr(router.platform, "machine", lambda: "arm64") + monkeypatch.setattr(router.platform, "python_version", lambda: "3.14.2") + monkeypatch.setattr(router.socket, "gethostname", lambda: "mac-host") + monkeypatch.setattr(router, "cpu_count", lambda: 10) + + payload = router.get_platform_info() + + assert payload["platform"] == "Darwin" + assert payload["platform_version"] == "Darwin Kernel 25.0" + + +def test_get_request_info_returns_none_when_user_agent_missing(): + """Missing User-Agent header should map to None without crashing.""" + with app.test_request_context( + "/diagnostic", + method="POST", + environ_base={"REMOTE_ADDR": "198.51.100.9"}, + ): + info = router.get_request_info(request) + + assert info == { + "client_ip": "198.51.100.9", + "user_agent": None, + "method": "POST", + "path": "/diagnostic", + } From fb5c97924402b64c7306407f04d4552fa7a196ca Mon Sep 17 00:00:00 2001 From: LocalT0aster Dan <90502400+LocalT0aster@users.noreply.github.com> Date: Thu, 5 Mar 2026 17:05:03 +0300 Subject: [PATCH 04/21] Lab04 (#4) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * waiting for images to pull, lol * I wish that I had more than 96K internet speed on my pc * Lab04 completed yay🎉 --- .gitignore | 32 +- docker/provision_vm.sh | 30 ++ docs/LAB04.md | 657 +++++++++++++++++++++++++++++ pulumi/.gitignore | 2 + pulumi/Pulumi.dev.yaml.example | 10 + pulumi/Pulumi.yaml | 11 + pulumi/__main__.py | 82 ++++ pulumi/requirements.txt | 2 + terraform/README.md | 45 ++ terraform/main.tf | 82 ++++ terraform/outputs.tf | 39 ++ terraform/terraform.tfvars.example | 13 + terraform/variables.tf | 80 ++++ terraform/versions.tf | 10 + 14 files changed, 1094 insertions(+), 1 deletion(-) create mode 100755 docker/provision_vm.sh create mode 100644 docs/LAB04.md create mode 100644 pulumi/.gitignore create mode 100644 pulumi/Pulumi.dev.yaml.example create mode 100644 pulumi/Pulumi.yaml create mode 100644 pulumi/__main__.py create mode 100644 pulumi/requirements.txt create mode 100644 terraform/README.md create mode 100644 terraform/main.tf create mode 100644 terraform/outputs.tf create mode 100644 terraform/terraform.tfvars.example create mode 100644 terraform/variables.tf create mode 100644 terraform/versions.tf diff --git a/.gitignore b/.gitignore index 30d74d2584..67e6b52b28 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,31 @@ -test \ No newline at end of file +test + +# Terraform +**/.terraform/* +*.tfstate +*.tfstate.* +*.tfplan +tfplan +*.tfvars +*.tfvars.json +crash.log +override.tf +override.tf.json +*_override.tf +*_override.tf.json +.terraform.lock.hcl + +# Pulumi +.pulumi/ +pulumi/.venv/ +pulumi/venv/ +pulumi/Pulumi.*.yaml + +# Python caches +__pycache__/ +*.py[cod] +.pytest_cache/ +.mypy_cache/ + +# IDE +.vscode/ diff --git a/docker/provision_vm.sh b/docker/provision_vm.sh new file mode 100755 index 0000000000..b79bfd3c4d --- /dev/null +++ b/docker/provision_vm.sh @@ -0,0 +1,30 @@ +#!/usr/bin/env bash + +set -euo pipefail + +: "${VM_USER:?VM_USER must be set}" +: "${SSH_PUBLIC_KEY:?SSH_PUBLIC_KEY must be set}" + +export DEBIAN_FRONTEND=noninteractive + +if ! command -v sshd >/dev/null 2>&1; then + apt-get update + apt-get install -y --no-install-recommends openssh-server ca-certificates +fi + +id -u "${VM_USER}" >/dev/null 2>&1 || useradd -m -s /bin/bash "${VM_USER}" +install -d -m 700 -o "${VM_USER}" -g "${VM_USER}" "/home/${VM_USER}/.ssh" +printf '%s\n' "${SSH_PUBLIC_KEY}" >"/home/${VM_USER}/.ssh/authorized_keys" +chown "${VM_USER}:${VM_USER}" "/home/${VM_USER}/.ssh/authorized_keys" +chmod 600 "/home/${VM_USER}/.ssh/authorized_keys" + +mkdir -p /run/sshd +cat >/etc/ssh/sshd_config.d/lab04.conf < container `22` + - HTTP: host `0.0.0.0:80` -> container `80` + - App: host `0.0.0.0:5000` -> container `5000` +- Public IP equivalent: `127.0.0.1`. +- Cost: `$0`. + +## 2. Terraform (OpenTofu) Implementation + +- CLI used: OpenTofu `v1.10.9` (Terraform-compatible HCL). +- Project path: `terraform/`. +- Main files: + - `versions.tf`: provider + required version. + - `main.tf`: network + Ubuntu VM container + startup bootstrap for SSH service + published ports. + - `variables.tf`: bind IPs, host ports, labels. + - `outputs.tf`: endpoints and connection commands. +- Project structure: split into `versions.tf` (providers), `variables.tf` (inputs), `main.tf` (resources), and `outputs.tf` (connection/output values) for readability and predictable diffs. + +### Key Decisions + +- Used Ubuntu image directly to keep `apply` simple and avoid local custom image build failures. +- Used startup bootstrap in a separate shell script (`docker/provision_vm.sh`) to avoid duplicated provisioning logic across Terraform and Pulumi. +- Kept `80` and `5000` port mappings defined in IaC, but did not run mock HTTP services in the container. +- Bound SSH to `127.0.0.1` by default to reduce exposure. + +### Challenges + +- Provider download from registry/GitHub release assets may timeout on slow links. +- Workaround: local plugin mirror (`~/.terraform.d/plugins`) if direct provider install fails. + +### Command Output + +
+`tofu plan` + +``` +$ tofu plan + +OpenTofu used the selected providers to generate the following execution plan. Resource +actions are indicated with the following symbols: + + create + +OpenTofu will perform the following actions: + + # docker_container.vm will be created + + resource "docker_container" "vm" { + + attach = false + + bridge = (known after apply) + + command = [ + + "/bin/bash", + + "-lc", + + <<-EOT + #!/usr/bin/env bash + + set -euo pipefail + + : "${VM_USER:?VM_USER must be set}" + : "${SSH_PUBLIC_KEY:?SSH_PUBLIC_KEY must be set}" + + export DEBIAN_FRONTEND=noninteractive + + if ! command -v sshd >/dev/null 2>&1; then + apt-get update + apt-get install -y --no-install-recommends openssh-server ca-certificates + fi + + id -u "${VM_USER}" >/dev/null 2>&1 || useradd -m -s /bin/bash "${VM_USER}" + install -d -m 700 -o "${VM_USER}" -g "${VM_USER}" "/home/${VM_USER}/.ssh" + printf '%s\n' "${SSH_PUBLIC_KEY}" >"/home/${VM_USER}/.ssh/authorized_keys" + chown "${VM_USER}:${VM_USER}" "/home/${VM_USER}/.ssh/authorized_keys" + chmod 600 "/home/${VM_USER}/.ssh/authorized_keys" + + mkdir -p /run/sshd + cat >/etc/ssh/sshd_config.d/lab04.conf < + +
+`tofu apply` + +``` +$ tofu apply + +OpenTofu used the selected providers to generate the following execution plan. Resource +actions are indicated with the following symbols: + + create + +OpenTofu will perform the following actions: + + # docker_container.vm will be created + + resource "docker_container" "vm" { + + attach = false + + bridge = (known after apply) + + command = [ + + "/bin/bash", + + "-lc", + + <<-EOT + #!/usr/bin/env bash + + set -euo pipefail + + : "${VM_USER:?VM_USER must be set}" + : "${SSH_PUBLIC_KEY:?SSH_PUBLIC_KEY must be set}" + + export DEBIAN_FRONTEND=noninteractive + + if ! command -v sshd >/dev/null 2>&1; then + apt-get update + apt-get install -y --no-install-recommends openssh-server ca-certificates + fi + + id -u "${VM_USER}" >/dev/null 2>&1 || useradd -m -s /bin/bash "${VM_USER}" + install -d -m 700 -o "${VM_USER}" -g "${VM_USER}" "/home/${VM_USER}/.ssh" + printf '%s\n' "${SSH_PUBLIC_KEY}" >"/home/${VM_USER}/.ssh/authorized_keys" + chown "${VM_USER}:${VM_USER}" "/home/${VM_USER}/.ssh/authorized_keys" + chmod 600 "/home/${VM_USER}/.ssh/authorized_keys" + + mkdir -p /run/sshd + cat >/etc/ssh/sshd_config.d/lab04.conf < + +
+SSH test + +``` +$ ssh -i ~/.ssh/id_ed25519 -p 2222 devops@127.0.0.1 echo "SSH available" +The authenticity of host '[127.0.0.1]:2222 ([127.0.0.1]:2222)' can't be established. +ED25519 key fingerprint is: SHA256:shGIrzMssSaR8sB9yuUyId7BYrKHyfi/OQSvGJq5gkk +This key is not known by any other names. +Are you sure you want to continue connecting (yes/no/[fingerprint])? yes +Warning: Permanently added '[127.0.0.1]:2222' (ED25519) to the list of known hosts. +SSH available +``` + +
+ +Teardown command (Terraform resources): + +```bash +cd terraform +tofu destroy -auto-approve +``` + +## 3. Pulumi Implementation + +- Pulumi CLI: `v3.192.0` +- Language: Python +- Project path: `pulumi/` +- Resources: + - Docker network + - Docker `RemoteImage` (`ubuntu:24.04`) + - Docker container with same ports as Terraform setup + +### Code Differences vs Terraform + +- Terraform uses declarative HCL resources and variable blocks. +- Pulumi uses Python (`__main__.py`) and typed constructor args (`docker.ContainerPortArgs`, `docker.ContainerLabelArgs`). +- The shared provisioning logic is loaded from `docker/provision_vm.sh` in both implementations, but Pulumi reads it via `Path(...).read_text()`, while Terraform uses `file(...)`. + +### Advantages Discovered + +- Strong typing and native language constructs in Python made refactoring (for example, shared provisioning script usage) easier. +- Pulumi outputs and resource objects map naturally to normal programming workflows. +- For this lab size, Pulumi and Terraform were both fast enough; Pulumi felt better when logic started to grow. + +### Challenges + +- Pulumi passphrase prompts can interrupt command flow if `PULUMI_CONFIG_PASSPHRASE` is not set. +- On Nix/Home-Manager-based setups, `pulumi-language-python` may be missing from `PATH`, which blocks `preview/up` until fixed. +- Docker provider behavior is similar across tools, but plugin/setup issues differ and require separate troubleshooting steps. + +### Command Output + +`tofu destroy` before Pulumi migration: + +```bash +$ tofu destroy -auto-approve +``` + +
+`pulumi preview` + +``` +$ pulumi preview +Enter your passphrase to unlock config/secrets + (set PULUMI_CONFIG_PASSPHRASE or PULUMI_CONFIG_PASSPHRASE_FILE to remember): +Enter your passphrase to unlock config/secrets +Previewing update (dev): + Type Name Plan Info + + pulumi:pulumi:Stack lab04-local-docker-dev create 1 warning + + ├─ docker:index:Network lab04-net create + + ├─ docker:index:RemoteImage lab04-vm-image create + + └─ docker:index:Container lab04-vm create + +Diagnostics: + pulumi:pulumi:Stack (lab04-local-docker-dev): + warning: using pulumi-language-python from $PATH at /etc/profiles/per-user/t0ast/bin/pulumi-language-python + +Outputs: + appUrl : "http://127.0.0.1:5000" + containerShellCommand: "docker exec -it lab04-local-vm /bin/bash" + httpUrl : "http://127.0.0.1:80" + networkName : "lab04-local-net" + publicIpEquivalent : "127.0.0.1" + sshCommand : "ssh -i ~/.ssh/id_ed25519 -p 2222 devops@127.0.0.1" + vmName : "lab04-local-vm" + +Resources: + + 4 to create +``` + +
+ +
+`pulumi up` + +``` +$ pulumi up +Enter your passphrase to unlock config/secrets + (set PULUMI_CONFIG_PASSPHRASE or PULUMI_CONFIG_PASSPHRASE_FILE to remember): +Enter your passphrase to unlock config/secrets +Previewing update (dev): + Type Name Plan Info + + pulumi:pulumi:Stack lab04-local-docker-dev create 1 warning + + ├─ docker:index:RemoteImage lab04-vm-image create + + ├─ docker:index:Network lab04-net create + + └─ docker:index:Container lab04-vm create + +Diagnostics: + pulumi:pulumi:Stack (lab04-local-docker-dev): + warning: using pulumi-language-python from $PATH at /etc/profiles/per-user/t0ast/bin/pulumi-language-python + +Outputs: + appUrl : "http://127.0.0.1:5000" + containerShellCommand: "docker exec -it lab04-local-vm /bin/bash" + httpUrl : "http://127.0.0.1:80" + networkName : "lab04-local-net" + publicIpEquivalent : "127.0.0.1" + sshCommand : "ssh -i ~/.ssh/id_ed25519 -p 2222 devops@127.0.0.1" + vmName : "lab04-local-vm" + +Resources: + + 4 to create + +Do you want to perform this update? yes +Updating (dev): + Type Name Status Info + + pulumi:pulumi:Stack lab04-local-docker-dev created (2s) 1 warning + + ├─ docker:index:RemoteImage lab04-vm-image created (0.01s) + + ├─ docker:index:Network lab04-net created (2s) + + └─ docker:index:Container lab04-vm created (0.38s) + +Diagnostics: + pulumi:pulumi:Stack (lab04-local-docker-dev): + warning: using pulumi-language-python from $PATH at /etc/profiles/per-user/t0ast/bin/pulumi-language-python + +Outputs: + appUrl : "http://127.0.0.1:5000" + containerShellCommand: "docker exec -it lab04-local-vm /bin/bash" + httpUrl : "http://127.0.0.1:80" + networkName : "lab04-local-net" + publicIpEquivalent : "127.0.0.1" + sshCommand : "ssh -i ~/.ssh/id_ed25519 -p 2222 devops@127.0.0.1" + vmName : "lab04-local-vm" + +Resources: + + 4 created + +Duration: 3s +``` + +
+ +
+SSH test + +``` +$ ssh -i ~/.ssh/id_ed25519 -p 2222 devops@127.0.0.1 echo "SSH works" +The authenticity of host '[127.0.0.1]:2222 ([127.0.0.1]:2222)' can't be established. +ED25519 key fingerprint is: SHA256:spW/AgFoqrVqpf1i7ZWEUqYGXJ8rZM6wGU5+S4WheVI +This key is not known by any other names. +Are you sure you want to continue connecting (yes/no/[fingerprint])? yes +Warning: Permanently added '[127.0.0.1]:2222' (ED25519) to the list of known hosts. +SSH works +``` + +
+ +Teardown command (Pulumi resources): + +```bash +pulumi destroy --yes +``` + +## 4. Terraform vs Pulumi (Local Docker Case) + +### Ease of Learning + +Terraform/OpenTofu was faster to start because the resource graph is explicit in HCL and examples are abundant. I needed less scaffolding to get a first working run with `tofu init/plan/apply`. Pulumi required understanding stack config and language-plugin behavior in addition to infrastructure code. + +### Code Readability + +For small infrastructure, Terraform is shorter and easier to scan in one file. Pulumi is more verbose, but the Python structure becomes clearer when the project grows and you need reusable helpers. In this lab, Terraform is more concise, while Pulumi is more flexible. + +### Debugging + +Terraform plan/apply diffs are straightforward and helped quickly validate expected port mappings and resource creation. Pulumi diagnostics were helpful when runtime issues occurred, but setup-level failures (passphrase/plugin) were less obvious initially. Once setup was correct, both were manageable to debug. + +### Documentation + +Terraform has broader community examples and more copy-paste-ready snippets for common patterns. Pulumi official docs are good and practical, but there are fewer examples for some edge workflows. For this lab, Terraform documentation felt easier to navigate quickly. + +### Use Case + +I would choose Terraform/OpenTofu for straightforward declarative infrastructure with predictable patterns. I would choose Pulumi when infrastructure logic needs stronger abstraction, conditional behavior, or shared code with application teams. For this local Docker lab, either works, but Terraform was simpler and Pulumi was more programmable. + +## 5. Lab 5 Preparation & Cleanup + +### VM for Lab 5 + +- Are you keeping your VM for Lab 5? **No**. +- What will you use for Lab 5? A local VM via libvirt, or a fresh Linux VPS. + +### Cleanup Status + +- Decision: destroy both Terraform and Pulumi-managed resources after verification. +- Teardown commands used: + +```bash +cd terraform +tofu destroy -auto-approve + +cd ../pulumi +pulumi destroy --yes +``` + +- Verification commands: + +```bash +docker ps --format '{{.Names}}' | rg 'lab04-local' || echo "No lab04 containers" +docker network ls --format '{{.Name}}' | rg 'lab04-local' || echo "No lab04 networks" +``` + +## Notes + +- This is a local Docker-provider adaptation of a cloud-VM lab. +- Suggestion: this lab could also use `localstack/localstack` (or forks) to emulate parts of AWS locally for free. + - + - + - The developer recently stated the end of support for this community image, but there will most probably be forks. diff --git a/pulumi/.gitignore b/pulumi/.gitignore new file mode 100644 index 0000000000..a3807e5bdb --- /dev/null +++ b/pulumi/.gitignore @@ -0,0 +1,2 @@ +*.pyc +venv/ diff --git a/pulumi/Pulumi.dev.yaml.example b/pulumi/Pulumi.dev.yaml.example new file mode 100644 index 0000000000..aaf637b3de --- /dev/null +++ b/pulumi/Pulumi.dev.yaml.example @@ -0,0 +1,10 @@ +config: + lab04-local-docker:projectName: lab04-local + lab04-local-docker:vmUser: devops + lab04-local-docker:sshPublicKey: "ssh-ed25519 AAAA... your-user@host" + lab04-local-docker:sshPrivateKeyPath: "~/.ssh/id_ed25519" + lab04-local-docker:sshBindIp: 127.0.0.1 + lab04-local-docker:publicBindIp: 0.0.0.0 + lab04-local-docker:sshHostPort: "2222" + lab04-local-docker:httpHostPort: "80" + lab04-local-docker:appHostPort: "5000" diff --git a/pulumi/Pulumi.yaml b/pulumi/Pulumi.yaml new file mode 100644 index 0000000000..a4a92ce5d1 --- /dev/null +++ b/pulumi/Pulumi.yaml @@ -0,0 +1,11 @@ +name: lab04-local-docker +description: IaC using Pulumi with local Docker provider. +runtime: + name: python + options: + toolchain: pip + virtualenv: venv +config: + pulumi:tags: + value: + pulumi:template: python diff --git a/pulumi/__main__.py b/pulumi/__main__.py new file mode 100644 index 0000000000..a26adf200d --- /dev/null +++ b/pulumi/__main__.py @@ -0,0 +1,82 @@ +from __future__ import annotations + +from dataclasses import dataclass +from pathlib import Path + +import pulumi +import pulumi_docker as docker + + +@dataclass(frozen=True) +class HostPorts: + ssh: int + http: int + app: int + + +config = pulumi.Config() + +project_name: str = config.get("projectName") or "lab04-local" +vm_user: str = config.get("vmUser") or "devops" +ssh_public_key: str = config.require("sshPublicKey") +ssh_private_key_path: str = config.get("sshPrivateKeyPath") or "~/.ssh/id_ed25519" +ssh_bind_ip: str = config.get("sshBindIp") or "127.0.0.1" +public_bind_ip: str = config.get("publicBindIp") or "0.0.0.0" + +ports = HostPorts( + ssh=config.get_int("sshHostPort") or 2222, + http=config.get_int("httpHostPort") or 80, + app=config.get_int("appHostPort") or 5000, +) + +labels: dict[str, str] = { + "lab": "04", + "managed-by": "pulumi", + "project": project_name, +} + +bootstrap_script = (Path(__file__).resolve().parent.parent / "docker" / "provision_vm.sh").read_text( + encoding="utf-8" +) + +network = docker.Network( + "lab04-net", + name=f"{project_name}-net", + labels=[docker.NetworkLabelArgs(label=k, value=v) for k, v in labels.items()], +) + +image = docker.RemoteImage( + "lab04-vm-image", + name="ubuntu:24.04", + keep_locally=True, +) + +container = docker.Container( + "lab04-vm", + name=f"{project_name}-vm", + image=image.repo_digest, + hostname=f"{project_name}-vm", + restart="unless-stopped", + command=["/bin/bash", "-lc", bootstrap_script], + envs=[f"VM_USER={vm_user}", f"SSH_PUBLIC_KEY={ssh_public_key}"], + ports=[ + docker.ContainerPortArgs(internal=22, external=ports.ssh, ip=ssh_bind_ip, protocol="tcp"), + docker.ContainerPortArgs(internal=80, external=ports.http, ip=public_bind_ip, protocol="tcp"), + docker.ContainerPortArgs(internal=5000, external=ports.app, ip=public_bind_ip, protocol="tcp"), + ], + labels=[docker.ContainerLabelArgs(label=k, value=v) for k, v in labels.items()], + networks_advanced=[ + docker.ContainerNetworksAdvancedArgs( + name=network.name, + aliases=[f"{project_name}-vm"], + ) + ], +) + +pulumi.export("vmName", container.name) +pulumi.export("networkName", network.name) +pulumi.export("publicIpEquivalent", "127.0.0.1") +pulumi.export("sshCommand", f"ssh -i {ssh_private_key_path} -p {ports.ssh} {vm_user}@127.0.0.1") +pulumi.export("containerShellCommand", f"docker exec -it {project_name}-vm /bin/bash") +pulumi.export("httpUrl", f"http://127.0.0.1:{ports.http}") +pulumi.export("appUrl", f"http://127.0.0.1:{ports.app}") diff --git a/pulumi/requirements.txt b/pulumi/requirements.txt new file mode 100644 index 0000000000..f5a5f5ebd4 --- /dev/null +++ b/pulumi/requirements.txt @@ -0,0 +1,2 @@ +pulumi>=3.0.0,<4.0.0 +pulumi_docker>=4.0.0,<5.0.0 diff --git a/terraform/README.md b/terraform/README.md new file mode 100644 index 0000000000..7097fc4b2c --- /dev/null +++ b/terraform/README.md @@ -0,0 +1,45 @@ +# Lab04 Terraform (Local Docker Provider) + +This Terraform project implements Lab04 with the local Docker provider instead of a cloud VM. + +## What It Creates + +- Docker network (`network/VPC` equivalent) +- Ubuntu 24.04 container (`VM/compute` equivalent) with startup bootstrap + - installs and starts `openssh-server` + - configures SSH authorized key + - starts simple HTTP endpoints on ports `80` and `5000` +- Port mappings as firewall equivalents: + - SSH: container `22` -> host `2222` (bound to `127.0.0.1`) + - HTTP: container `80` -> host `8080` + - App: container `5000` -> host `5000` + +## Local Prerequisites + +- Docker daemon running +- OpenTofu or Terraform CLI + +## Quick Start (OpenTofu) + +```bash +cp terraform/terraform.tfvars.example terraform/terraform.tfvars +# edit terraform.tfvars and set ssh_public_key + +cd terraform +tofu init -plugin-dir="$HOME/.terraform.d/plugins" +tofu plan +tofu apply -auto-approve + +# verify SSH +ssh -i ~/.ssh/id_ed25519 -p 2222 devops@127.0.0.1 'echo SSH_OK' +``` + +If provider download is blocked, manually place provider binaries under: +`~/.terraform.d/plugins/registry.terraform.io////linux_amd64/` + +## Destroy + +```bash +cd terraform +tofu destroy -auto-approve +``` diff --git a/terraform/main.tf b/terraform/main.tf new file mode 100644 index 0000000000..e5fc12074c --- /dev/null +++ b/terraform/main.tf @@ -0,0 +1,82 @@ +provider "docker" { + host = var.docker_host +} + +locals { + vm_name = "${var.project_name}-vm" + bootstrap_script = file("${path.module}/../docker/provision_vm.sh") + + default_labels = { + lab = "04" + managed-by = "terraform" + project = var.project_name + } + + resource_labels = merge(local.default_labels, var.extra_labels) +} + +resource "docker_network" "lab04" { + name = "${var.project_name}-net" + + dynamic "labels" { + for_each = local.resource_labels + + content { + label = labels.key + value = labels.value + } + } +} + +resource "docker_image" "vm_image" { + name = "ubuntu:24.04" + keep_locally = true +} + +resource "docker_container" "vm" { + name = local.vm_name + image = docker_image.vm_image.image_id + hostname = local.vm_name + restart = "unless-stopped" + command = ["/bin/bash", "-lc", local.bootstrap_script] + + env = [ + "VM_USER=${var.vm_user}", + "SSH_PUBLIC_KEY=${var.ssh_public_key}", + ] + + networks_advanced { + name = docker_network.lab04.name + aliases = [local.vm_name] + } + + ports { + internal = 22 + external = var.ssh_host_port + ip = var.ssh_bind_ip + protocol = "tcp" + } + + ports { + internal = 80 + external = var.http_host_port + ip = var.public_bind_ip + protocol = "tcp" + } + + ports { + internal = 5000 + external = var.app_host_port + ip = var.public_bind_ip + protocol = "tcp" + } + + dynamic "labels" { + for_each = local.resource_labels + + content { + label = labels.key + value = labels.value + } + } +} diff --git a/terraform/outputs.tf b/terraform/outputs.tf new file mode 100644 index 0000000000..d8130abbce --- /dev/null +++ b/terraform/outputs.tf @@ -0,0 +1,39 @@ +output "vm_name" { + description = "Name of the VM-like Docker container." + value = docker_container.vm.name +} + +output "network_name" { + description = "Name of the Docker network (VPC equivalent)." + value = docker_network.lab04.name +} + +output "container_ip" { + description = "Container IP inside the Docker network." + value = one(docker_container.vm.network_data).ip_address +} + +output "public_ip_equivalent" { + description = "Host endpoint used as public access in the local provider setup." + value = "127.0.0.1" +} + +output "ssh_command" { + description = "SSH command for the VM-like container." + value = "ssh -i ${var.ssh_private_key_path} -p ${var.ssh_host_port} ${var.vm_user}@127.0.0.1" +} + +output "container_shell_command" { + description = "Direct shell access without SSH." + value = "docker exec -it ${docker_container.vm.name} /bin/bash" +} + +output "http_url" { + description = "HTTP endpoint (port 80 equivalent)." + value = "http://127.0.0.1:${var.http_host_port}" +} + +output "app_url" { + description = "Application endpoint (port 5000 equivalent)." + value = "http://127.0.0.1:${var.app_host_port}" +} diff --git a/terraform/terraform.tfvars.example b/terraform/terraform.tfvars.example new file mode 100644 index 0000000000..2642161e51 --- /dev/null +++ b/terraform/terraform.tfvars.example @@ -0,0 +1,13 @@ +ssh_public_key = "ssh-ed25519 AAAA... your-user@host" + +# Optional overrides: +# vm_user = "devops" +# ssh_private_key_path = "~/.ssh/id_ed25519" +# ssh_host_port = 2222 +# http_host_port = 80 +# app_host_port = 5000 +# ssh_bind_ip = "127.0.0.1" +# public_bind_ip = "0.0.0.0" +# extra_labels = { +# owner = "your-name" +# } diff --git a/terraform/variables.tf b/terraform/variables.tf new file mode 100644 index 0000000000..d6ae2bfd65 --- /dev/null +++ b/terraform/variables.tf @@ -0,0 +1,80 @@ +variable "docker_host" { + description = "Docker daemon socket." + type = string + default = "unix:///var/run/docker.sock" +} + +variable "project_name" { + description = "Prefix used for Docker resource names." + type = string + default = "lab04-local" +} + +variable "vm_user" { + description = "Linux username created inside the VM-like container for SSH access." + type = string + default = "devops" +} + +variable "ssh_public_key" { + description = "SSH public key allowed to access the VM-like container." + type = string + sensitive = true +} + +variable "ssh_private_key_path" { + description = "Private key path used in the rendered SSH command output." + type = string + default = "~/.ssh/id_ed25519" +} + +variable "ssh_bind_ip" { + description = "Host IP used for SSH binding. Keep 127.0.0.1 to restrict access." + type = string + default = "127.0.0.1" +} + +variable "public_bind_ip" { + description = "Host IP used for HTTP and app ports." + type = string + default = "0.0.0.0" +} + +variable "ssh_host_port" { + description = "Host port mapped to container port 22." + type = number + default = 2222 + + validation { + condition = var.ssh_host_port >= 1 && var.ssh_host_port <= 65535 + error_message = "ssh_host_port must be between 1 and 65535." + } +} + +variable "http_host_port" { + description = "Host port mapped to container port 80." + type = number + default = 80 + + validation { + condition = var.http_host_port >= 1 && var.http_host_port <= 65535 + error_message = "http_host_port must be between 1 and 65535." + } +} + +variable "app_host_port" { + description = "Host port mapped to container port 5000." + type = number + default = 5000 + + validation { + condition = var.app_host_port >= 1 && var.app_host_port <= 65535 + error_message = "app_host_port must be between 1 and 65535." + } +} + +variable "extra_labels" { + description = "Additional Docker labels to attach to resources." + type = map(string) + default = {} +} diff --git a/terraform/versions.tf b/terraform/versions.tf new file mode 100644 index 0000000000..db6d92cec4 --- /dev/null +++ b/terraform/versions.tf @@ -0,0 +1,10 @@ +terraform { + required_version = ">= 1.9.0" + + required_providers { + docker = { + source = "registry.terraform.io/kreuzwerker/docker" + version = "~> 3.6" + } + } +} From e1c6693f6a75c49f01e29cf62e97d32e9db2045e Mon Sep 17 00:00:00 2001 From: LocalT0aster Dan <90502400+LocalT0aster@users.noreply.github.com> Date: Thu, 5 Mar 2026 23:57:13 +0300 Subject: [PATCH 05/21] Lab05 Completed (#5) * Vagrant VM * fix: Vagrant provisioning * Lab 5 done --- ansible/.gitignore | 3 + ansible/ansible.cfg | 13 + ansible/docs/LAB05.md | 319 ++++++++++++++++++ ansible/group_vars/all.yml | 22 ++ ansible/inventory/hosts.ini | 6 + ansible/playbooks/deploy.yml | 14 + ansible/playbooks/provision.yml | 18 + ansible/playbooks/site.yml | 3 + ansible/requirements.yml | 3 + .../defaults/app_deploy_defaults.yml | 22 ++ .../handlers/app_deploy_handlers.yml | 6 + .../app_deploy/tasks/app_deploy_tasks.yml | 88 +++++ .../roles/common/defaults/common_defaults.yml | 13 + ansible/roles/common/tasks/common_tasks.yml | 27 ++ .../roles/docker/defaults/docker_defaults.yml | 18 + .../roles/docker/handlers/docker_handlers.yml | 5 + ansible/roles/docker/tasks/docker_tasks.yml | 56 +++ vagrant/.gitignore | 9 + vagrant/README.md | 67 ++++ vagrant/Vagrantfile | 56 +++ vagrant/shared/provision-post-kernel.sh | 7 + vagrant/shared/provision.sh | 11 + 22 files changed, 786 insertions(+) create mode 100644 ansible/.gitignore create mode 100644 ansible/ansible.cfg create mode 100644 ansible/docs/LAB05.md create mode 100644 ansible/group_vars/all.yml create mode 100644 ansible/inventory/hosts.ini create mode 100644 ansible/playbooks/deploy.yml create mode 100644 ansible/playbooks/provision.yml create mode 100644 ansible/playbooks/site.yml create mode 100644 ansible/requirements.yml create mode 100644 ansible/roles/app_deploy/defaults/app_deploy_defaults.yml create mode 100644 ansible/roles/app_deploy/handlers/app_deploy_handlers.yml create mode 100644 ansible/roles/app_deploy/tasks/app_deploy_tasks.yml create mode 100644 ansible/roles/common/defaults/common_defaults.yml create mode 100644 ansible/roles/common/tasks/common_tasks.yml create mode 100644 ansible/roles/docker/defaults/docker_defaults.yml create mode 100644 ansible/roles/docker/handlers/docker_handlers.yml create mode 100644 ansible/roles/docker/tasks/docker_tasks.yml create mode 100644 vagrant/.gitignore create mode 100644 vagrant/README.md create mode 100644 vagrant/Vagrantfile create mode 100755 vagrant/shared/provision-post-kernel.sh create mode 100755 vagrant/shared/provision.sh diff --git a/ansible/.gitignore b/ansible/.gitignore new file mode 100644 index 0000000000..bd991b335c --- /dev/null +++ b/ansible/.gitignore @@ -0,0 +1,3 @@ +*.retry +.ansible/ +.vault_pass diff --git a/ansible/ansible.cfg b/ansible/ansible.cfg new file mode 100644 index 0000000000..a9c4a0b6a7 --- /dev/null +++ b/ansible/ansible.cfg @@ -0,0 +1,13 @@ +[defaults] +inventory = inventory/hosts.ini +roles_path = roles +host_key_checking = False +remote_user = ubuntu +retry_files_enabled = False +inject_facts_as_vars = False +vault_password_file = .vault_pass + +[privilege_escalation] +become = True +become_method = sudo +become_user = root diff --git a/ansible/docs/LAB05.md b/ansible/docs/LAB05.md new file mode 100644 index 0000000000..fedb8571b1 --- /dev/null +++ b/ansible/docs/LAB05.md @@ -0,0 +1,319 @@ +# LAB05 - Ansible Fundamentals + +## 1. Architecture Overview + +- Ansible version: `ansible [core 2.20.0]` +- Target VM OS/version: Ubuntu `24.04` +- Project layout: + +```text +ansible/ +├── inventory/hosts.ini +├── roles/ +│ ├── common/ +│ │ ├── tasks/common_tasks.yml +│ │ └── defaults/common_defaults.yml +│ ├── docker/ +│ │ ├── tasks/docker_tasks.yml +│ │ ├── defaults/docker_defaults.yml +│ │ └── handlers/docker_handlers.yml +│ └── app_deploy/ +│ ├── tasks/app_deploy_tasks.yml +│ ├── defaults/app_deploy_defaults.yml +│ └── handlers/app_deploy_handlers.yml +├── playbooks/ +│ ├── provision.yml +│ ├── deploy.yml +│ └── site.yml +├── group_vars/all.yml # encrypted with Ansible Vault +├── ansible.cfg +└── docs/LAB05.md +``` + +- Why roles instead of monolithic playbooks: + - Roles isolate concern-specific logic (base OS, Docker, app deploy). + - Reuse is easier across hosts/projects with role defaults. + - Testing and maintenance are simpler because responsibilities are separated. + - `include_role` with `tasks_from/defaults_from/handlers_from` keeps file names descriptive. + +## 2. Roles Documentation + +### `common` + +- Purpose: Baseline host configuration (APT cache, common tools, timezone). +- Key variables: + - `common_packages` + - `common_manage_timezone` + - `common_timezone` +- Handlers: none. +- Dependencies: none. + +### `docker` + +- Purpose: Install Docker CE from official Docker repository and prepare host for Docker Ansible modules. +- Key variables: + - `docker_packages` + - `docker_user` + - `docker_install_python_sdk` +- Handlers: + - `restart docker` +- Dependencies: + - Requires Ubuntu host and internet access. + +### `app_deploy` + +- Purpose: Authenticate to Docker Hub, pull image, replace container when needed, and verify app health. +- Key variables: + - `dockerhub_username` + - `dockerhub_password` (vaulted) + - `docker_image`, `docker_image_tag` + - `app_container_name`, `app_port` +- Handlers: + - `restart app container` +- Dependencies: + - Docker engine installed/running on target host. + +## 3. Idempotency Demonstration + +
+First run (`provision.yml`) +
+ +``` +$ ansible-playbook playbooks/provision.yml + +PLAY [Provision web servers] **************************************************************************** + +TASK [Gathering Facts] ********************************************************************************** +ok: [vagrant] + +TASK [Run common role tasks/defaults] ******************************************************************* +included: common for vagrant + +TASK [common : Update apt cache] ************************************************************************ +changed: [vagrant] + +TASK [common : Install common packages] ***************************************************************** +ok: [vagrant] + +TASK [common : Set /etc/timezone] *********************************************************************** +ok: [vagrant] + +TASK [common : Point /etc/localtime to selected timezone] *********************************************** +ok: [vagrant] + +TASK [Run docker role tasks/defaults/handlers] ********************************************************** +included: docker for vagrant + +TASK [docker : Install Docker prerequisites] ************************************************************ +changed: [vagrant] + +TASK [docker : Ensure Docker keyring directory exists] ************************************************** +ok: [vagrant] + +TASK [docker : Add Docker GPG key] ********************************************************************** +changed: [vagrant] + +TASK [docker : Add Docker apt repository] *************************************************************** +changed: [vagrant] + +TASK [docker : Install Docker engine packages] ********************************************************** +changed: [vagrant] + +TASK [docker : Install Docker Python SDK package] ******************************************************* +ok: [vagrant] + +TASK [docker : Ensure Docker service is enabled and running] ******************************************** +ok: [vagrant] + +TASK [docker : Add deployment user to docker group] ***************************************************** +changed: [vagrant] + +RUNNING HANDLER [docker : restart docker] *************************************************************** +changed: [vagrant] + +PLAY RECAP ********************************************************************************************** +vagrant : ok=16 changed=7 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 +``` + +
+Second run (`provision.yml`) + +``` +$ ansible-playbook playbooks/provision.yml + +PLAY [Provision web servers] *********************************************************************************************************** + +TASK [Gathering Facts] ***************************************************************************************************************** +ok: [vagrant] + +TASK [Run common role tasks/defaults] ************************************************************************************************** +included: common for vagrant + +TASK [common : Update apt cache] ******************************************************************************************************* +ok: [vagrant] + +TASK [common : Install common packages] ************************************************************************************************ +ok: [vagrant] + +TASK [common : Set /etc/timezone] ****************************************************************************************************** +ok: [vagrant] + +TASK [common : Point /etc/localtime to selected timezone] ****************************************************************************** +ok: [vagrant] + +TASK [Run docker role tasks/defaults/handlers] ***************************************************************************************** +included: docker for vagrant + +TASK [docker : Install Docker prerequisites] ******************************************************************************************* +ok: [vagrant] + +TASK [docker : Ensure Docker keyring directory exists] ********************************************************************************* +ok: [vagrant] + +TASK [docker : Add Docker GPG key] ***************************************************************************************************** +ok: [vagrant] + +TASK [docker : Add Docker apt repository] ********************************************************************************************** +ok: [vagrant] + +TASK [docker : Install Docker engine packages] ***************************************************************************************** +ok: [vagrant] + +TASK [docker : Install Docker Python SDK package] ************************************************************************************** +ok: [vagrant] + +TASK [docker : Ensure Docker service is enabled and running] *************************************************************************** +ok: [vagrant] + +TASK [docker : Add deployment user to docker group] ************************************************************************************ +ok: [vagrant] + +PLAY RECAP ***************************************************************************************************************************** +vagrant : ok=15 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 +``` + +
+ +### Analysis + +- First run: package/repository/service tasks report `changed`. +- Second run: all `ok` with `changed=0`. +- Idempotency is achieved by declarative module states (`state: present`, `state: started`, etc.). + +## 4. Ansible Vault Usage + +- Secrets are stored in `group_vars/all.yml`. +- File is encrypted with: + +```bash +ansible-vault encrypt group_vars/all.yml +``` + +- Why Vault matters: + - Protects credentials in VCS. + - Prevents accidental secret leakage in plaintext config files. + +## 5. Deployment Verification + +
+Deploy output + +``` +$ ansible-playbook playbooks/deploy.yml + +PLAY [Deploy application] ************************************************************************* + +TASK [Gathering Facts] **************************************************************************** +ok: [vagrant] + +TASK [Run app deploy role tasks/defaults/handlers] ************************************************ +included: app_deploy for vagrant + +TASK [app_deploy : Resolve Docker Hub auth secret] ************************************************ +ok: [vagrant] + +TASK [app_deploy : Validate required Docker Hub credentials] ************************************** +ok: [vagrant] => { + "changed": false, + "msg": "All assertions passed" +} + +TASK [app_deploy : Log in to Docker Hub] ********************************************************** +ok: [vagrant] + +TASK [app_deploy : Pull application image] ******************************************************** +ok: [vagrant] + +TASK [app_deploy : Check whether application container already exists] **************************** +ok: [vagrant] + +TASK [app_deploy : Stop existing container before replacement] ************************************ +skipping: [vagrant] + +TASK [app_deploy : Remove old container before replacement] *************************************** +skipping: [vagrant] + +TASK [app_deploy : Run application container] ***************************************************** +ok: [vagrant] + +TASK [app_deploy : Wait for application port] ***************************************************** +ok: [vagrant -> localhost] + +TASK [app_deploy : Verify application health endpoint] ******************************************** +ok: [vagrant -> localhost] + +PLAY RECAP **************************************************************************************** +vagrant : ok=10 changed=0 unreachable=0 failed=0 skipped=2 rescued=0 ignored=0 +``` + +
+ + +
+Container status + + +``` +$ ansible webservers -a "docker ps" +vagrant | CHANGED | rc=0 >> +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +6051f50e3f87 localt0aster/devops-app-py:latest "gunicorn --bind 0.0…" 8 minutes ago Up 8 minutes 0.0.0.0:5000->5000/tcp devops-app +``` + +
+ +### Health checks + +```bash +$ curl -fSsL 192.168.121.50:5000/health | jq +{ + "status": "healthy", + "timestamp": "2026-03-05T20:55:15.731873+00:00", + "uptime_seconds": 816 +} +``` + +## 6. Key Decisions + +- Why use roles instead of plain playbooks? + - Roles reduce duplication and keep each domain-focused (OS, Docker, app). + +- How do roles improve reusability? + - Defaults/handlers/tasks are reusable by attaching the same role to new host groups. + +- What makes a task idempotent? + - The task declares target state and changes only when current state differs. + +- How do handlers improve efficiency? + - Handlers execute only when notified by changed tasks, so restarts are conditional. + +- Why is Ansible Vault necessary? + - It allows storing sensitive values in the repository without exposing plaintext secrets. + +## 7. Challenges + +- Initial deploy attempt failed with 404 on `/health`. +- Root cause: container command ran `src.flask_instance:app` (routes not imported there). +- Fix: override container command to `src.main:app`, and run delegated health checks with `become: false` while using inventory host (`ansible_host`). +- After fix, deploy rerun completed with `failed=0` and healthy status. diff --git a/ansible/group_vars/all.yml b/ansible/group_vars/all.yml new file mode 100644 index 0000000000..8750d6b89b --- /dev/null +++ b/ansible/group_vars/all.yml @@ -0,0 +1,22 @@ +$ANSIBLE_VAULT;1.1;AES256 +39666562623135653036646261306635633634636232343333323866353531663931323438303138 +6633626630373139366232303730333766313330396266350a306530353938393263613230653865 +36316564363836633665366665363761333165373333303537353163376330376131636534636337 +6334623331643265330a373134326364376662643939396262313932326564316637666463633533 +63653666326265303566306331633165313161323130303962303734636638663832613039636361 +33666165613732336435376430396662613864363766303764353934333038636564316637656337 +32396261633039343635346439323532386665343065626438666265336335313433626562616261 +65663136613337326662643433316336346163643235303861613835366635623363396632643365 +65326466313366343530633163633434633365653462643438343730376339646363636239316139 +39306234353863666563393239343337396662383764333038386230363838353766626465616561 +35353262396465643135666436653938643836623862356539653463306434313862393435336535 +65346661316261363063623364356433663031626631386336636137353262653462636132626266 +33626530393235343039316139376339396366396135643864646236353365336536663264386534 +62653931396464636264333034373336666636643636653236356432663133633263656535386137 +32666362313331356532313963393230343332373931346638353463356333383963373131356537 +31633736363531366238346166336639303864376461313933303033306230623765633238633561 +32626463373235633461343365643135613561376634383536323131393932396362666430653633 +65336466323438636232386132653535623862333336666163346334303965376365353263663861 +33396363656361313134323063336638633639313038643636623631663336303632303462346235 +64626634653062663039393930316532326565663434633132306231306465336333633062396439 +6162 diff --git a/ansible/inventory/hosts.ini b/ansible/inventory/hosts.ini new file mode 100644 index 0000000000..da56b99798 --- /dev/null +++ b/ansible/inventory/hosts.ini @@ -0,0 +1,6 @@ +[webservers] +# Update host/user/key for your VM from Lab 4 +vagrant ansible_host=192.168.121.50 ansible_user=vagrant ansible_port=22 ansible_ssh_private_key_file=~/.ssh/vagrant + +[webservers:vars] +ansible_python_interpreter=/usr/bin/python3 diff --git a/ansible/playbooks/deploy.yml b/ansible/playbooks/deploy.yml new file mode 100644 index 0000000000..0710726c35 --- /dev/null +++ b/ansible/playbooks/deploy.yml @@ -0,0 +1,14 @@ +--- +- name: Deploy application + hosts: webservers + become: true + vars_files: + - ../group_vars/all.yml + + tasks: + - name: Run app deploy role tasks/defaults/handlers + ansible.builtin.include_role: + name: app_deploy + tasks_from: app_deploy_tasks + defaults_from: app_deploy_defaults + handlers_from: app_deploy_handlers diff --git a/ansible/playbooks/provision.yml b/ansible/playbooks/provision.yml new file mode 100644 index 0000000000..77ccedc3a1 --- /dev/null +++ b/ansible/playbooks/provision.yml @@ -0,0 +1,18 @@ +--- +- name: Provision web servers + hosts: webservers + become: true + + tasks: + - name: Run common role tasks/defaults + ansible.builtin.include_role: + name: common + tasks_from: common_tasks + defaults_from: common_defaults + + - name: Run docker role tasks/defaults/handlers + ansible.builtin.include_role: + name: docker + tasks_from: docker_tasks + defaults_from: docker_defaults + handlers_from: docker_handlers diff --git a/ansible/playbooks/site.yml b/ansible/playbooks/site.yml new file mode 100644 index 0000000000..139c08f693 --- /dev/null +++ b/ansible/playbooks/site.yml @@ -0,0 +1,3 @@ +--- +- import_playbook: provision.yml +- import_playbook: deploy.yml diff --git a/ansible/requirements.yml b/ansible/requirements.yml new file mode 100644 index 0000000000..660f775816 --- /dev/null +++ b/ansible/requirements.yml @@ -0,0 +1,3 @@ +--- +collections: + - name: community.docker diff --git a/ansible/roles/app_deploy/defaults/app_deploy_defaults.yml b/ansible/roles/app_deploy/defaults/app_deploy_defaults.yml new file mode 100644 index 0000000000..b98b9d0b27 --- /dev/null +++ b/ansible/roles/app_deploy/defaults/app_deploy_defaults.yml @@ -0,0 +1,22 @@ +--- +app_name: devops-app-py +docker_image: "{{ dockerhub_username }}/{{ app_name }}" +docker_image_tag: latest + +app_port: 5000 +app_container_name: devops-app +app_container_internal_port: 5000 +app_restart_policy: unless-stopped + +app_environment: + HOST: "0.0.0.0" + PORT: "{{ app_container_internal_port | string }}" +app_container_command: "gunicorn --bind 0.0.0.0:{{ app_container_internal_port }} src.main:app" + +app_healthcheck_path: /health +app_healthcheck_retries: 20 +app_healthcheck_delay: 3 +app_healthcheck_timeout: 3 +app_recreate_on_pull: true +app_healthcheck_host: "{{ ansible_host | default(inventory_hostname) }}" +app_healthcheck_delegate_to: localhost diff --git a/ansible/roles/app_deploy/handlers/app_deploy_handlers.yml b/ansible/roles/app_deploy/handlers/app_deploy_handlers.yml new file mode 100644 index 0000000000..1fc3fba48b --- /dev/null +++ b/ansible/roles/app_deploy/handlers/app_deploy_handlers.yml @@ -0,0 +1,6 @@ +--- +- name: restart app container + community.docker.docker_container: + name: "{{ app_container_name }}" + state: started + restart: true diff --git a/ansible/roles/app_deploy/tasks/app_deploy_tasks.yml b/ansible/roles/app_deploy/tasks/app_deploy_tasks.yml new file mode 100644 index 0000000000..4bab455012 --- /dev/null +++ b/ansible/roles/app_deploy/tasks/app_deploy_tasks.yml @@ -0,0 +1,88 @@ +--- +- name: Resolve Docker Hub auth secret + ansible.builtin.set_fact: + dockerhub_auth_secret: "{{ dockerhub_password | default(docker_api_token | default('')) }}" + no_log: true + +- name: Validate required Docker Hub credentials + ansible.builtin.assert: + that: + - dockerhub_username is defined + - dockerhub_username | string | length > 0 + - dockerhub_auth_secret | string | length > 0 + fail_msg: >- + Missing Docker Hub credentials. Define dockerhub_username and one of: + dockerhub_password or docker_api_token in ansible/group_vars/all.yml (vaulted). + +- name: Log in to Docker Hub + community.docker.docker_login: + registry_url: https://index.docker.io/v1/ + username: "{{ dockerhub_username }}" + password: "{{ dockerhub_auth_secret }}" + no_log: true + +- name: Pull application image + community.docker.docker_image: + name: "{{ docker_image }}:{{ docker_image_tag }}" + source: pull + register: app_image_pull + notify: restart app container + +- name: Check whether application container already exists + community.docker.docker_container_info: + name: "{{ app_container_name }}" + register: app_container_info + +- name: Stop existing container before replacement + community.docker.docker_container: + name: "{{ app_container_name }}" + state: stopped + when: + - app_container_info.exists | bool + - app_recreate_on_pull | bool + - app_image_pull.changed + - app_container_info.container is defined and app_container_info.container.State.Running | default(false) + +- name: Remove old container before replacement + community.docker.docker_container: + name: "{{ app_container_name }}" + state: absent + when: + - app_container_info.exists | bool + - app_recreate_on_pull | bool + - app_image_pull.changed + +- name: Run application container + community.docker.docker_container: + name: "{{ app_container_name }}" + image: "{{ docker_image }}:{{ docker_image_tag }}" + command: "{{ app_container_command | default(omit) }}" + state: started + restart_policy: "{{ app_restart_policy }}" + ports: + - "{{ app_port }}:{{ app_container_internal_port }}" + env: "{{ app_environment }}" + +- name: Wait for application port + ansible.builtin.wait_for: + host: "{{ app_healthcheck_host }}" + port: "{{ app_port | int }}" + timeout: 60 + delay: 1 + delegate_to: "{{ app_healthcheck_delegate_to }}" + become: false + +- name: Verify application health endpoint + ansible.builtin.uri: + url: "http://{{ app_healthcheck_host }}:{{ app_port }}{{ app_healthcheck_path }}" + method: GET + status_code: 200 + return_content: true + timeout: "{{ app_healthcheck_timeout | int }}" + register: app_healthcheck + retries: "{{ app_healthcheck_retries | int }}" + delay: "{{ app_healthcheck_delay | int }}" + until: app_healthcheck.status == 200 + failed_when: app_healthcheck.json.status | default("") != "healthy" + delegate_to: "{{ app_healthcheck_delegate_to }}" + become: false diff --git a/ansible/roles/common/defaults/common_defaults.yml b/ansible/roles/common/defaults/common_defaults.yml new file mode 100644 index 0000000000..65d0c186ad --- /dev/null +++ b/ansible/roles/common/defaults/common_defaults.yml @@ -0,0 +1,13 @@ +--- +common_packages: + - ca-certificates + - curl + - git + - htop + - vim + - python3-pip + - python3-apt + - tzdata + +common_manage_timezone: true +common_timezone: "Etc/UTC" diff --git a/ansible/roles/common/tasks/common_tasks.yml b/ansible/roles/common/tasks/common_tasks.yml new file mode 100644 index 0000000000..fbfff7a160 --- /dev/null +++ b/ansible/roles/common/tasks/common_tasks.yml @@ -0,0 +1,27 @@ +--- +- name: Update apt cache + ansible.builtin.apt: + update_cache: true + cache_valid_time: 3600 + +- name: Install common packages + ansible.builtin.apt: + name: "{{ common_packages }}" + state: present + +- name: Set /etc/timezone + ansible.builtin.copy: + dest: /etc/timezone + content: "{{ common_timezone }}\n" + owner: root + group: root + mode: "0644" + when: common_manage_timezone | bool + +- name: Point /etc/localtime to selected timezone + ansible.builtin.file: + src: "/usr/share/zoneinfo/{{ common_timezone }}" + dest: /etc/localtime + state: link + force: true + when: common_manage_timezone | bool diff --git a/ansible/roles/docker/defaults/docker_defaults.yml b/ansible/roles/docker/defaults/docker_defaults.yml new file mode 100644 index 0000000000..b6fee5c18c --- /dev/null +++ b/ansible/roles/docker/defaults/docker_defaults.yml @@ -0,0 +1,18 @@ +--- +docker_apt_arch_map: + x86_64: amd64 + aarch64: arm64 + armv7l: armhf + ppc64le: ppc64el + +docker_apt_arch: "{{ docker_apt_arch_map.get(ansible_facts['architecture'], ansible_facts['architecture']) }}" + +docker_packages: + - docker-ce + - docker-ce-cli + - containerd.io + - docker-buildx-plugin + - docker-compose-plugin + +docker_user: "{{ ansible_user | default('ubuntu') }}" +docker_install_python_sdk: true diff --git a/ansible/roles/docker/handlers/docker_handlers.yml b/ansible/roles/docker/handlers/docker_handlers.yml new file mode 100644 index 0000000000..1a5058da5e --- /dev/null +++ b/ansible/roles/docker/handlers/docker_handlers.yml @@ -0,0 +1,5 @@ +--- +- name: restart docker + ansible.builtin.service: + name: docker + state: restarted diff --git a/ansible/roles/docker/tasks/docker_tasks.yml b/ansible/roles/docker/tasks/docker_tasks.yml new file mode 100644 index 0000000000..e856b97cda --- /dev/null +++ b/ansible/roles/docker/tasks/docker_tasks.yml @@ -0,0 +1,56 @@ +--- +- name: Install Docker prerequisites + ansible.builtin.apt: + name: + - apt-transport-https + - ca-certificates + - curl + - gnupg + - software-properties-common + state: present + update_cache: true + +- name: Ensure Docker keyring directory exists + ansible.builtin.file: + path: /etc/apt/keyrings + state: directory + mode: "0755" + +- name: Add Docker GPG key + ansible.builtin.get_url: + url: https://download.docker.com/linux/ubuntu/gpg + dest: /etc/apt/keyrings/docker.asc + mode: "0644" + force: true + +- name: Add Docker apt repository + ansible.builtin.apt_repository: + repo: "deb [arch={{ docker_apt_arch }} signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu {{ ansible_facts['distribution_release'] }} stable" + filename: docker + state: present + update_cache: true + +- name: Install Docker engine packages + ansible.builtin.apt: + name: "{{ docker_packages }}" + state: present + notify: restart docker + +- name: Install Docker Python SDK package + ansible.builtin.apt: + name: python3-docker + state: present + when: docker_install_python_sdk | bool + +- name: Ensure Docker service is enabled and running + ansible.builtin.service: + name: docker + state: started + enabled: true + +- name: Add deployment user to docker group + ansible.builtin.user: + name: "{{ docker_user }}" + groups: docker + append: true + when: docker_user | length > 0 diff --git a/vagrant/.gitignore b/vagrant/.gitignore new file mode 100644 index 0000000000..09fd60c6cc --- /dev/null +++ b/vagrant/.gitignore @@ -0,0 +1,9 @@ + +# General +.vagrant/ + +# Log files (if you are creating logs in debug mode, uncomment this) +# *.log +shared/** +!shared/provision.sh +!shared/provision-post-kernel.sh diff --git a/vagrant/README.md b/vagrant/README.md new file mode 100644 index 0000000000..f7d3d056e3 --- /dev/null +++ b/vagrant/README.md @@ -0,0 +1,67 @@ +# Vagrant (libvirt) + +This VM is configured for the `libvirt` provider and uses: + +- Box: `alvistack/ubuntu-24.04` + +## Requirements + +- `vagrant` +- `libvirt` + `qemu`/`kvm` +- Vagrant plugin: `vagrant-libvirt` + +## Usage + +From repository root: + +```bash +cd vagrant +vagrant plugin install vagrant-libvirt +vagrant up +vagrant ssh +``` + +`vagrant up` automatically runs `shared/provision.sh` as root. +To re-run provisioning on an existing VM: + +```bash +vagrant provision +``` + +Provisioning is split into two stages: + +- `shared/provision.sh` (kernel/package update stage) +- automatic reboot between stages +- `shared/provision-post-kernel.sh` (post-kernel stage with ansible install) + +SSH key setup: + +- host private key path: `~/.ssh/vagrant` +- host public key path: `~/.ssh/vagrant.pub` +- public key is added to `/home/vagrant/.ssh/authorized_keys` during provisioning + +Static VM IP: + +- default: `192.168.121.50` +- override: `VM_IP=192.168.121.60 vagrant up` + +This setup uses: + +- management NIC (`eth0`, DHCP) for Vagrant internals +- static NIC (`eth1`, fixed IP above) for your direct SSH usage + +If the VM already existed before static IP was added, recreate it once: + +```bash +vagrant destroy -f +vagrant up --provider=libvirt +``` + +`~/.ssh/config` example: + +```sshconfig +Host vagrant + HostName 192.168.121.50 + User vagrant + IdentityFile ~/.ssh/vagrant +``` diff --git a/vagrant/Vagrantfile b/vagrant/Vagrantfile new file mode 100644 index 0000000000..53e78574f2 --- /dev/null +++ b/vagrant/Vagrantfile @@ -0,0 +1,56 @@ +Vagrant.configure("2") do |config| + config.vm.box = "alvistack/ubuntu-24.04" + config.vm.box_check_update = false + config.vm.hostname = "devops-core-s26" + vm_ip = ENV.fetch("VM_IP", "192.168.121.50") + + host_ssh_key = File.expand_path("~/.ssh/vagrant") + host_ssh_pub = "#{host_ssh_key}.pub" + + # Prefer host key for SSH, but keep Vagrant's insecure key as a fallback. + config.ssh.insert_key = false + config.ssh.private_key_path = [ + host_ssh_key, + File.expand_path("~/.vagrant.d/insecure_private_key") + ] + + # Keep project root available in the guest for labs and tooling. + config.vm.synced_folder ".", "/vagrant", disabled: true + config.vm.synced_folder "./shared", "/shared" + config.vm.network "private_network", ip: vm_ip + + # Install host public key for `vagrant` user access. + if File.exist?(host_ssh_pub) + config.vm.provision "file", source: host_ssh_pub, destination: "/tmp/vagrant.pub" + config.vm.provision "shell", + name: "install-host-ssh-key", + inline: <<-SHELL + set -euo pipefail + if [ ! -f /tmp/vagrant.pub ]; then + echo "Skipping host SSH key install: /tmp/vagrant.pub not found." + exit 0 + fi + install -d -m 700 /home/vagrant/.ssh + touch /home/vagrant/.ssh/authorized_keys + pub_key="$(cat /tmp/vagrant.pub)" + grep -qxF "$pub_key" /home/vagrant/.ssh/authorized_keys || echo "$pub_key" >> /home/vagrant/.ssh/authorized_keys + chown -R vagrant:vagrant /home/vagrant/.ssh + chmod 700 /home/vagrant/.ssh + chmod 600 /home/vagrant/.ssh/authorized_keys + rm -f /tmp/vagrant.pub + SHELL + end + + # Stage 1: update/purge packages, including kernel changes. + config.vm.provision "shell", + name: "kernel-update", + path: "shared/provision.sh", + reboot: true + # Stage 2: post-reboot setup. + config.vm.provision "shell", name: "post-kernel", path: "shared/provision-post-kernel.sh" + + config.vm.provider :libvirt do |libvirt| + libvirt.cpus = ENV.fetch("VM_CPUS", "2").to_i + libvirt.memory = ENV.fetch("VM_MEMORY", "4096").to_i + end +end diff --git a/vagrant/shared/provision-post-kernel.sh b/vagrant/shared/provision-post-kernel.sh new file mode 100755 index 0000000000..e555d98cf2 --- /dev/null +++ b/vagrant/shared/provision-post-kernel.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +if [ "$(id -u)" -ne 0 ]; then + echo "Please run this script as root or using sudo!" + exit 13 +fi +apt-get autoremove -y --allow-change-held-packages +apt-get install -y ansible diff --git a/vagrant/shared/provision.sh b/vagrant/shared/provision.sh new file mode 100755 index 0000000000..7cab63fa18 --- /dev/null +++ b/vagrant/shared/provision.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash +if [ $(id -u) -ne 0 ]; then + echo "Please run this script as root or using sudo!" + exit 13 +fi +rm /etc/apt/sources.list.d/cappelikan.sources /etc/apt/sources.list.d/home-alvistack.sources +apt-get update +apt-get purge -y --allow-change-held-packages ansible mainline sosreport +# upgrade kernel +apt-get autoremove -y --allow-change-held-packages +apt full-upgrade -y From 1e0c1a6d4d684ec642faf9bf29f03b9368ff1d52 Mon Sep 17 00:00:00 2001 From: LocalT0aster Dan <90502400+LocalT0aster@users.noreply.github.com> Date: Fri, 6 Mar 2026 08:45:38 +0300 Subject: [PATCH 06/21] Lab06 Completed (#6) * fix: app_python typo in Dockerfile * fix: remove the temp. fix from `ansible/` * ansible-lint config + tags * feat: tags + compose * feat: ansible wipe logic * feat: 2nd Vagrant VM with github-runner * I hope nothing explodes * fix: rebuild ansible ci venv on each run * fix: forgor about password * work please * feat: wrap up the report --- .github/actions/ansible-deploy/action.yml | 57 + .github/actions/ansible-lint/action.yml | 39 + .github/actions/ansible-setup/action.yml | 59 + .github/actions/ansible-ssh-setup/action.yml | 41 + .github/actions/http-healthcheck/action.yml | 50 + .github/workflows/ansible-deploy.yml | 147 + .gitignore | 3 + README.md | 1 + ansible/.ansible-lint | 14 + ansible/.gitignore | 1 + ansible/.yamllint.yml | 40 + ansible/docs/LAB06.md | 2459 +++++++++++++++++ ansible/playbooks/deploy.yml | 17 +- ansible/playbooks/provision.yml | 16 +- ansible/playbooks/site.yml | 35 +- ansible/requirements-ci.txt | 2 + ansible/requirements-lint.txt | 1 + .../defaults/app_deploy_defaults.yml | 22 - .../handlers/app_deploy_handlers.yml | 6 - .../app_deploy/tasks/app_deploy_tasks.yml | 88 - .../roles/common/defaults/common_defaults.yml | 6 + ansible/roles/common/tasks/common_tasks.yml | 78 +- .../roles/docker/defaults/docker_defaults.yml | 1 + .../{docker_handlers.yml => main.yml} | 2 +- ansible/roles/docker/tasks/docker_tasks.yml | 56 - ansible/roles/docker/tasks/main.yml | 145 + .../web_app/defaults/web_app_defaults.yml | 46 + ansible/roles/web_app/meta/main.yml | 10 + ansible/roles/web_app/tasks/web_app_tasks.yml | 117 + ansible/roles/web_app/tasks/wipe.yml | 69 + .../web_app/templates/docker-compose.yml.j2 | 21 + app_python/Dockerfile | 2 +- app_python/README.md | 4 +- vagrant/.gitignore | 3 + vagrant/README.md | 83 +- vagrant/Vagrantfile | 138 +- vagrant/shared/github-runner.env.example | 14 + .../shared/provision-gh-runner-register.sh | 100 + vagrant/shared/provision-gh-runner.sh | 91 + 39 files changed, 3843 insertions(+), 241 deletions(-) create mode 100644 .github/actions/ansible-deploy/action.yml create mode 100644 .github/actions/ansible-lint/action.yml create mode 100644 .github/actions/ansible-setup/action.yml create mode 100644 .github/actions/ansible-ssh-setup/action.yml create mode 100644 .github/actions/http-healthcheck/action.yml create mode 100644 .github/workflows/ansible-deploy.yml create mode 100644 ansible/.ansible-lint create mode 100644 ansible/.yamllint.yml create mode 100644 ansible/docs/LAB06.md create mode 100644 ansible/requirements-ci.txt create mode 100644 ansible/requirements-lint.txt delete mode 100644 ansible/roles/app_deploy/defaults/app_deploy_defaults.yml delete mode 100644 ansible/roles/app_deploy/handlers/app_deploy_handlers.yml delete mode 100644 ansible/roles/app_deploy/tasks/app_deploy_tasks.yml rename ansible/roles/docker/handlers/{docker_handlers.yml => main.yml} (75%) delete mode 100644 ansible/roles/docker/tasks/docker_tasks.yml create mode 100644 ansible/roles/docker/tasks/main.yml create mode 100644 ansible/roles/web_app/defaults/web_app_defaults.yml create mode 100644 ansible/roles/web_app/meta/main.yml create mode 100644 ansible/roles/web_app/tasks/web_app_tasks.yml create mode 100644 ansible/roles/web_app/tasks/wipe.yml create mode 100644 ansible/roles/web_app/templates/docker-compose.yml.j2 create mode 100644 vagrant/shared/github-runner.env.example create mode 100644 vagrant/shared/provision-gh-runner-register.sh create mode 100644 vagrant/shared/provision-gh-runner.sh diff --git a/.github/actions/ansible-deploy/action.yml b/.github/actions/ansible-deploy/action.yml new file mode 100644 index 0000000000..6382dc90a5 --- /dev/null +++ b/.github/actions/ansible-deploy/action.yml @@ -0,0 +1,57 @@ +name: Ansible Deploy +description: Run an Ansible playbook with vault decryption enabled + +inputs: + ansible-directory: + description: Directory containing the Ansible project + required: false + default: "ansible" + playbook-path: + description: Relative path to the playbook to execute + required: false + default: "playbooks/deploy.yml" + inventory-path: + description: Relative path to the inventory file + required: false + default: "inventory/hosts.ini" + vault-password: + description: Vault password used to decrypt encrypted vars + required: true + tags: + description: Comma-separated tag list to execute + required: false + default: "app_deploy" + +outputs: + log-path: + description: Path to the saved ansible-playbook log file + value: ${{ steps.deploy.outputs.log-path }} + +runs: + using: composite + steps: + - id: deploy + name: Run ansible-playbook + shell: bash + working-directory: ${{ inputs.ansible-directory }} + env: + VAULT_PASSWORD: ${{ inputs.vault-password }} + PLAYBOOK_PATH: ${{ inputs.playbook-path }} + INVENTORY_PATH: ${{ inputs.inventory-path }} + PLAYBOOK_TAGS: ${{ inputs.tags }} + run: | + set -euo pipefail + umask 077 + + log_path="${RUNNER_TEMP}/ansible-deploy.log" + + cleanup() { + rm -f .vault_pass + } + trap cleanup EXIT + + printf '%s\n' "$VAULT_PASSWORD" > .vault_pass + + ansible-playbook "$PLAYBOOK_PATH" -i "$INVENTORY_PATH" --tags "$PLAYBOOK_TAGS" | tee "$log_path" + + echo "log-path=$log_path" >> "$GITHUB_OUTPUT" diff --git a/.github/actions/ansible-lint/action.yml b/.github/actions/ansible-lint/action.yml new file mode 100644 index 0000000000..1a52f08ed6 --- /dev/null +++ b/.github/actions/ansible-lint/action.yml @@ -0,0 +1,39 @@ +name: Ansible Lint +description: Run ansible-lint and syntax checks with vault access + +inputs: + ansible-directory: + description: Directory containing the Ansible project + required: false + default: "ansible" + vault-password: + description: Vault password used to decrypt encrypted vars during linting + required: true + playbook-glob: + description: Playbook glob for ansible-lint + required: false + default: "playbooks/*.yml" + +runs: + using: composite + steps: + - name: Run ansible-lint and syntax checks + shell: bash + working-directory: ${{ inputs.ansible-directory }} + env: + VAULT_PASSWORD: ${{ inputs.vault-password }} + PLAYBOOK_GLOB: ${{ inputs.playbook-glob }} + run: | + set -euo pipefail + umask 077 + cleanup() { + rm -f .vault_pass + } + trap cleanup EXIT + + printf '%s\n' "$VAULT_PASSWORD" > .vault_pass + + ansible-lint $PLAYBOOK_GLOB + ansible-playbook playbooks/provision.yml --syntax-check + ansible-playbook playbooks/deploy.yml --syntax-check + ansible-playbook playbooks/site.yml --syntax-check diff --git a/.github/actions/ansible-setup/action.yml b/.github/actions/ansible-setup/action.yml new file mode 100644 index 0000000000..db9bf8e309 --- /dev/null +++ b/.github/actions/ansible-setup/action.yml @@ -0,0 +1,59 @@ +name: Ansible Setup +description: Set up a Python-based Ansible toolchain and required collections + +inputs: + python-version: + description: Python version to install + required: false + default: "3.12" + working-directory: + description: Directory containing the Ansible project + required: false + default: "ansible" + python-requirements-path: + description: Path to the pip requirements file + required: false + default: "ansible/requirements-ci.txt" + collection-requirements-path: + description: Path to the ansible-galaxy requirements file + required: false + default: "ansible/requirements.yml" + +runs: + using: composite + steps: + - name: Setup Python + uses: actions/setup-python@v5 + with: + python-version: ${{ inputs.python-version }} + + - name: Cache Ansible toolchain + uses: actions/cache@v4 + with: + path: | + ~/.cache/pip + ~/.ansible/collections + key: ${{ runner.os }}-py${{ inputs.python-version }}-ansible-${{ hashFiles(inputs.python-requirements-path, inputs.collection-requirements-path) }} + restore-keys: | + ${{ runner.os }}-py${{ inputs.python-version }}-ansible- + + - name: Install Python dependencies + shell: bash + run: | + set -euo pipefail + rm -rf "${{ inputs.working-directory }}/.venv-ci" + python -m venv "${{ inputs.working-directory }}/.venv-ci" + . "${{ inputs.working-directory }}/.venv-ci/bin/activate" + python -m pip install --upgrade pip + python -m pip install -r "${{ inputs.python-requirements-path }}" + + - name: Install Ansible collections + shell: bash + run: | + set -euo pipefail + . "${{ inputs.working-directory }}/.venv-ci/bin/activate" + ansible-galaxy collection install -r "${{ inputs.collection-requirements-path }}" + + - name: Add Ansible venv to PATH + shell: bash + run: echo "${{ github.workspace }}/${{ inputs.working-directory }}/.venv-ci/bin" >> "$GITHUB_PATH" diff --git a/.github/actions/ansible-ssh-setup/action.yml b/.github/actions/ansible-ssh-setup/action.yml new file mode 100644 index 0000000000..d682973fc9 --- /dev/null +++ b/.github/actions/ansible-ssh-setup/action.yml @@ -0,0 +1,41 @@ +name: Ansible SSH Setup +description: Install the SSH key material required for Ansible access + +inputs: + ssh-private-key: + description: Private SSH key used to connect to the target VM + required: true + ssh-key-path: + description: Destination path for the private key + required: false + default: "~/.ssh/vagrant" + known-host: + description: Optional host to add to known_hosts + required: false + default: "" + +runs: + using: composite + steps: + - name: Configure SSH credentials + shell: bash + env: + SSH_PRIVATE_KEY: ${{ inputs.ssh-private-key }} + SSH_KEY_PATH: ${{ inputs.ssh-key-path }} + KNOWN_HOST: ${{ inputs.known-host }} + run: | + set -euo pipefail + + key_path="${SSH_KEY_PATH/#\~/$HOME}" + + install -d -m 700 "$HOME/.ssh" + install -d -m 700 "$(dirname "$key_path")" + printf '%s\n' "$SSH_PRIVATE_KEY" > "$key_path" + chmod 600 "$key_path" + + touch "$HOME/.ssh/known_hosts" + chmod 600 "$HOME/.ssh/known_hosts" + + if [ -n "$KNOWN_HOST" ]; then + ssh-keyscan -H "$KNOWN_HOST" >> "$HOME/.ssh/known_hosts" 2>/dev/null || true + fi diff --git a/.github/actions/http-healthcheck/action.yml b/.github/actions/http-healthcheck/action.yml new file mode 100644 index 0000000000..a1886f690d --- /dev/null +++ b/.github/actions/http-healthcheck/action.yml @@ -0,0 +1,50 @@ +name: HTTP Healthcheck +description: Poll an HTTP endpoint until it returns healthy JSON + +inputs: + url: + description: URL to poll + required: true + retries: + description: Number of polling attempts before failure + required: false + default: "10" + delay-seconds: + description: Delay between retries in seconds + required: false + default: "3" + jq-filter: + description: jq expression that must evaluate to true + required: false + default: '.status == "healthy"' + +runs: + using: composite + steps: + - name: Poll health endpoint + shell: bash + env: + URL: ${{ inputs.url }} + RETRIES: ${{ inputs.retries }} + DELAY_SECONDS: ${{ inputs.delay-seconds }} + JQ_FILTER: ${{ inputs.jq-filter }} + run: | + set -euo pipefail + + response="" + + for attempt in $(seq 1 "$RETRIES"); do + if response="$(curl -fsSL "$URL")"; then + break + fi + + if [ "$attempt" -eq "$RETRIES" ]; then + echo "Health check failed after $RETRIES attempts: $URL" >&2 + exit 1 + fi + + sleep "$DELAY_SECONDS" + done + + echo "$response" | jq . + echo "$response" | jq -e "$JQ_FILTER" >/dev/null diff --git a/.github/workflows/ansible-deploy.yml b/.github/workflows/ansible-deploy.yml new file mode 100644 index 0000000000..ce0f001192 --- /dev/null +++ b/.github/workflows/ansible-deploy.yml @@ -0,0 +1,147 @@ +name: Ansible Deployment + +on: + push: + branches: + - master + - "lab*" + paths: + - ansible/** + - .github/actions/ansible-setup/** + - .github/actions/ansible-lint/** + - .github/actions/ansible-ssh-setup/** + - .github/actions/ansible-deploy/** + - .github/actions/http-healthcheck/** + - .github/workflows/ansible-deploy.yml + - "!ansible/docs/**" + pull_request: + branches: + - master + paths: + - ansible/** + - .github/actions/ansible-setup/** + - .github/actions/ansible-lint/** + - .github/actions/ansible-ssh-setup/** + - .github/actions/ansible-deploy/** + - .github/actions/http-healthcheck/** + - .github/workflows/ansible-deploy.yml + - "!ansible/docs/**" + workflow_dispatch: + +permissions: + contents: read + +concurrency: + group: ansible-deploy-${{ github.ref }} + cancel-in-progress: true + +env: + ANSIBLE_DIRECTORY: ansible + DEPLOY_PLAYBOOK: playbooks/deploy.yml + DEPLOY_TAGS: app_deploy + +jobs: + lint: + name: Ansible Lint + if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Ansible toolchain + uses: ./.github/actions/ansible-setup + + - name: Run lint and syntax checks + uses: ./.github/actions/ansible-lint + with: + ansible-directory: ${{ env.ANSIBLE_DIRECTORY }} + vault-password: ${{ secrets.ANSIBLE_VAULT_PASSWORD }} + + deploy: + name: Deploy Application + needs: lint + if: github.event_name != 'pull_request' + runs-on: + - self-hosted + - linux + - vagrant + timeout-minutes: 20 + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Ansible toolchain + uses: ./.github/actions/ansible-setup + + - name: Resolve target host from inventory + working-directory: ${{ env.ANSIBLE_DIRECTORY }} + run: | + set -euo pipefail + target_host="$( + awk ' + /^[[:space:]]*#/ { next } + /^\[/ { next } + NF { + for (i = 1; i <= NF; i++) { + if ($i ~ /^ansible_host=/) { + split($i, value, "=") + print value[2] + exit + } + } + } + ' inventory/hosts.ini + )" + + if [ -z "$target_host" ]; then + echo "Could not determine ansible_host from inventory/hosts.ini" >&2 + exit 1 + fi + + echo "TARGET_VM_HOST=$target_host" >> "$GITHUB_ENV" + + - name: Configure SSH access to the target VM + uses: ./.github/actions/ansible-ssh-setup + with: + ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }} + known-host: ${{ env.TARGET_VM_HOST }} + + - name: Prepare vault password file + working-directory: ${{ env.ANSIBLE_DIRECTORY }} + env: + VAULT_PASSWORD: ${{ secrets.ANSIBLE_VAULT_PASSWORD }} + run: | + set -euo pipefail + umask 077 + printf '%s\n' "$VAULT_PASSWORD" > .vault_pass + + - name: Verify target connectivity + working-directory: ${{ env.ANSIBLE_DIRECTORY }} + run: ansible webservers -m ansible.builtin.ping + + - id: deploy + name: Deploy web application + uses: ./.github/actions/ansible-deploy + with: + ansible-directory: ${{ env.ANSIBLE_DIRECTORY }} + playbook-path: ${{ env.DEPLOY_PLAYBOOK }} + vault-password: ${{ secrets.ANSIBLE_VAULT_PASSWORD }} + tags: ${{ env.DEPLOY_TAGS }} + + - name: Upload deployment log + if: always() && steps.deploy.outputs.log-path != '' + uses: actions/upload-artifact@v4 + with: + name: ansible-deploy-log + path: ${{ steps.deploy.outputs.log-path }} + + - name: Verify application health + uses: ./.github/actions/http-healthcheck + with: + url: http://${{ env.TARGET_VM_HOST }}:5000/health + + - name: Remove vault password file + if: always() + working-directory: ${{ env.ANSIBLE_DIRECTORY }} + run: rm -f .vault_pass diff --git a/.gitignore b/.gitignore index 67e6b52b28..6d94dd134e 100644 --- a/.gitignore +++ b/.gitignore @@ -29,3 +29,6 @@ __pycache__/ # IDE .vscode/ + +# Ansible runtime/cache +.ansible/ diff --git a/README.md b/README.md index 9955b0c611..4b917a299c 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,7 @@ [![Labs](https://img.shields.io/badge/Labs-18-blue)](#labs) [![Exam](https://img.shields.io/badge/Exam-Optional-green)](#exam-alternative) [![Duration](https://img.shields.io/badge/Duration-18%20Weeks-lightgrey)](#course-roadmap) +[![Ansible Deployment](https://github.com/LocalT0aster/DevOps-Core-S26/actions/workflows/ansible-deploy.yml/badge.svg)](https://github.com/LocalT0aster/DevOps-Core-S26/actions/workflows/ansible-deploy.yml) Master **production-grade DevOps practices** through hands-on labs. Build, containerize, deploy, monitor, and scale applications using industry-standard tools. diff --git a/ansible/.ansible-lint b/ansible/.ansible-lint new file mode 100644 index 0000000000..3a55c5e845 --- /dev/null +++ b/ansible/.ansible-lint @@ -0,0 +1,14 @@ +--- +profile: production +strict: true +use_default_rules: true +exclude_paths: + - .venv/ + - .ansible/ + - group_vars/all.yml + - docs/LAB05.md +enable_list: + - args + - empty-string-compare + - no-log-password + - no-prompting diff --git a/ansible/.gitignore b/ansible/.gitignore index bd991b335c..5985dd6f4a 100644 --- a/ansible/.gitignore +++ b/ansible/.gitignore @@ -1,3 +1,4 @@ *.retry .ansible/ +.venv/ .vault_pass diff --git a/ansible/.yamllint.yml b/ansible/.yamllint.yml new file mode 100644 index 0000000000..37734595da --- /dev/null +++ b/ansible/.yamllint.yml @@ -0,0 +1,40 @@ +--- +extends: default + +ignore: | + .venv/ + .ansible/ + group_vars/all.yml + docs/LAB05.md + +rules: + braces: + max-spaces-inside: 1 + comments: + min-spaces-from-content: 1 + comments-indentation: false + document-start: + present: true + empty-lines: + max: 1 + max-start: 0 + max-end: 0 + hyphens: + max-spaces-after: 1 + indentation: + spaces: 2 + indent-sequences: true + check-multi-line-strings: true + line-length: + max: 160 + allow-non-breakable-words: true + allow-non-breakable-inline-mappings: false + new-lines: + type: unix + octal-values: + forbid-implicit-octal: true + forbid-explicit-octal: true + trailing-spaces: enable + truthy: + allowed-values: ["true", "false"] + check-keys: true diff --git a/ansible/docs/LAB06.md b/ansible/docs/LAB06.md new file mode 100644 index 0000000000..48ef9ca971 --- /dev/null +++ b/ansible/docs/LAB06.md @@ -0,0 +1,2459 @@ +# LAB06 - Advanced Ansible & CI/CD + +## Task 1: Blocks & Tags (2 pts) + +### Overview + +For Task 1 I refactored the existing Ansible roles to use blocks, rescue handling, and tags without changing the repository's custom file naming convention. The lab sheet mentions `main.yml`, but this repository already uses descriptive files such as `common_tasks.yml` and `docker_tasks.yml`, so I kept that structure. + +### Implementation Details + +#### `common` role + +Changes made: + +- Grouped APT cache refresh and package installation into a `block` tagged `packages`. +- Added a `rescue` path that runs `apt-get update --fix-missing`, then retries the cache refresh and package installation. +- Added an `always` section that records block completion in `/tmp/ansible-common-role.log`. +- Added a separate `users` block that ensures managed users exist and also records completion. +- Kept timezone management outside the package block so `--tags packages` only runs package-related work. + +Practical result: + +- `--tags packages` runs only the package block. +- `--skip-tags common` skips the whole role because the playbook applies the `common` tag at role level. + +#### `docker` role + +Changes made: + +- Grouped Docker installation tasks into a `block` tagged `docker_install`. +- Added a `rescue` path that waits 10 seconds, refreshes APT metadata, and retries the Docker repository/key/package setup. +- Added an `always` section that ensures the Docker service is enabled and running after a successful install path. +- Grouped Docker configuration into a separate `block` tagged `docker_config`. +- Added completion logging to `/tmp/ansible-docker-role.log`. + +Practical result: + +- `--tags docker` runs the whole Docker role. +- `--tags docker_install` runs only installation-related work. +- Rescue behavior is visible in the collected logs. + +#### Playbook tag strategy + +Role-level tags are applied in the playbooks so the role can be selected as a whole, while block tags allow narrower execution. + +| Tag | Purpose | +| ---------------- | ---------------------------------------- | +| `common` | Entire common role | +| `packages` | Package install/update block in `common` | +| `users` | User-management block in `common` | +| `docker` | Entire docker role | +| `docker_install` | Docker installation and repository setup | +| `docker_config` | Docker host configuration | + +### Evidence + +The main evidence file is `task1.log`. + +#### 1. Selective execution with `--tags "docker"` + +This run exercised only the Docker role and also proved that the `rescue` section works: + +
+ansible-playbook playbooks/provision.yml --tags "docker" + +``` +$ ansible-playbook playbooks/provision.yml --tags "docker" + +PLAY [Provision web servers] **************************************************************************************************** + +TASK [Gathering Facts] ********************************************************************************************************** +ok: [vagrant] + +TASK [Run docker role tasks/defaults/handlers] ********************************************************************************** +included: docker for vagrant + +TASK [docker : Install Docker prerequisites] ************************************************************************************ +[WARNING]: Failed to update cache after 1 retries due to , retrying +[WARNING]: Sleeping for 2 seconds, before attempting to refresh the cache again +[WARNING]: Failed to update cache after 2 retries due to , retrying +[WARNING]: Sleeping for 3 seconds, before attempting to refresh the cache again +[WARNING]: Failed to update cache after 3 retries due to , retrying +[WARNING]: Sleeping for 5 seconds, before attempting to refresh the cache again +[WARNING]: Failed to update cache after 4 retries due to , retrying +[WARNING]: Sleeping for 9 seconds, before attempting to refresh the cache again +[WARNING]: Failed to update cache after 5 retries due to , retrying +[WARNING]: Sleeping for 13 seconds, before attempting to refresh the cache again +[ERROR]: Task failed: Module failed: Failed to update apt cache after 5 retries: +Origin: /home/t0ast/Repos/DevOps-Core-S26/ansible/roles/docker/tasks/docker_tasks.yml:7:7 + +5 - docker_install +6 block: +7 - name: Install Docker prerequisites + ^ column 7 + +fatal: [vagrant]: FAILED! => {"changed": false, "msg": "Failed to update apt cache after 5 retries: "} + +TASK [docker : Mark Docker install rescue as triggered] ************************************************************************* +ok: [vagrant] + +TASK [docker : Wait before retrying Docker apt setup] *************************************************************************** +Pausing for 10 seconds +(ctrl+C then 'C' = continue early, ctrl+C then 'A' = abort) +ok: [vagrant] + +TASK [docker : Refresh apt cache before Docker retry] *************************************************************************** +changed: [vagrant] + +TASK [docker : Retry adding Docker GPG key] ************************************************************************************* +ok: [vagrant] + +TASK [docker : Retry adding Docker apt repository] ****************************************************************************** +ok: [vagrant] + +TASK [docker : Retry installing Docker engine packages] ************************************************************************* +ok: [vagrant] + +TASK [docker : Retry installing Docker Python SDK package] ********************************************************************** +ok: [vagrant] + +TASK [docker : Mark Docker service as ready after retry] ************************************************************************ +ok: [vagrant] + +TASK [docker : Ensure Docker service is enabled and running] ******************************************************************** +ok: [vagrant] + +TASK [docker : Record Docker installation block completion] ********************************************************************* +changed: [vagrant] + +TASK [docker : Add deployment user to docker group] ***************************************************************************** +ok: [vagrant] + +TASK [docker : Record Docker configuration block completion] ******************************************************************** +ok: [vagrant] + +PLAY RECAP ********************************************************************************************************************** +vagrant : ok=14 changed=2 unreachable=0 failed=0 skipped=0 rescued=1 ignored=0 + +``` + +
+ +This is the strongest proof for Task 1 because it shows: + +- only the Docker role was selected, +- the block failed, +- the `rescue` path recovered successfully, +- the play still finished with `failed=0` and `rescued=1`. + +#### 2. Skipping the `common` role + +
+ansible-playbook playbooks/provision.yml --skip-tags "common" + +``` +$ ansible-playbook playbooks/provision.yml --skip-tags "common" +PLAY [Provision web servers] *************************************************** + +TASK [Gathering Facts] ********************************************************* +ok: [vagrant] + +TASK [Run docker role tasks/defaults/handlers] ********************************* +included: docker for vagrant + +TASK [docker : Install Docker prerequisites] *********************************** +ok: [vagrant] + +TASK [docker : Ensure Docker keyring directory exists] ************************* +ok: [vagrant] + +TASK [docker : Add Docker GPG key] ********************************************* +ok: [vagrant] + +TASK [docker : Add Docker apt repository] ************************************** +ok: [vagrant] + +TASK [docker : Install Docker engine packages] ********************************* +ok: [vagrant] + +TASK [docker : Install Docker Python SDK package] ****************************** +ok: [vagrant] + +TASK [docker : Mark Docker service as ready] *********************************** +ok: [vagrant] + +TASK [docker : Ensure Docker service is enabled and running] ******************* +ok: [vagrant] + +TASK [docker : Record Docker installation block completion] ******************** +ok: [vagrant] + +TASK [docker : Add deployment user to docker group] **************************** +ok: [vagrant] + +TASK [docker : Record Docker configuration block completion] ******************* +ok: [vagrant] + +PLAY RECAP ********************************************************************* +vagrant : ok=13 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 + +``` + +
+ +No `common` tasks ran, which confirms the role-level `common` tag is working. + +#### 3. Running package tasks only + +
+ansible-playbook playbooks/provision.yml --tags "packages" + +``` +$ ansible-playbook playbooks/provision.yml --tags "packages" +PLAY [Provision web servers] *************************************************** + +TASK [Gathering Facts] ********************************************************* +ok: [vagrant] + +TASK [Run common role tasks/defaults] ****************************************** +included: common for vagrant + +TASK [common : Update apt cache] *********************************************** +ok: [vagrant] + +TASK [common : Install common packages] **************************************** +ok: [vagrant] + +TASK [common : Record common packages block completion] ************************ +ok: [vagrant] + +PLAY RECAP ********************************************************************* +vagrant : ok=5 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 + +``` + +
+ +This shows the `packages` tag is narrow enough to avoid unrelated common-role tasks. + +#### 4. Check mode for Docker tasks + +
+ansible-playbook playbooks/provision.yml --tags "docker" --check + +``` +$ ansible-playbook playbooks/provision.yml --tags "docker" --check +PLAY [Provision web servers] *************************************************** + +TASK [Gathering Facts] ********************************************************* +ok: [vagrant] + +TASK [Run docker role tasks/defaults/handlers] ********************************* +included: docker for vagrant + +TASK [docker : Install Docker prerequisites] *********************************** +ok: [vagrant] + +TASK [docker : Ensure Docker keyring directory exists] ************************* +ok: [vagrant] + +TASK [docker : Add Docker GPG key] ********************************************* +changed: [vagrant] + +TASK [docker : Add Docker apt repository] ************************************** +ok: [vagrant] + +TASK [docker : Install Docker engine packages] ********************************* +ok: [vagrant] + +TASK [docker : Install Docker Python SDK package] ****************************** +ok: [vagrant] + +TASK [docker : Mark Docker service as ready] *********************************** +ok: [vagrant] + +TASK [docker : Ensure Docker service is enabled and running] ******************* +ok: [vagrant] + +TASK [docker : Record Docker installation block completion] ******************** +ok: [vagrant] + +TASK [docker : Add deployment user to docker group] **************************** +ok: [vagrant] + +TASK [docker : Record Docker configuration block completion] ******************* +ok: [vagrant] + +PLAY RECAP ********************************************************************* +vagrant : ok=13 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 + +``` + +
+ +Check mode completed without errors. One task reported `changed`, which is not surprising for repository/key download style tasks; check mode is useful, but not perfect, for external-resource operations. + +#### 5. Running only Docker installation tasks + +
+ansible-playbook playbooks/provision.yml --tags "docker_install" + +``` +$ ansible-playbook playbooks/provision.yml --tags "docker_install" +PLAY [Provision web servers] *************************************************** + +TASK [Gathering Facts] ********************************************************* +ok: [vagrant] + +TASK [Run docker role tasks/defaults/handlers] ********************************* +included: docker for vagrant + +TASK [docker : Install Docker prerequisites] *********************************** +ok: [vagrant] + +TASK [docker : Ensure Docker keyring directory exists] ************************* +ok: [vagrant] + +TASK [docker : Add Docker GPG key] ********************************************* +ok: [vagrant] + +TASK [docker : Add Docker apt repository] ************************************** +ok: [vagrant] + +TASK [docker : Install Docker engine packages] ********************************* +ok: [vagrant] + +TASK [docker : Install Docker Python SDK package] ****************************** +ok: [vagrant] + +TASK [docker : Mark Docker service as ready] *********************************** +ok: [vagrant] + +TASK [docker : Ensure Docker service is enabled and running] ******************* +ok: [vagrant] + +TASK [docker : Record Docker installation block completion] ******************** +ok: [vagrant] + +PLAY RECAP ********************************************************************* +vagrant : ok=11 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 + +``` + +
+ +This confirms that installation tasks can be isolated from broader Docker role execution. + +#### 6. Available tags + +Verified with: + +
+ansible-playbook playbooks/provision.yml --list-tags + +``` +$ ansible-playbook playbooks/provision.yml --list-tags + + +playbook: playbooks/provision.yml + + play #1 (webservers): Provision web servers TAGS: [] + TASK TAGS: [common, docker, docker_config, docker_install, packages, users] + +``` + +
+ +### Analysis + +Blocks improved the structure of both roles because related tasks are now grouped around a single intent instead of being scattered as flat tasks. In practice, this made the Docker install flow easier to reason about: install steps are in one place, recovery steps are in one place, and service enforcement is in one place. + +The rescue behavior in the Docker role is especially useful. The first `--tags "docker"` run showed a real transient APT/cache failure, and the play recovered automatically. That is more convincing than a purely theoretical discussion because the log captured an actual `rescued=1` run. + +The tag layout is also practical rather than decorative: + +- broad tags (`common`, `docker`) support role-level execution, +- narrow tags (`packages`, `users`, `docker_install`, `docker_config`) support targeted runs, +- the tag names are predictable and easy to remember during troubleshooting. + +### Research Answers + +1. **What happens if the rescue block also fails?** + - If a task inside `rescue` fails, the block is no longer recovered and the host stays failed for that task sequence. The `always` section still runs, but the play reports a failure unless some higher-level error handling changes that behavior. + +2. **Can you have nested blocks?** + - Yes. Ansible allows nested blocks. That said, I would use them carefully because deep nesting becomes hard to read quickly. + +3. **How do tags inherit to tasks within blocks?** + - Tags applied to a block are inherited by the tasks inside that block, including `rescue` and `always` tasks associated with the block. In this lab, role-level tags are applied from the playbook, while narrower tags are applied directly on the role blocks. + +--- + +## Task 2: Docker Compose + +### Implementation Summary + +- Renamed the deployment role from `app_deploy` to `web_app`. +- Kept descriptive role filenames for the web app implementation in `ansible/roles/web_app/tasks/web_app_tasks.yml` and `ansible/roles/web_app/defaults/web_app_defaults.yml`. +- Inlined the Docker role logic into `ansible/roles/docker/tasks/main.yml` and `ansible/roles/docker/handlers/main.yml`, leaving only the Ansible-required entrypoints as `main.yml`. +- Replaced the old single-container deployment logic with a Compose-based deployment in `ansible/roles/web_app/tasks/web_app_tasks.yml`. +- Added a Compose template in `ansible/roles/web_app/templates/docker-compose.yml.j2`. +- Added a role dependency in `ansible/roles/web_app/meta/main.yml` so `docker` is installed automatically before the app is deployed. +- Updated `ansible/playbooks/deploy.yml` and `ansible/playbooks/site.yml` to call `web_app`. + +### Compose Deployment Design + +The new role now: + +- optionally logs into Docker Hub when credentials are present, +- creates the project directory under `/opt/{{ app_name }}`, +- removes the legacy standalone container before migration to Compose, +- templates a `docker-compose.yml`, +- deploys the stack with `community.docker.docker_compose_v2`, +- waits for the application port and then verifies `/health`. + +### Practical Notes + +- I added retries around the Compose deployment step because the first live run hit a transient Docker Hub registry timeout. + +### Evidence + +The deployment now works end-to-end with Docker Compose: + +
+ansible-playbook playbooks/deploy.yml + +``` +$ ansible-playbook playbooks/deploy.yml + +PLAY [Deploy application] ******************************************************************************************************* + +TASK [Gathering Facts] ********************************************************************************************************** +ok: [vagrant] + +TASK [Run web app role] ********************************************************************************************************* +included: web_app for vagrant + +TASK [docker : Load docker role defaults] *************************************************************************************** +ok: [vagrant] + +TASK [docker : Install Docker prerequisites] ************************************************************************************ +ok: [vagrant] + +TASK [docker : Ensure Docker keyring directory exists] ************************************************************************** +ok: [vagrant] + +TASK [docker : Add Docker GPG key] ********************************************************************************************** +ok: [vagrant] + +TASK [docker : Add Docker apt repository] *************************************************************************************** +ok: [vagrant] + +TASK [docker : Install Docker engine packages] ********************************************************************************** +ok: [vagrant] + +TASK [docker : Install Docker Python SDK package] ******************************************************************************* +ok: [vagrant] + +TASK [docker : Mark Docker service as ready] ************************************************************************************ +ok: [vagrant] + +TASK [docker : Ensure Docker service is enabled and running] ******************************************************************** +ok: [vagrant] + +TASK [docker : Record Docker installation block completion] ********************************************************************* +ok: [vagrant] + +TASK [docker : Add deployment user to docker group] ***************************************************************************** +ok: [vagrant] + +TASK [docker : Record Docker configuration block completion] ******************************************************************** +ok: [vagrant] + +TASK [web_app : Log in to Docker Hub when credentials are available] ************************************************************ +ok: [vagrant] + +TASK [web_app : Ensure Compose project directory exists] ************************************************************************ +ok: [vagrant] + +TASK [web_app : Check for legacy standalone container] ************************************************************************** +ok: [vagrant] + +TASK [web_app : Remove legacy standalone container before Compose migration] **************************************************** +skipping: [vagrant] + +TASK [web_app : Template Docker Compose configuration] ************************************************************************** +ok: [vagrant] + +TASK [web_app : Deploy application stack with Docker Compose] ******************************************************************* +changed: [vagrant] + +TASK [web_app : Wait for application port] ************************************************************************************** +ok: [vagrant -> localhost] + +TASK [web_app : Verify application health endpoint] ***************************************************************************** +ok: [vagrant -> localhost] + +PLAY RECAP ********************************************************************************************************************** +vagrant : ok=21 changed=1 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0 +``` + +
+ +The second deployment run proves idempotency for the Compose-based deployment: + +
+ansible-playbook playbooks/deploy.yml (second run) + +``` +$ ansible-playbook playbooks/deploy.yml + +PLAY [Deploy application] ******************************************************************************************************* + +TASK [Gathering Facts] ********************************************************************************************************** +ok: [vagrant] + +TASK [Run web app role] ********************************************************************************************************* +included: web_app for vagrant + +TASK [docker : Load docker role defaults] *************************************************************************************** +ok: [vagrant] + +TASK [docker : Install Docker prerequisites] ************************************************************************************ +ok: [vagrant] + +TASK [docker : Ensure Docker keyring directory exists] ************************************************************************** +ok: [vagrant] + +TASK [docker : Add Docker GPG key] ********************************************************************************************** +ok: [vagrant] + +TASK [docker : Add Docker apt repository] *************************************************************************************** +ok: [vagrant] + +TASK [docker : Install Docker engine packages] ********************************************************************************** +ok: [vagrant] + +TASK [docker : Install Docker Python SDK package] ******************************************************************************* +ok: [vagrant] + +TASK [docker : Mark Docker service as ready] ************************************************************************************ +ok: [vagrant] + +TASK [docker : Ensure Docker service is enabled and running] ******************************************************************** +ok: [vagrant] + +TASK [docker : Record Docker installation block completion] ********************************************************************* +ok: [vagrant] + +TASK [docker : Add deployment user to docker group] ***************************************************************************** +ok: [vagrant] + +TASK [docker : Record Docker configuration block completion] ******************************************************************** +ok: [vagrant] + +TASK [web_app : Log in to Docker Hub when credentials are available] ************************************************************ +ok: [vagrant] + +TASK [web_app : Ensure Compose project directory exists] ************************************************************************ +ok: [vagrant] + +TASK [web_app : Check for legacy standalone container] ************************************************************************** +ok: [vagrant] + +TASK [web_app : Remove legacy standalone container before Compose migration] **************************************************** +skipping: [vagrant] + +TASK [web_app : Template Docker Compose configuration] ************************************************************************** +ok: [vagrant] + +TASK [web_app : Deploy application stack with Docker Compose] ******************************************************************* +ok: [vagrant] + +TASK [web_app : Wait for application port] ************************************************************************************** +ok: [vagrant -> localhost] + +TASK [web_app : Verify application health endpoint] ***************************************************************************** +ok: [vagrant -> localhost] + +PLAY RECAP ********************************************************************************************************************** +vagrant : ok=21 changed=0 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0 +``` + +
+ +Runtime verification on the VM confirms that the Compose stack is up and the application health endpoint is reachable: + +
+docker ps -a + +``` +vagrant@devops-core-s26:~$ docker ps -a +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +bc1ac63a19d3 localt0aster/devops-app-py:latest "sh -c 'gunicorn --b…" 13 seconds ago Up 12 seconds 0.0.0.0:5000->5000/tcp, [::]:5000->5000/tcp devops-app +``` + +
+ +
+docker compose -f /opt/devops-app-py/docker-compose.yml ps + +``` +vagrant@devops-core-s26:~$ docker compose -f /opt/devops-app-py/docker-compose.yml ps +NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS +devops-app localt0aster/devops-app-py:latest "sh -c 'gunicorn --b…" devops-app-py About a minute ago Up About a minute 0.0.0.0:5000->5000/tcp, [::]:5000->5000/tcp +``` + +
+ +
+curl -fSsL 127.0.0.1:5000/health | jq + +``` +vagrant@devops-core-s26:~$ curl -fSsL 127.0.0.1:5000/health | jq +{ + "status": "healthy", + "timestamp": "2026-03-06T03:15:05.637621+00:00", + "uptime_seconds": 139 +} +``` + +
+ +### Validation Status + +- `ansible-playbook playbooks/deploy.yml --syntax-check` passes. +- `ansible-playbook playbooks/site.yml --syntax-check` passes. +- `ansible-lint` passes on the Task 2 files. +- A real deploy run succeeds with `failed=0` and `changed=1`, confirming that the Compose-based deployment works. +- A second deploy run returns `changed=0`, which demonstrates idempotency for the Compose workflow. +- The VM shows the expected running container, Compose project status, and a healthy `/health` response. + +## Task 3: Wipe Logic + +### Implementation Summary + +- Added the wipe control variables to `ansible/roles/web_app/defaults/web_app_defaults.yml`. +- Added the wipe task file `ansible/roles/web_app/tasks/wipe.yml`. +- Included wipe processing at the top of `ansible/roles/web_app/tasks/web_app_tasks.yml` so clean reinstall works as wipe → deploy. +- Added the `web_app_wipe` tag to the `web_app` role includes in `ansible/playbooks/deploy.yml` and `ansible/playbooks/site.yml`. +- Added optional image and volume cleanup switches with safe defaults of `false`. + +### Safety Design + +The wipe logic uses two controls: +- `web_app_wipe: true` is required before any destructive action happens. +- `--tags web_app_wipe` allows wipe-only execution without running the deployment block. + +Practical behavior: +- Normal deployment leaves wipe tasks skipped because `web_app_wipe` defaults to `false`. +- `ansible-playbook playbooks/deploy.yml -e web_app_wipe=true --tags web_app_wipe` performs wipe only. +- `ansible-playbook playbooks/deploy.yml -e web_app_wipe=true` performs clean reinstall. + +I used `-e app_compose_pull_policy=missing` for the deploy-related wipe tests so Docker Hub availability would not distort the wipe-logic results. That override was only for testing. + +### Evidence + +The evidence file is `task3.log`. + +#### Scenario 1: Normal deployment + +This shows that wipe tasks are present in the role flow but are skipped by default when `web_app_wipe` is `false`. + +
+ansible-playbook playbooks/deploy.yml -e app_compose_pull_policy=missing + +``` +$ ansible-playbook playbooks/deploy.yml -e app_compose_pull_policy=missing + +PLAY [Deploy application] ****************************************************** + +TASK [Gathering Facts] ********************************************************* +ok: [vagrant] + +TASK [Run web app role] ******************************************************** +included: web_app for vagrant + +TASK [docker : Load docker role defaults] ************************************** +ok: [vagrant] + +TASK [docker : Install Docker prerequisites] *********************************** +ok: [vagrant] + +TASK [docker : Ensure Docker keyring directory exists] ************************* +ok: [vagrant] + +TASK [docker : Add Docker GPG key] ********************************************* +ok: [vagrant] + +TASK [docker : Add Docker apt repository] ************************************** +ok: [vagrant] + +TASK [docker : Install Docker engine packages] ********************************* +ok: [vagrant] + +TASK [docker : Install Docker Python SDK package] ****************************** +ok: [vagrant] + +TASK [docker : Mark Docker service as ready] *********************************** +ok: [vagrant] + +TASK [docker : Ensure Docker service is enabled and running] ******************* +ok: [vagrant] + +TASK [docker : Record Docker installation block completion] ******************** +ok: [vagrant] + +TASK [docker : Add deployment user to docker group] **************************** +ok: [vagrant] + +TASK [docker : Record Docker configuration block completion] ******************* +ok: [vagrant] + +TASK [web_app : Include web app wipe tasks] ************************************ +included: /home/t0ast/Repos/DevOps-Core-S26/ansible/roles/web_app/tasks/wipe.yml for vagrant + +TASK [web_app : Check whether Compose file exists for wipe] ******************** +ok: [vagrant] + +TASK [web_app : Stop and remove Compose-managed containers] ******************** +skipping: [vagrant] + +TASK [web_app : Remove standalone web app container if present] **************** +skipping: [vagrant] + +TASK [web_app : Remove Compose file] ******************************************* +skipping: [vagrant] + +TASK [web_app : Remove Compose project directory] ****************************** +skipping: [vagrant] + +TASK [web_app : Optionally remove deployed image] ****************************** +skipping: [vagrant] + +TASK [web_app : Record web app wipe completion] ******************************** +skipping: [vagrant] + +TASK [web_app : Report web app wipe status] ************************************ +skipping: [vagrant] + +TASK [web_app : Log in to Docker Hub when credentials are available] *********** +ok: [vagrant] + +TASK [web_app : Ensure Compose project directory exists] *********************** +ok: [vagrant] + +TASK [web_app : Check for legacy standalone container] ************************* +ok: [vagrant] + +TASK [web_app : Remove legacy standalone container before Compose migration] *** +skipping: [vagrant] + +TASK [web_app : Template Docker Compose configuration] ************************* +ok: [vagrant] + +TASK [web_app : Deploy application stack with Docker Compose] ****************** +ok: [vagrant] + +TASK [web_app : Wait for application port] ************************************* +ok: [vagrant -> localhost] + +TASK [web_app : Verify application health endpoint] **************************** +ok: [vagrant -> localhost] + +PLAY RECAP ********************************************************************* +vagrant : ok=23 changed=0 unreachable=0 failed=0 skipped=8 rescued=0 ignored=0 +``` + +
+ +
+ansible webservers -m ansible.builtin.command -a 'docker compose -f /opt/devops-app-py/docker-compose.yml ps' + +``` +$ ansible webservers -m ansible.builtin.command -a 'docker compose -f /opt/devops-app-py/docker-compose.yml ps' +vagrant | CHANGED | rc=0 >> +NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS +devops-app localt0aster/devops-app-py:latest "sh -c 'gunicorn --b…" devops-app-py 11 minutes ago Up 11 minutes 0.0.0.0:5000->5000/tcp, [::]:5000->5000/tcp +``` + +
+ +#### Scenario 2: Wipe only + +This is the explicit wipe-only path: variable enabled, tag selected, deployment tasks not executed. + +
+ansible-playbook playbooks/deploy.yml -e web_app_wipe=true --tags web_app_wipe + +``` +$ ansible-playbook playbooks/deploy.yml -e web_app_wipe=true --tags web_app_wipe + +PLAY [Deploy application] ****************************************************** + +TASK [Gathering Facts] ********************************************************* +ok: [vagrant] + +TASK [Run web app role] ******************************************************** +included: web_app for vagrant + +TASK [docker : Load docker role defaults] ************************************** +ok: [vagrant] + +TASK [web_app : Include web app wipe tasks] ************************************ +included: /home/t0ast/Repos/DevOps-Core-S26/ansible/roles/web_app/tasks/wipe.yml for vagrant + +TASK [web_app : Check whether Compose file exists for wipe] ******************** +ok: [vagrant] + +TASK [web_app : Stop and remove Compose-managed containers] ******************** +changed: [vagrant] + +TASK [web_app : Remove standalone web app container if present] **************** +ok: [vagrant] + +TASK [web_app : Remove Compose file] ******************************************* +changed: [vagrant] + +TASK [web_app : Remove Compose project directory] ****************************** +changed: [vagrant] + +TASK [web_app : Optionally remove deployed image] ****************************** +skipping: [vagrant] + +TASK [web_app : Record web app wipe completion] ******************************** +changed: [vagrant] + +TASK [web_app : Report web app wipe status] ************************************ +ok: [vagrant] => { + "msg": "Web app devops-app-py wipe completed. Project directory=/opt/devops-app-py." +} + +PLAY RECAP ********************************************************************* +vagrant : ok=11 changed=4 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0 +``` + +
+ +
+ansible webservers -m ansible.builtin.shell -a "docker ps -a | grep -F devops-app || true" + +``` +$ ansible webservers -m ansible.builtin.shell -a "docker ps -a | grep -F devops-app || true" +vagrant | CHANGED | rc=0 >> +``` + +
+ +
+ansible webservers -m ansible.builtin.shell -a "if [ -d /opt/devops-app-py ]; then echo present; else echo absent; fi" + +``` +$ ansible webservers -m ansible.builtin.shell -a "if [ -d /opt/devops-app-py ]; then echo present; else echo absent; fi" +vagrant | CHANGED | rc=0 >> +absent +``` + +
+ +#### Scenario 3: Clean reinstall + +This is the key workflow for Task 3: wipe first, then redeploy cleanly in the same playbook run. + +
+ansible-playbook playbooks/deploy.yml -e web_app_wipe=true -e app_compose_pull_policy=missing + +``` +$ ansible-playbook playbooks/deploy.yml -e web_app_wipe=true -e app_compose_pull_policy=missing + +PLAY [Deploy application] ****************************************************** + +TASK [Gathering Facts] ********************************************************* +ok: [vagrant] + +TASK [Run web app role] ******************************************************** +included: web_app for vagrant + +TASK [docker : Load docker role defaults] ************************************** +ok: [vagrant] + +TASK [docker : Install Docker prerequisites] *********************************** +ok: [vagrant] + +TASK [docker : Ensure Docker keyring directory exists] ************************* +ok: [vagrant] + +TASK [docker : Add Docker GPG key] ********************************************* +ok: [vagrant] + +TASK [docker : Add Docker apt repository] ************************************** +ok: [vagrant] + +TASK [docker : Install Docker engine packages] ********************************* +ok: [vagrant] + +TASK [docker : Install Docker Python SDK package] ****************************** +ok: [vagrant] + +TASK [docker : Mark Docker service as ready] *********************************** +ok: [vagrant] + +TASK [docker : Ensure Docker service is enabled and running] ******************* +ok: [vagrant] + +TASK [docker : Record Docker installation block completion] ******************** +ok: [vagrant] + +TASK [docker : Add deployment user to docker group] **************************** +ok: [vagrant] + +TASK [docker : Record Docker configuration block completion] ******************* +ok: [vagrant] + +TASK [web_app : Include web app wipe tasks] ************************************ +included: /home/t0ast/Repos/DevOps-Core-S26/ansible/roles/web_app/tasks/wipe.yml for vagrant + +TASK [web_app : Check whether Compose file exists for wipe] ******************** +ok: [vagrant] + +TASK [web_app : Stop and remove Compose-managed containers] ******************** +skipping: [vagrant] + +TASK [web_app : Remove standalone web app container if present] **************** +ok: [vagrant] + +TASK [web_app : Remove Compose file] ******************************************* +ok: [vagrant] + +TASK [web_app : Remove Compose project directory] ****************************** +ok: [vagrant] + +TASK [web_app : Optionally remove deployed image] ****************************** +skipping: [vagrant] + +TASK [web_app : Record web app wipe completion] ******************************** +changed: [vagrant] + +TASK [web_app : Report web app wipe status] ************************************ +ok: [vagrant] => { + "msg": "Web app devops-app-py wipe completed. Project directory=/opt/devops-app-py." +} + +TASK [web_app : Log in to Docker Hub when credentials are available] *********** +ok: [vagrant] + +TASK [web_app : Ensure Compose project directory exists] *********************** +changed: [vagrant] + +TASK [web_app : Check for legacy standalone container] ************************* +ok: [vagrant] + +TASK [web_app : Remove legacy standalone container before Compose migration] *** +skipping: [vagrant] + +TASK [web_app : Template Docker Compose configuration] ************************* +changed: [vagrant] + +TASK [web_app : Deploy application stack with Docker Compose] ****************** +changed: [vagrant] + +TASK [web_app : Wait for application port] ************************************* +ok: [vagrant -> localhost] + +TASK [web_app : Verify application health endpoint] **************************** +ok: [vagrant -> localhost] + +PLAY RECAP ********************************************************************* +vagrant : ok=28 changed=4 unreachable=0 failed=0 skipped=3 rescued=0 ignored=0 +``` + +
+ +
+ansible webservers -m ansible.builtin.command -a 'docker compose -f /opt/devops-app-py/docker-compose.yml ps' + +``` +$ ansible webservers -m ansible.builtin.command -a 'docker compose -f /opt/devops-app-py/docker-compose.yml ps' +vagrant | CHANGED | rc=0 >> +NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS +devops-app localt0aster/devops-app-py:latest "sh -c 'gunicorn --b…" devops-app-py 4 seconds ago Up 3 seconds 0.0.0.0:5000->5000/tcp, [::]:5000->5000/tcp +``` + +
+ +
+ansible webservers -m ansible.builtin.shell -a "curl -fSsL 127.0.0.1:5000/health" + +``` +$ ansible webservers -m ansible.builtin.shell -a "curl -fSsL 127.0.0.1:5000/health" +vagrant | CHANGED | rc=0 >> +{"status":"healthy","timestamp":"2026-03-06T03:24:46.458130+00:00","uptime_seconds":3} +``` + +
+ +#### Scenario 4: Safety checks + +For Scenario 4a, the lab text says deployment should run normally when `--tags web_app_wipe` is used with `web_app_wipe=false`. In practice, Ansible tag filtering only selects the wipe-tagged path, so the deployment block does not run. The existing application remains running, which still proves the wipe did not trigger. I believe the lab wording is internally inconsistent here. + +
+ansible-playbook playbooks/deploy.yml --tags web_app_wipe + +``` +$ ansible-playbook playbooks/deploy.yml --tags web_app_wipe + +PLAY [Deploy application] ****************************************************** + +TASK [Gathering Facts] ********************************************************* +ok: [vagrant] + +TASK [Run web app role] ******************************************************** +included: web_app for vagrant + +TASK [docker : Load docker role defaults] ************************************** +ok: [vagrant] + +TASK [web_app : Include web app wipe tasks] ************************************ +included: /home/t0ast/Repos/DevOps-Core-S26/ansible/roles/web_app/tasks/wipe.yml for vagrant + +TASK [web_app : Check whether Compose file exists for wipe] ******************** +ok: [vagrant] + +TASK [web_app : Stop and remove Compose-managed containers] ******************** +skipping: [vagrant] + +TASK [web_app : Remove standalone web app container if present] **************** +skipping: [vagrant] + +TASK [web_app : Remove Compose file] ******************************************* +skipping: [vagrant] + +TASK [web_app : Remove Compose project directory] ****************************** +skipping: [vagrant] + +TASK [web_app : Optionally remove deployed image] ****************************** +skipping: [vagrant] + +TASK [web_app : Record web app wipe completion] ******************************** +skipping: [vagrant] + +TASK [web_app : Report web app wipe status] ************************************ +skipping: [vagrant] + +PLAY RECAP ********************************************************************* +vagrant : ok=5 changed=0 unreachable=0 failed=0 skipped=7 rescued=0 ignored=0 +``` + +
+ +
+ansible webservers -m ansible.builtin.command -a 'docker compose -f /opt/devops-app-py/docker-compose.yml ps' + +``` +$ ansible webservers -m ansible.builtin.command -a 'docker compose -f /opt/devops-app-py/docker-compose.yml ps' +vagrant | CHANGED | rc=0 >> +NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS +devops-app localt0aster/devops-app-py:latest "sh -c 'gunicorn --b…" devops-app-py 11 minutes ago Up 11 minutes 0.0.0.0:5000->5000/tcp, [::]:5000->5000/tcp +``` + +
+ +Scenario 4b is effectively the same selective wipe-only path as Scenario 2, but rechecked after a clean reinstall. + +
+ansible-playbook playbooks/deploy.yml -e web_app_wipe=true --tags web_app_wipe + +``` +$ ansible-playbook playbooks/deploy.yml -e web_app_wipe=true --tags web_app_wipe + +PLAY [Deploy application] ****************************************************** + +TASK [Gathering Facts] ********************************************************* +ok: [vagrant] + +TASK [Run web app role] ******************************************************** +included: web_app for vagrant + +TASK [docker : Load docker role defaults] ************************************** +ok: [vagrant] + +TASK [web_app : Include web app wipe tasks] ************************************ +included: /home/t0ast/Repos/DevOps-Core-S26/ansible/roles/web_app/tasks/wipe.yml for vagrant + +TASK [web_app : Check whether Compose file exists for wipe] ******************** +ok: [vagrant] + +TASK [web_app : Stop and remove Compose-managed containers] ******************** +changed: [vagrant] + +TASK [web_app : Remove standalone web app container if present] **************** +ok: [vagrant] + +TASK [web_app : Remove Compose file] ******************************************* +changed: [vagrant] + +TASK [web_app : Remove Compose project directory] ****************************** +changed: [vagrant] + +TASK [web_app : Optionally remove deployed image] ****************************** +skipping: [vagrant] + +TASK [web_app : Record web app wipe completion] ******************************** +ok: [vagrant] + +TASK [web_app : Report web app wipe status] ************************************ +ok: [vagrant] => { + "msg": "Web app devops-app-py wipe completed. Project directory=/opt/devops-app-py." +} + +PLAY RECAP ********************************************************************* +vagrant : ok=11 changed=3 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0 +``` + +
+ +
+ansible webservers -m ansible.builtin.shell -a "docker ps -a | grep -F devops-app || true" + +``` +$ ansible webservers -m ansible.builtin.shell -a "docker ps -a | grep -F devops-app || true" +vagrant | CHANGED | rc=0 >> +``` + +
+ +
+ansible webservers -m ansible.builtin.shell -a "if [ -d /opt/devops-app-py ]; then echo present; else echo absent; fi" + +``` +$ ansible webservers -m ansible.builtin.shell -a "if [ -d /opt/devops-app-py ]; then echo present; else echo absent; fi" +vagrant | CHANGED | rc=0 >> +absent +``` + +
+ +### Validation Status + +- `ansible-playbook playbooks/deploy.yml --syntax-check` passes. +- `ansible-playbook playbooks/site.yml --syntax-check` passes. +- `ansible-lint` passes on the Task 3 files. +- `ansible-playbook playbooks/deploy.yml --list-tags` shows `web_app_wipe`. +- All four wipe scenarios were exercised against the VM. +- The application was restored after testing. + +### Research Answers + +1. **Why use both variable AND tag?** + - The variable is the destructive-action safety switch. The tag is the execution selector. Together they reduce accidental wipes and also support a wipe-only workflow without running normal deployment tasks. + +2. **What's the difference between `never` tag and this approach?** + - `never` disables tasks unless explicitly requested by tag, but it does not express business intent by itself. The variable-plus-tag approach is clearer because it encodes both operator intent and destructive permission. It is also easier to support clean reinstall with the same playbook run. + +3. **Why must wipe logic come BEFORE deployment?** + - Because clean reinstall is a sequential workflow: remove the old deployment first, then recreate it from a known-clean state. If wipe happened after deployment, it would destroy the fresh deployment. + +4. **When would you want clean reinstallation vs. rolling update?** + - Clean reinstall is useful when state is corrupted, migrations need a known baseline, or you want to prove reproducibility from scratch. Rolling update is better when you want lower disruption and the current deployment is already healthy. + +5. **How would you extend this to wipe Docker images and volumes too?** + - The current implementation already exposes `web_app_wipe_remove_images` and `web_app_wipe_remove_volumes`. To go further, I would add named-volume targeting, network cleanup verification, and possibly a confirmation variable for destructive data removal if persistent volumes matter. + + +## Task 4: CI/CD (3 pts) + +### Workflow Architecture + +- Added a dedicated GitHub Actions workflow in `.github/workflows/ansible-deploy.yml`. +- Split the workflow logic into local composite actions under `.github/actions/` so the workflow file stays orchestration-focused. +- Kept `lint` on `ubuntu-latest` and `deploy` on the isolated self-hosted runner labels `self-hosted`, `linux`, `vagrant`. +- Limited deployment to `push` and `workflow_dispatch`; pull requests run lint only. +- Added path filters so documentation-only changes under `ansible/docs/` do not trigger the deployment pipeline. + +### Modular Actions + +- `.github/actions/ansible-setup/action.yml` creates a Python virtual environment, installs `ansible-core` + `ansible-lint`, and installs required collections from `ansible/requirements.yml`. +- `.github/actions/ansible-lint/action.yml` writes the vault password to a temporary file, runs `ansible-lint`, and performs syntax checks on `provision.yml`, `deploy.yml`, and `site.yml`. +- `.github/actions/ansible-ssh-setup/action.yml` writes the target SSH key to `~/.ssh/vagrant` so the existing inventory file continues to work unchanged. +- `.github/actions/ansible-deploy/action.yml` runs `ansible-playbook playbooks/deploy.yml --tags app_deploy` and saves the playbook output as a workflow artifact. +- `.github/actions/http-healthcheck/action.yml` polls `http://:5000/health` and validates that the JSON reports `"status": "healthy"`. + +### Secrets and Repository Settings + +Required GitHub Actions secrets: +- `ANSIBLE_VAULT_PASSWORD` +- `SSH_PRIVATE_KEY` + +The workflow derives the deployment target IP from `ansible/inventory/hosts.ini`, so there is no second host variable to keep in sync. +The self-hosted runner itself is isolated in the separate `github-runner` Vagrant VM described in `vagrant/README.md`. + +### Files Added or Updated + +- Added `.github/workflows/ansible-deploy.yml` +- Added `.github/actions/ansible-setup/action.yml` +- Added `.github/actions/ansible-lint/action.yml` +- Added `.github/actions/ansible-ssh-setup/action.yml` +- Added `.github/actions/ansible-deploy/action.yml` +- Added `.github/actions/http-healthcheck/action.yml` +- Added `ansible/requirements-ci.txt` +- Added the workflow badge to `README.md` + +### Evidence + +The raw GitHub Actions run log is saved locally as `task4.log`. + +- Successful workflow run: +- Event: `push` +- Branch: `lab06` +- Result: `success` +- Lint job: +- Deploy job: +- Deployment log artifact: + +
+Workflow run summary + +```json +{ + "run_id": 22750506418, + "title": "work please", + "event": "push", + "branch": "lab06", + "status": "completed", + "conclusion": "success", + "created_at": "2026-03-06T05:29:07Z", + "updated_at": "2026-03-06T05:31:58Z" +} +``` + +
+ +
+Ansible Lint job excerpt + +```text +Passed: 0 failure(s), 0 warning(s) in 9 files processed of 9 encountered. Profile 'production' was required, and it passed. +playbook: playbooks/provision.yml +playbook: playbooks/deploy.yml +playbook: playbooks/site.yml +``` + +
+ +
+Deploy Application job excerpt + +```text +Prepare vault password file +Verify target connectivity +vagrant | SUCCESS => { + "changed": false, + "ping": "pong" +} +PLAY RECAP ********************************************************************* +vagrant : ok=22 changed=0 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0 +Artifact ansible-deploy-log has been successfully uploaded! Final size is 808 bytes. Artifact ID is 5792366004 +Remove vault password file +``` + +
+ +
+Health check excerpt + +```json +{ + "status": "healthy", + "timestamp": "2026-03-06T05:31:51.856613+00:00", + "uptime_seconds": 7603 +} +``` + +
+ +
+Full log + +```log +Ansible Lint Set up job 2026-03-06T05:29:10.5329423Z Current runner version: '2.332.0' +Ansible Lint Set up job 2026-03-06T05:29:10.5360328Z ##[group]Runner Image Provisioner +Ansible Lint Set up job 2026-03-06T05:29:10.5361185Z Hosted Compute Agent +Ansible Lint Set up job 2026-03-06T05:29:10.5361774Z Version: 20260213.493 +Ansible Lint Set up job 2026-03-06T05:29:10.5362403Z Commit: 5c115507f6dd24b8de37d8bbe0bb4509d0cc0fa3 +Ansible Lint Set up job 2026-03-06T05:29:10.5363145Z Build Date: 2026-02-13T00:28:41Z +Ansible Lint Set up job 2026-03-06T05:29:10.5363778Z Worker ID: {2041351a-97c7-45c8-90a5-5ac75b9b9cf3} +Ansible Lint Set up job 2026-03-06T05:29:10.5364557Z Azure Region: northcentralus +Ansible Lint Set up job 2026-03-06T05:29:10.5365170Z ##[endgroup] +Ansible Lint Set up job 2026-03-06T05:29:10.5366962Z ##[group]Operating System +Ansible Lint Set up job 2026-03-06T05:29:10.5367667Z Ubuntu +Ansible Lint Set up job 2026-03-06T05:29:10.5368167Z 24.04.3 +Ansible Lint Set up job 2026-03-06T05:29:10.5368631Z LTS +Ansible Lint Set up job 2026-03-06T05:29:10.5369148Z ##[endgroup] +Ansible Lint Set up job 2026-03-06T05:29:10.5369635Z ##[group]Runner Image +Ansible Lint Set up job 2026-03-06T05:29:10.5370202Z Image: ubuntu-24.04 +Ansible Lint Set up job 2026-03-06T05:29:10.5370770Z Version: 20260302.42.1 +Ansible Lint Set up job 2026-03-06T05:29:10.5371770Z Included Software: https://github.com/actions/runner-images/blob/ubuntu24/20260302.42/images/ubuntu/Ubuntu2404-Readme.md +Ansible Lint Set up job 2026-03-06T05:29:10.5373467Z Image Release: https://github.com/actions/runner-images/releases/tag/ubuntu24%2F20260302.42 +Ansible Lint Set up job 2026-03-06T05:29:10.5374434Z ##[endgroup] +Ansible Lint Set up job 2026-03-06T05:29:10.5375723Z ##[group]GITHUB_TOKEN Permissions +Ansible Lint Set up job 2026-03-06T05:29:10.5377590Z Contents: read +Ansible Lint Set up job 2026-03-06T05:29:10.5378212Z Metadata: read +Ansible Lint Set up job 2026-03-06T05:29:10.5378677Z ##[endgroup] +Ansible Lint Set up job 2026-03-06T05:29:10.5380727Z Secret source: Actions +Ansible Lint Set up job 2026-03-06T05:29:10.5381433Z Prepare workflow directory +Ansible Lint Set up job 2026-03-06T05:29:10.5877192Z Prepare all required actions +Ansible Lint Set up job 2026-03-06T05:29:10.5932576Z Getting action download info +Ansible Lint Set up job 2026-03-06T05:29:10.8794598Z Download action repository 'actions/checkout@v4' (SHA:34e114876b0b11c390a56381ad16ebd13914f8d5) +Ansible Lint Set up job 2026-03-06T05:29:11.1099497Z Complete job name: Ansible Lint +Ansible Lint Checkout code 2026-03-06T05:29:11.1884697Z ##[group]Run actions/checkout@v4 +Ansible Lint Checkout code 2026-03-06T05:29:11.1885706Z with: +Ansible Lint Checkout code 2026-03-06T05:29:11.1886156Z repository: LocalT0aster/DevOps-Core-S26 +Ansible Lint Checkout code 2026-03-06T05:29:11.1886842Z token: *** +Ansible Lint Checkout code 2026-03-06T05:29:11.1887231Z ssh-strict: true +Ansible Lint Checkout code 2026-03-06T05:29:11.1887635Z ssh-user: git +Ansible Lint Checkout code 2026-03-06T05:29:11.1888031Z persist-credentials: true +Ansible Lint Checkout code 2026-03-06T05:29:11.1888477Z clean: true +Ansible Lint Checkout code 2026-03-06T05:29:11.1888878Z sparse-checkout-cone-mode: true +Ansible Lint Checkout code 2026-03-06T05:29:11.1889348Z fetch-depth: 1 +Ansible Lint Checkout code 2026-03-06T05:29:11.1889753Z fetch-tags: false +Ansible Lint Checkout code 2026-03-06T05:29:11.1890154Z show-progress: true +Ansible Lint Checkout code 2026-03-06T05:29:11.1890571Z lfs: false +Ansible Lint Checkout code 2026-03-06T05:29:11.1890938Z submodules: false +Ansible Lint Checkout code 2026-03-06T05:29:11.1891331Z set-safe-directory: true +Ansible Lint Checkout code 2026-03-06T05:29:11.1891962Z env: +Ansible Lint Checkout code 2026-03-06T05:29:11.1892352Z ANSIBLE_DIRECTORY: ansible +Ansible Lint Checkout code 2026-03-06T05:29:11.1892850Z DEPLOY_PLAYBOOK: playbooks/deploy.yml +Ansible Lint Checkout code 2026-03-06T05:29:11.1893371Z DEPLOY_TAGS: app_deploy +Ansible Lint Checkout code 2026-03-06T05:29:11.1893792Z ##[endgroup] +Ansible Lint Checkout code 2026-03-06T05:29:11.2964777Z Syncing repository: LocalT0aster/DevOps-Core-S26 +Ansible Lint Checkout code 2026-03-06T05:29:11.2967010Z ##[group]Getting Git version info +Ansible Lint Checkout code 2026-03-06T05:29:11.2967786Z Working directory is '/home/runner/work/DevOps-Core-S26/DevOps-Core-S26' +Ansible Lint Checkout code 2026-03-06T05:29:11.2968817Z [command]/usr/bin/git version +Ansible Lint Checkout code 2026-03-06T05:29:11.3042020Z git version 2.53.0 +Ansible Lint Checkout code 2026-03-06T05:29:11.3067759Z ##[endgroup] +Ansible Lint Checkout code 2026-03-06T05:29:11.3081932Z Temporarily overriding HOME='/home/runner/work/_temp/890e68c6-2607-4793-b4c9-d348425e2444' before making global git config changes +Ansible Lint Checkout code 2026-03-06T05:29:11.3094172Z Adding repository directory to the temporary git global config as a safe directory +Ansible Lint Checkout code 2026-03-06T05:29:11.3095606Z [command]/usr/bin/git config --global --add safe.directory /home/runner/work/DevOps-Core-S26/DevOps-Core-S26 +Ansible Lint Checkout code 2026-03-06T05:29:11.3134382Z Deleting the contents of '/home/runner/work/DevOps-Core-S26/DevOps-Core-S26' +Ansible Lint Checkout code 2026-03-06T05:29:11.3138290Z ##[group]Initializing the repository +Ansible Lint Checkout code 2026-03-06T05:29:11.3142225Z [command]/usr/bin/git init /home/runner/work/DevOps-Core-S26/DevOps-Core-S26 +Ansible Lint Checkout code 2026-03-06T05:29:11.3230735Z hint: Using 'master' as the name for the initial branch. This default branch name +Ansible Lint Checkout code 2026-03-06T05:29:11.3232149Z hint: will change to "main" in Git 3.0. To configure the initial branch name +Ansible Lint Checkout code 2026-03-06T05:29:11.3233366Z hint: to use in all of your new repositories, which will suppress this warning, +Ansible Lint Checkout code 2026-03-06T05:29:11.3234537Z hint: call: +Ansible Lint Checkout code 2026-03-06T05:29:11.3235183Z hint: +Ansible Lint Checkout code 2026-03-06T05:29:11.3236155Z hint: git config --global init.defaultBranch +Ansible Lint Checkout code 2026-03-06T05:29:11.3236776Z hint: +Ansible Lint Checkout code 2026-03-06T05:29:11.3237351Z hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and +Ansible Lint Checkout code 2026-03-06T05:29:11.3238302Z hint: 'development'. The just-created branch can be renamed via this command: +Ansible Lint Checkout code 2026-03-06T05:29:11.3239050Z hint: +Ansible Lint Checkout code 2026-03-06T05:29:11.3239448Z hint: git branch -m +Ansible Lint Checkout code 2026-03-06T05:29:11.3240148Z hint: +Ansible Lint Checkout code 2026-03-06T05:29:11.3240823Z hint: Disable this message with "git config set advice.defaultBranchName false" +Ansible Lint Checkout code 2026-03-06T05:29:11.3242206Z Initialized empty Git repository in /home/runner/work/DevOps-Core-S26/DevOps-Core-S26/.git/ +Ansible Lint Checkout code 2026-03-06T05:29:11.3246185Z [command]/usr/bin/git remote add origin https://github.com/LocalT0aster/DevOps-Core-S26 +Ansible Lint Checkout code 2026-03-06T05:29:11.3279691Z ##[endgroup] +Ansible Lint Checkout code 2026-03-06T05:29:11.3280429Z ##[group]Disabling automatic garbage collection +Ansible Lint Checkout code 2026-03-06T05:29:11.3284110Z [command]/usr/bin/git config --local gc.auto 0 +Ansible Lint Checkout code 2026-03-06T05:29:11.3312715Z ##[endgroup] +Ansible Lint Checkout code 2026-03-06T05:29:11.3313412Z ##[group]Setting up auth +Ansible Lint Checkout code 2026-03-06T05:29:11.3319862Z [command]/usr/bin/git config --local --name-only --get-regexp core\.sshCommand +Ansible Lint Checkout code 2026-03-06T05:29:11.3350673Z [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'core\.sshCommand' && git config --local --unset-all 'core.sshCommand' || :" +Ansible Lint Checkout code 2026-03-06T05:29:11.3675159Z [command]/usr/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader +Ansible Lint Checkout code 2026-03-06T05:29:11.3706457Z [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'http\.https\:\/\/github\.com\/\.extraheader' && git config --local --unset-all 'http.https://github.com/.extraheader' || :" +Ansible Lint Checkout code 2026-03-06T05:29:11.3938616Z [command]/usr/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir: +Ansible Lint Checkout code 2026-03-06T05:29:11.3969877Z [command]/usr/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url +Ansible Lint Checkout code 2026-03-06T05:29:11.4214694Z [command]/usr/bin/git config --local http.https://github.com/.extraheader AUTHORIZATION: basic *** +Ansible Lint Checkout code 2026-03-06T05:29:11.4250962Z ##[endgroup] +Ansible Lint Checkout code 2026-03-06T05:29:11.4251733Z ##[group]Fetching the repository +Ansible Lint Checkout code 2026-03-06T05:29:11.4259070Z [command]/usr/bin/git -c protocol.version=2 fetch --no-tags --prune --no-recurse-submodules --depth=1 origin +2492c7d27ac02a50f12e2ca7f51bc1d7882b8489:refs/remotes/origin/lab06 +Ansible Lint Checkout code 2026-03-06T05:29:11.7606599Z From https://github.com/LocalT0aster/DevOps-Core-S26 +Ansible Lint Checkout code 2026-03-06T05:29:11.7607942Z * [new ref] 2492c7d27ac02a50f12e2ca7f51bc1d7882b8489 -> origin/lab06 +Ansible Lint Checkout code 2026-03-06T05:29:11.7641114Z ##[endgroup] +Ansible Lint Checkout code 2026-03-06T05:29:11.7641819Z ##[group]Determining the checkout info +Ansible Lint Checkout code 2026-03-06T05:29:11.7644340Z ##[endgroup] +Ansible Lint Checkout code 2026-03-06T05:29:11.7651042Z [command]/usr/bin/git sparse-checkout disable +Ansible Lint Checkout code 2026-03-06T05:29:11.7694047Z [command]/usr/bin/git config --local --unset-all extensions.worktreeConfig +Ansible Lint Checkout code 2026-03-06T05:29:11.7726044Z ##[group]Checking out the ref +Ansible Lint Checkout code 2026-03-06T05:29:11.7730689Z [command]/usr/bin/git checkout --progress --force -B lab06 refs/remotes/origin/lab06 +Ansible Lint Checkout code 2026-03-06T05:29:11.7916810Z Switched to a new branch 'lab06' +Ansible Lint Checkout code 2026-03-06T05:29:11.7920253Z branch 'lab06' set up to track 'origin/lab06'. +Ansible Lint Checkout code 2026-03-06T05:29:11.7927351Z ##[endgroup] +Ansible Lint Checkout code 2026-03-06T05:29:11.7961096Z [command]/usr/bin/git log -1 --format=%H +Ansible Lint Checkout code 2026-03-06T05:29:11.7984326Z 2492c7d27ac02a50f12e2ca7f51bc1d7882b8489 +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:11.8266011Z Prepare all required actions +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:11.8266740Z Getting action download info +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:11.9642088Z Download action repository 'actions/setup-python@v5' (SHA:a26af69be951a213d495a4c3e4e4022e16d87065) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:12.0926196Z Download action repository 'actions/cache@v4' (SHA:0057852bfaa89a56745cba8c7296529d2fc39830) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:12.2754803Z ##[group]Run ./.github/actions/ansible-setup +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:12.2756101Z with: +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:12.2756875Z python-version: 3.12 +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:12.2757772Z working-directory: ansible +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:12.2758919Z python-requirements-path: ansible/requirements-ci.txt +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:12.2760341Z collection-requirements-path: ansible/requirements.yml +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:12.2761526Z env: +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:12.2762260Z ANSIBLE_DIRECTORY: ansible +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:12.2763240Z DEPLOY_PLAYBOOK: playbooks/deploy.yml +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:12.2764268Z DEPLOY_TAGS: app_deploy +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:12.2765123Z ##[endgroup] +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:12.2953557Z ##[group]Run actions/setup-python@v5 +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:12.2954605Z with: +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:12.2955561Z python-version: 3.12 +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:12.2956433Z check-latest: false +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:12.2957494Z token: *** +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:12.2958279Z update-environment: true +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:12.2959180Z allow-prereleases: false +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:12.2960062Z freethreaded: false +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:12.2960864Z env: +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:12.2961589Z ANSIBLE_DIRECTORY: ansible +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:12.2962544Z DEPLOY_PLAYBOOK: playbooks/deploy.yml +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:12.2963542Z DEPLOY_TAGS: app_deploy +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:12.2964389Z ##[endgroup] +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:12.4642413Z ##[group]Installed versions +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:12.4726679Z Successfully set up CPython (3.12.12) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:12.4729711Z ##[endgroup] +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:12.5526985Z ##[group]Run actions/cache@v4 +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:12.5527927Z with: +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:12.5528767Z path: ~/.cache/pip +Ansible Lint Setup Ansible toolchain ~/.ansible/collections +Ansible Lint Setup Ansible toolchain +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:12.5530434Z key: Linux-py3.12-ansible-70fee6f2b98d7def1a2c43ddbf364d7b6b2648821ca185e0955c8d98e4cb9364 +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:12.5532114Z restore-keys: Linux-py3.12-ansible- +Ansible Lint Setup Ansible toolchain +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:12.5533131Z enableCrossOsArchive: false +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:12.5534054Z fail-on-cache-miss: false +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:12.5534903Z lookup-only: false +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:12.5535979Z save-always: false +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:12.5536767Z env: +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:12.5537478Z ANSIBLE_DIRECTORY: ansible +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:12.5538412Z DEPLOY_PLAYBOOK: playbooks/deploy.yml +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:12.5539397Z DEPLOY_TAGS: app_deploy +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:12.5540456Z pythonLocation: /opt/hostedtoolcache/Python/3.12.12/x64 +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:12.5541914Z PKG_CONFIG_PATH: /opt/hostedtoolcache/Python/3.12.12/x64/lib/pkgconfig +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:12.5543343Z Python_ROOT_DIR: /opt/hostedtoolcache/Python/3.12.12/x64 +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:12.5544669Z Python2_ROOT_DIR: /opt/hostedtoolcache/Python/3.12.12/x64 +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:12.5546641Z Python3_ROOT_DIR: /opt/hostedtoolcache/Python/3.12.12/x64 +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:12.5548045Z LD_LIBRARY_PATH: /opt/hostedtoolcache/Python/3.12.12/x64/lib +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:12.5549177Z ##[endgroup] +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:12.8056849Z Cache hit for: Linux-py3.12-ansible-70fee6f2b98d7def1a2c43ddbf364d7b6b2648821ca185e0955c8d98e4cb9364 +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:13.2661813Z Received 16876233 of 16876233 (100.0%), 45.1 MBs/sec +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:13.2662769Z Cache Size: ~16 MB (16876233 B) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:13.2695856Z [command]/usr/bin/tar -xf /home/runner/work/_temp/ed14daa5-3d21-447d-b84b-82030a283c55/cache.tzst -P -C /home/runner/work/DevOps-Core-S26/DevOps-Core-S26 --use-compress-program unzstd +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:13.3615615Z Cache restored successfully +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:13.3743008Z Cache restored from key: Linux-py3.12-ansible-70fee6f2b98d7def1a2c43ddbf364d7b6b2648821ca185e0955c8d98e4cb9364 +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:13.3852777Z ##[group]Run set -euo pipefail +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:13.3853186Z set -euo pipefail +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:13.3853496Z rm -rf "ansible/.venv-ci" +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:13.3853828Z python -m venv "ansible/.venv-ci" +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:13.3854470Z . "ansible/.venv-ci/bin/activate" +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:13.3854821Z python -m pip install --upgrade pip +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:13.3855722Z python -m pip install -r "ansible/requirements-ci.txt" +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:13.3912991Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:13.3913612Z env: +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:13.3913856Z ANSIBLE_DIRECTORY: ansible +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:13.3914173Z DEPLOY_PLAYBOOK: playbooks/deploy.yml +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:13.3914488Z DEPLOY_TAGS: app_deploy +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:13.3914830Z pythonLocation: /opt/hostedtoolcache/Python/3.12.12/x64 +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:13.3915535Z PKG_CONFIG_PATH: /opt/hostedtoolcache/Python/3.12.12/x64/lib/pkgconfig +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:13.3916011Z Python_ROOT_DIR: /opt/hostedtoolcache/Python/3.12.12/x64 +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:13.3916433Z Python2_ROOT_DIR: /opt/hostedtoolcache/Python/3.12.12/x64 +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:13.3916855Z Python3_ROOT_DIR: /opt/hostedtoolcache/Python/3.12.12/x64 +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:13.3917310Z LD_LIBRARY_PATH: /opt/hostedtoolcache/Python/3.12.12/x64/lib +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:13.3917678Z ##[endgroup] +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:17.4817418Z Requirement already satisfied: pip in ./ansible/.venv-ci/lib/python3.12/site-packages (25.0.1) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:17.5674329Z Collecting pip +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:17.5687767Z Using cached pip-26.0.1-py3-none-any.whl.metadata (4.7 kB) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:17.5720838Z Using cached pip-26.0.1-py3-none-any.whl (1.8 MB) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:17.5891297Z Installing collected packages: pip +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:17.5893687Z Attempting uninstall: pip +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:17.5915418Z Found existing installation: pip 25.0.1 +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:17.6291717Z Uninstalling pip-25.0.1: +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:17.6349799Z Successfully uninstalled pip-25.0.1 +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:18.7331183Z Successfully installed pip-26.0.1 +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:19.2368546Z Collecting ansible-core<2.20,>=2.16 (from -r ansible/requirements-ci.txt (line 1)) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:19.2386317Z Using cached ansible_core-2.19.7-py3-none-any.whl.metadata (7.7 kB) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:19.2666691Z Collecting ansible-lint==26.3.0 (from -r ansible/requirements-ci.txt (line 2)) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:19.2678442Z Using cached ansible_lint-26.3.0-py3-none-any.whl.metadata (6.2 kB) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:19.2841853Z Collecting ansible-compat>=25.8.2 (from ansible-lint==26.3.0->-r ansible/requirements-ci.txt (line 2)) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:19.2853515Z Using cached ansible_compat-25.12.1-py3-none-any.whl.metadata (3.4 kB) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:19.3324507Z Collecting black>=24.3.0 (from ansible-lint==26.3.0->-r ansible/requirements-ci.txt (line 2)) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:19.3340053Z Using cached black-26.1.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.metadata (88 kB) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:19.4392554Z Collecting cffi>=1.15.1 (from ansible-lint==26.3.0->-r ansible/requirements-ci.txt (line 2)) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:19.4410566Z Using cached cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.metadata (2.6 kB) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:19.6020587Z Collecting cryptography>=37 (from ansible-lint==26.3.0->-r ansible/requirements-ci.txt (line 2)) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:19.6039889Z Using cached cryptography-46.0.5-cp311-abi3-manylinux_2_34_x86_64.whl.metadata (5.7 kB) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:19.6171492Z Collecting distro>=1.9.0 (from ansible-lint==26.3.0->-r ansible/requirements-ci.txt (line 2)) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:19.6182889Z Using cached distro-1.9.0-py3-none-any.whl.metadata (6.8 kB) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:19.6342972Z Collecting filelock>=3.8.2 (from ansible-lint==26.3.0->-r ansible/requirements-ci.txt (line 2)) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:19.6354454Z Using cached filelock-3.25.0-py3-none-any.whl.metadata (2.0 kB) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:19.6530994Z Collecting jsonschema>=4.10.0 (from ansible-lint==26.3.0->-r ansible/requirements-ci.txt (line 2)) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:19.6542552Z Using cached jsonschema-4.26.0-py3-none-any.whl.metadata (7.6 kB) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:19.6681268Z Collecting packaging>=22.0 (from ansible-lint==26.3.0->-r ansible/requirements-ci.txt (line 2)) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:19.6693036Z Using cached packaging-26.0-py3-none-any.whl.metadata (3.3 kB) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:19.6782352Z Collecting pathspec<1.1.0,>=1.0.3 (from ansible-lint==26.3.0->-r ansible/requirements-ci.txt (line 2)) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:19.6793421Z Using cached pathspec-1.0.4-py3-none-any.whl.metadata (13 kB) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:19.7114486Z Collecting pyyaml>=6.0.1 (from ansible-lint==26.3.0->-r ansible/requirements-ci.txt (line 2)) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:19.7127355Z Using cached pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.metadata (2.4 kB) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:19.7288961Z Collecting referencing>=0.36.2 (from ansible-lint==26.3.0->-r ansible/requirements-ci.txt (line 2)) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:19.7300535Z Using cached referencing-0.37.0-py3-none-any.whl.metadata (2.8 kB) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:19.8438693Z Collecting ruamel-yaml>=0.18.11 (from ansible-lint==26.3.0->-r ansible/requirements-ci.txt (line 2)) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:19.8451054Z Using cached ruamel_yaml-0.19.1-py3-none-any.whl.metadata (16 kB) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:19.8808593Z Collecting ruamel-yaml-clib>=0.2.12 (from ansible-lint==26.3.0->-r ansible/requirements-ci.txt (line 2)) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:19.8822030Z Using cached ruamel_yaml_clib-0.2.15-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.metadata (3.5 kB) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:19.8919802Z Collecting subprocess-tee>=0.4.1 (from ansible-lint==26.3.0->-r ansible/requirements-ci.txt (line 2)) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:19.8931570Z Using cached subprocess_tee-0.4.2-py3-none-any.whl.metadata (3.3 kB) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:19.9056242Z Collecting wcmatch>=8.5.0 (from ansible-lint==26.3.0->-r ansible/requirements-ci.txt (line 2)) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:19.9067895Z Using cached wcmatch-10.1-py3-none-any.whl.metadata (5.1 kB) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:19.9186855Z Collecting yamllint>=1.38.0 (from ansible-lint==26.3.0->-r ansible/requirements-ci.txt (line 2)) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:19.9197893Z Using cached yamllint-1.38.0-py3-none-any.whl.metadata (4.2 kB) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:19.9318148Z Collecting jinja2>=3.1.0 (from ansible-core<2.20,>=2.16->-r ansible/requirements-ci.txt (line 1)) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:19.9329139Z Using cached jinja2-3.1.6-py3-none-any.whl.metadata (2.9 kB) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:19.9434075Z Collecting resolvelib<2.0.0,>=0.5.3 (from ansible-core<2.20,>=2.16->-r ansible/requirements-ci.txt (line 1)) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:19.9445494Z Using cached resolvelib-1.2.1-py3-none-any.whl.metadata (3.7 kB) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:19.9621498Z Collecting click>=8.0.0 (from black>=24.3.0->ansible-lint==26.3.0->-r ansible/requirements-ci.txt (line 2)) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:19.9632716Z Using cached click-8.3.1-py3-none-any.whl.metadata (2.6 kB) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:19.9715932Z Collecting mypy-extensions>=0.4.3 (from black>=24.3.0->ansible-lint==26.3.0->-r ansible/requirements-ci.txt (line 2)) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:19.9727321Z Using cached mypy_extensions-1.1.0-py3-none-any.whl.metadata (1.1 kB) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:19.9890085Z Collecting platformdirs>=2 (from black>=24.3.0->ansible-lint==26.3.0->-r ansible/requirements-ci.txt (line 2)) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:19.9901303Z Using cached platformdirs-4.9.4-py3-none-any.whl.metadata (4.7 kB) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:20.0017127Z Collecting pytokens>=0.3.0 (from black>=24.3.0->ansible-lint==26.3.0->-r ansible/requirements-ci.txt (line 2)) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:20.0028577Z Using cached pytokens-0.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.metadata (3.8 kB) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:20.0121729Z Collecting pycparser (from cffi>=1.15.1->ansible-lint==26.3.0->-r ansible/requirements-ci.txt (line 2)) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:20.0132684Z Using cached pycparser-3.0-py3-none-any.whl.metadata (8.2 kB) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:20.0616368Z Collecting MarkupSafe>=2.0 (from jinja2>=3.1.0->ansible-core<2.20,>=2.16->-r ansible/requirements-ci.txt (line 1)) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:20.0628729Z Using cached markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.metadata (2.7 kB) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:20.0956111Z Collecting attrs>=22.2.0 (from jsonschema>=4.10.0->ansible-lint==26.3.0->-r ansible/requirements-ci.txt (line 2)) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:20.0968028Z Using cached attrs-25.4.0-py3-none-any.whl.metadata (10 kB) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:20.1071916Z Collecting jsonschema-specifications>=2023.03.6 (from jsonschema>=4.10.0->ansible-lint==26.3.0->-r ansible/requirements-ci.txt (line 2)) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:20.1087218Z Using cached jsonschema_specifications-2025.9.1-py3-none-any.whl.metadata (2.9 kB) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:20.3427391Z Collecting rpds-py>=0.25.0 (from jsonschema>=4.10.0->ansible-lint==26.3.0->-r ansible/requirements-ci.txt (line 2)) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:20.3441048Z Using cached rpds_py-0.30.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (4.1 kB) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:20.3652689Z Collecting typing-extensions>=4.4.0 (from referencing>=0.36.2->ansible-lint==26.3.0->-r ansible/requirements-ci.txt (line 2)) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:20.3664703Z Using cached typing_extensions-4.15.0-py3-none-any.whl.metadata (3.3 kB) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:20.3790215Z Collecting bracex>=2.1.1 (from wcmatch>=8.5.0->ansible-lint==26.3.0->-r ansible/requirements-ci.txt (line 2)) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:20.3800941Z Using cached bracex-2.6-py3-none-any.whl.metadata (3.6 kB) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:20.3843568Z Using cached ansible_lint-26.3.0-py3-none-any.whl (330 kB) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:20.3857264Z Using cached ansible_core-2.19.7-py3-none-any.whl (2.4 MB) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:20.3886025Z Using cached pathspec-1.0.4-py3-none-any.whl (55 kB) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:20.3897085Z Using cached resolvelib-1.2.1-py3-none-any.whl (18 kB) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:20.3908164Z Using cached ansible_compat-25.12.1-py3-none-any.whl (27 kB) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:20.3919566Z Using cached black-26.1.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (1.8 MB) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:20.3943377Z Using cached cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (219 kB) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:20.3955512Z Using cached click-8.3.1-py3-none-any.whl (108 kB) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:20.3967497Z Using cached cryptography-46.0.5-cp311-abi3-manylinux_2_34_x86_64.whl (4.5 MB) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:20.4010695Z Using cached distro-1.9.0-py3-none-any.whl (20 kB) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:20.4021518Z Using cached filelock-3.25.0-py3-none-any.whl (26 kB) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:20.4032600Z Using cached jinja2-3.1.6-py3-none-any.whl (134 kB) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:20.4044242Z Using cached jsonschema-4.26.0-py3-none-any.whl (90 kB) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:20.4055630Z Using cached attrs-25.4.0-py3-none-any.whl (67 kB) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:20.4067265Z Using cached jsonschema_specifications-2025.9.1-py3-none-any.whl (18 kB) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:20.4078725Z Using cached markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (22 kB) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:20.4089307Z Using cached mypy_extensions-1.1.0-py3-none-any.whl (5.0 kB) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:20.4099989Z Using cached packaging-26.0-py3-none-any.whl (74 kB) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:20.4111364Z Using cached platformdirs-4.9.4-py3-none-any.whl (21 kB) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:20.4122788Z Using cached pytokens-0.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (269 kB) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:20.4135685Z Using cached pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (807 kB) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:20.4152160Z Using cached referencing-0.37.0-py3-none-any.whl (26 kB) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:20.4163610Z Using cached rpds_py-0.30.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (394 kB) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:20.4177318Z Using cached ruamel_yaml-0.19.1-py3-none-any.whl (118 kB) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:20.4189476Z Using cached ruamel_yaml_clib-0.2.15-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (788 kB) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:20.4205121Z Using cached subprocess_tee-0.4.2-py3-none-any.whl (5.2 kB) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:20.4216469Z Using cached typing_extensions-4.15.0-py3-none-any.whl (44 kB) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:20.4227263Z Using cached wcmatch-10.1-py3-none-any.whl (39 kB) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:20.4238042Z Using cached bracex-2.6-py3-none-any.whl (11 kB) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:20.4248958Z Using cached yamllint-1.38.0-py3-none-any.whl (68 kB) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:20.4260046Z Using cached pycparser-3.0-py3-none-any.whl (48 kB) +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:20.5136341Z Installing collected packages: typing-extensions, subprocess-tee, ruamel-yaml-clib, ruamel-yaml, rpds-py, resolvelib, pyyaml, pytokens, pycparser, platformdirs, pathspec, packaging, mypy-extensions, MarkupSafe, filelock, distro, click, bracex, attrs, yamllint, wcmatch, referencing, jinja2, cffi, black, jsonschema-specifications, cryptography, jsonschema, ansible-core, ansible-compat, ansible-lint +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:23.1752917Z +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:23.1786289Z Successfully installed MarkupSafe-3.0.3 ansible-compat-25.12.1 ansible-core-2.19.7 ansible-lint-26.3.0 attrs-25.4.0 black-26.1.0 bracex-2.6 cffi-2.0.0 click-8.3.1 cryptography-46.0.5 distro-1.9.0 filelock-3.25.0 jinja2-3.1.6 jsonschema-4.26.0 jsonschema-specifications-2025.9.1 mypy-extensions-1.1.0 packaging-26.0 pathspec-1.0.4 platformdirs-4.9.4 pycparser-3.0 pytokens-0.4.1 pyyaml-6.0.3 referencing-0.37.0 resolvelib-1.2.1 rpds-py-0.30.0 ruamel-yaml-0.19.1 ruamel-yaml-clib-0.2.15 subprocess-tee-0.4.2 typing-extensions-4.15.0 wcmatch-10.1 yamllint-1.38.0 +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:23.3132093Z ##[group]Run set -euo pipefail +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:23.3132406Z set -euo pipefail +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:23.3132646Z . "ansible/.venv-ci/bin/activate" +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:23.3133042Z ansible-galaxy collection install -r "ansible/requirements.yml" +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:23.3182494Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:23.3182814Z env: +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:23.3182995Z ANSIBLE_DIRECTORY: ansible +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:23.3183248Z DEPLOY_PLAYBOOK: playbooks/deploy.yml +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:23.3183513Z DEPLOY_TAGS: app_deploy +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:23.3183785Z pythonLocation: /opt/hostedtoolcache/Python/3.12.12/x64 +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:23.3184216Z PKG_CONFIG_PATH: /opt/hostedtoolcache/Python/3.12.12/x64/lib/pkgconfig +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:23.3184628Z Python_ROOT_DIR: /opt/hostedtoolcache/Python/3.12.12/x64 +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:23.3185008Z Python2_ROOT_DIR: /opt/hostedtoolcache/Python/3.12.12/x64 +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:23.3185717Z Python3_ROOT_DIR: /opt/hostedtoolcache/Python/3.12.12/x64 +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:23.3186089Z LD_LIBRARY_PATH: /opt/hostedtoolcache/Python/3.12.12/x64/lib +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:23.3186397Z ##[endgroup] +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:24.0929765Z Starting galaxy collection install process +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:24.0931533Z Nothing to do. All requested collections are already installed. If you want to reinstall them, consider using `--force`. +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:24.1336095Z ##[group]Run echo "/home/runner/work/DevOps-Core-S26/DevOps-Core-S26/ansible/.venv-ci/bin" >> "$GITHUB_PATH" +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:24.1336846Z echo "/home/runner/work/DevOps-Core-S26/DevOps-Core-S26/ansible/.venv-ci/bin" >> "$GITHUB_PATH" +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:24.1385886Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:24.1386212Z env: +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:24.1386392Z ANSIBLE_DIRECTORY: ansible +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:24.1386668Z DEPLOY_PLAYBOOK: playbooks/deploy.yml +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:24.1386930Z DEPLOY_TAGS: app_deploy +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:24.1387207Z pythonLocation: /opt/hostedtoolcache/Python/3.12.12/x64 +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:24.1387607Z PKG_CONFIG_PATH: /opt/hostedtoolcache/Python/3.12.12/x64/lib/pkgconfig +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:24.1388033Z Python_ROOT_DIR: /opt/hostedtoolcache/Python/3.12.12/x64 +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:24.1388398Z Python2_ROOT_DIR: /opt/hostedtoolcache/Python/3.12.12/x64 +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:24.1388756Z Python3_ROOT_DIR: /opt/hostedtoolcache/Python/3.12.12/x64 +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:24.1389121Z LD_LIBRARY_PATH: /opt/hostedtoolcache/Python/3.12.12/x64/lib +Ansible Lint Setup Ansible toolchain 2026-03-06T05:29:24.1389428Z ##[endgroup] +Ansible Lint Run lint and syntax checks 2026-03-06T05:29:24.1511346Z Prepare all required actions +Ansible Lint Run lint and syntax checks 2026-03-06T05:29:24.1552577Z ##[group]Run ./.github/actions/ansible-lint +Ansible Lint Run lint and syntax checks 2026-03-06T05:29:24.1552839Z with: +Ansible Lint Run lint and syntax checks 2026-03-06T05:29:24.1553022Z ansible-directory: ansible +Ansible Lint Run lint and syntax checks 2026-03-06T05:29:24.1553378Z vault-password: *** +Ansible Lint Run lint and syntax checks 2026-03-06T05:29:24.1553613Z playbook-glob: playbooks/*.yml +Ansible Lint Run lint and syntax checks 2026-03-06T05:29:24.1553834Z env: +Ansible Lint Run lint and syntax checks 2026-03-06T05:29:24.1554006Z ANSIBLE_DIRECTORY: ansible +Ansible Lint Run lint and syntax checks 2026-03-06T05:29:24.1554240Z DEPLOY_PLAYBOOK: playbooks/deploy.yml +Ansible Lint Run lint and syntax checks 2026-03-06T05:29:24.1554495Z DEPLOY_TAGS: app_deploy +Ansible Lint Run lint and syntax checks 2026-03-06T05:29:24.1554766Z pythonLocation: /opt/hostedtoolcache/Python/3.12.12/x64 +Ansible Lint Run lint and syntax checks 2026-03-06T05:29:24.1555562Z PKG_CONFIG_PATH: /opt/hostedtoolcache/Python/3.12.12/x64/lib/pkgconfig +Ansible Lint Run lint and syntax checks 2026-03-06T05:29:24.1555969Z Python_ROOT_DIR: /opt/hostedtoolcache/Python/3.12.12/x64 +Ansible Lint Run lint and syntax checks 2026-03-06T05:29:24.1556338Z Python2_ROOT_DIR: /opt/hostedtoolcache/Python/3.12.12/x64 +Ansible Lint Run lint and syntax checks 2026-03-06T05:29:24.1556697Z Python3_ROOT_DIR: /opt/hostedtoolcache/Python/3.12.12/x64 +Ansible Lint Run lint and syntax checks 2026-03-06T05:29:24.1557060Z LD_LIBRARY_PATH: /opt/hostedtoolcache/Python/3.12.12/x64/lib +Ansible Lint Run lint and syntax checks 2026-03-06T05:29:24.1557393Z ##[endgroup] +Ansible Lint Run lint and syntax checks 2026-03-06T05:29:24.1572559Z ##[group]Run set -euo pipefail +Ansible Lint Run lint and syntax checks 2026-03-06T05:29:24.1572828Z set -euo pipefail +Ansible Lint Run lint and syntax checks 2026-03-06T05:29:24.1573053Z umask 077 +Ansible Lint Run lint and syntax checks 2026-03-06T05:29:24.1573263Z cleanup() { +Ansible Lint Run lint and syntax checks 2026-03-06T05:29:24.1573461Z  rm -f .vault_pass +Ansible Lint Run lint and syntax checks 2026-03-06T05:29:24.1573674Z } +Ansible Lint Run lint and syntax checks 2026-03-06T05:29:24.1573857Z trap cleanup EXIT +Ansible Lint Run lint and syntax checks 2026-03-06T05:29:24.1574064Z  +Ansible Lint Run lint and syntax checks 2026-03-06T05:29:24.1574274Z printf '%s\n' "$VAULT_PASSWORD" > .vault_pass +Ansible Lint Run lint and syntax checks 2026-03-06T05:29:24.1574564Z  +Ansible Lint Run lint and syntax checks 2026-03-06T05:29:24.1574750Z ansible-lint $PLAYBOOK_GLOB +Ansible Lint Run lint and syntax checks 2026-03-06T05:29:24.1575099Z ansible-playbook playbooks/provision.yml --syntax-check +Ansible Lint Run lint and syntax checks 2026-03-06T05:29:24.1575667Z ansible-playbook playbooks/deploy.yml --syntax-check +Ansible Lint Run lint and syntax checks 2026-03-06T05:29:24.1576063Z ansible-playbook playbooks/site.yml --syntax-check +Ansible Lint Run lint and syntax checks 2026-03-06T05:29:24.1619676Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} +Ansible Lint Run lint and syntax checks 2026-03-06T05:29:24.1620023Z env: +Ansible Lint Run lint and syntax checks 2026-03-06T05:29:24.1620202Z ANSIBLE_DIRECTORY: ansible +Ansible Lint Run lint and syntax checks 2026-03-06T05:29:24.1620452Z DEPLOY_PLAYBOOK: playbooks/deploy.yml +Ansible Lint Run lint and syntax checks 2026-03-06T05:29:24.1620726Z DEPLOY_TAGS: app_deploy +Ansible Lint Run lint and syntax checks 2026-03-06T05:29:24.1621008Z pythonLocation: /opt/hostedtoolcache/Python/3.12.12/x64 +Ansible Lint Run lint and syntax checks 2026-03-06T05:29:24.1621412Z PKG_CONFIG_PATH: /opt/hostedtoolcache/Python/3.12.12/x64/lib/pkgconfig +Ansible Lint Run lint and syntax checks 2026-03-06T05:29:24.1621812Z Python_ROOT_DIR: /opt/hostedtoolcache/Python/3.12.12/x64 +Ansible Lint Run lint and syntax checks 2026-03-06T05:29:24.1622192Z Python2_ROOT_DIR: /opt/hostedtoolcache/Python/3.12.12/x64 +Ansible Lint Run lint and syntax checks 2026-03-06T05:29:24.1622568Z Python3_ROOT_DIR: /opt/hostedtoolcache/Python/3.12.12/x64 +Ansible Lint Run lint and syntax checks 2026-03-06T05:29:24.1622936Z LD_LIBRARY_PATH: /opt/hostedtoolcache/Python/3.12.12/x64/lib +Ansible Lint Run lint and syntax checks 2026-03-06T05:29:24.1623292Z VAULT_PASSWORD: *** +Ansible Lint Run lint and syntax checks 2026-03-06T05:29:24.1623509Z PLAYBOOK_GLOB: playbooks/*.yml +Ansible Lint Run lint and syntax checks 2026-03-06T05:29:24.1623738Z ##[endgroup] +Ansible Lint Run lint and syntax checks 2026-03-06T05:29:29.8477378Z +Ansible Lint Run lint and syntax checks 2026-03-06T05:29:30.0769311Z Passed: 0 failure(s), 0 warning(s) in 9 files processed of 9 encountered. Profile 'production' was required, and it passed. +Ansible Lint Run lint and syntax checks 2026-03-06T05:29:30.6324210Z +Ansible Lint Run lint and syntax checks 2026-03-06T05:29:30.6324827Z playbook: playbooks/provision.yml +Ansible Lint Run lint and syntax checks 2026-03-06T05:29:31.1404326Z +Ansible Lint Run lint and syntax checks 2026-03-06T05:29:31.1405013Z playbook: playbooks/deploy.yml +Ansible Lint Run lint and syntax checks 2026-03-06T05:29:31.6590152Z +Ansible Lint Run lint and syntax checks 2026-03-06T05:29:31.6590785Z playbook: playbooks/site.yml +Ansible Lint Post Setup Ansible toolchain 2026-03-06T05:29:31.7061977Z Post job cleanup. +Ansible Lint Post Setup Ansible toolchain 2026-03-06T05:29:31.7645652Z Post job cleanup. +Ansible Lint Post Setup Ansible toolchain 2026-03-06T05:29:31.8932691Z Cache hit occurred on the primary key Linux-py3.12-ansible-70fee6f2b98d7def1a2c43ddbf364d7b6b2648821ca185e0955c8d98e4cb9364, not saving cache. +Ansible Lint Post Setup Ansible toolchain 2026-03-06T05:29:31.9026958Z Post job cleanup. +Ansible Lint Post Checkout code 2026-03-06T05:29:32.0691853Z Post job cleanup. +Ansible Lint Post Checkout code 2026-03-06T05:29:32.1650325Z [command]/usr/bin/git version +Ansible Lint Post Checkout code 2026-03-06T05:29:32.1687355Z git version 2.53.0 +Ansible Lint Post Checkout code 2026-03-06T05:29:32.1730032Z Temporarily overriding HOME='/home/runner/work/_temp/6c20ae22-94d6-4e20-a088-1bc5b65e29e6' before making global git config changes +Ansible Lint Post Checkout code 2026-03-06T05:29:32.1731346Z Adding repository directory to the temporary git global config as a safe directory +Ansible Lint Post Checkout code 2026-03-06T05:29:32.1744172Z [command]/usr/bin/git config --global --add safe.directory /home/runner/work/DevOps-Core-S26/DevOps-Core-S26 +Ansible Lint Post Checkout code 2026-03-06T05:29:32.1779165Z [command]/usr/bin/git config --local --name-only --get-regexp core\.sshCommand +Ansible Lint Post Checkout code 2026-03-06T05:29:32.1812297Z [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'core\.sshCommand' && git config --local --unset-all 'core.sshCommand' || :" +Ansible Lint Post Checkout code 2026-03-06T05:29:32.2056254Z [command]/usr/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader +Ansible Lint Post Checkout code 2026-03-06T05:29:32.2077494Z http.https://github.com/.extraheader +Ansible Lint Post Checkout code 2026-03-06T05:29:32.2089800Z [command]/usr/bin/git config --local --unset-all http.https://github.com/.extraheader +Ansible Lint Post Checkout code 2026-03-06T05:29:32.2121225Z [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'http\.https\:\/\/github\.com\/\.extraheader' && git config --local --unset-all 'http.https://github.com/.extraheader' || :" +Ansible Lint Post Checkout code 2026-03-06T05:29:32.2357989Z [command]/usr/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir: +Ansible Lint Post Checkout code 2026-03-06T05:29:32.2390371Z [command]/usr/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url +Ansible Lint Complete job 2026-03-06T05:29:32.2730379Z Cleaning up orphan processes +Deploy Application Set up job 2026-03-06T05:29:57.6492178Z Current runner version: '2.332.0' +Deploy Application Set up job 2026-03-06T05:29:57.6500080Z Runner name: 'github-runner-s26' +Deploy Application Set up job 2026-03-06T05:29:57.6501133Z Runner group name: 'Default' +Deploy Application Set up job 2026-03-06T05:29:57.6502174Z Machine name: 'github-runner-s26' +Deploy Application Set up job 2026-03-06T05:29:57.6505769Z ##[group]GITHUB_TOKEN Permissions +Deploy Application Set up job 2026-03-06T05:29:57.6508764Z Contents: read +Deploy Application Set up job 2026-03-06T05:29:57.6509511Z Metadata: read +Deploy Application Set up job 2026-03-06T05:29:57.6510335Z ##[endgroup] +Deploy Application Set up job 2026-03-06T05:29:57.6513654Z Secret source: Actions +Deploy Application Set up job 2026-03-06T05:29:57.6514727Z Prepare workflow directory +Deploy Application Set up job 2026-03-06T05:29:57.6992670Z Prepare all required actions +Deploy Application Set up job 2026-03-06T05:29:57.7029327Z Getting action download info +Deploy Application Set up job 2026-03-06T05:29:58.7100830Z Download action repository 'actions/checkout@v4' (SHA:34e114876b0b11c390a56381ad16ebd13914f8d5) +Deploy Application Set up job 2026-03-06T05:29:59.9331090Z Download action repository 'actions/upload-artifact@v4' (SHA:ea165f8d65b6e75b540449e92b4886f43607fa02) +Deploy Application Set up job 2026-03-06T05:30:04.4739595Z Complete job name: Deploy Application +Deploy Application Checkout code 2026-03-06T05:30:04.5258726Z ##[group]Run actions/checkout@v4 +Deploy Application Checkout code 2026-03-06T05:30:04.5259351Z with: +Deploy Application Checkout code 2026-03-06T05:30:04.5259658Z repository: LocalT0aster/DevOps-Core-S26 +Deploy Application Checkout code 2026-03-06T05:30:04.5260233Z token: *** +Deploy Application Checkout code 2026-03-06T05:30:04.5260506Z ssh-strict: true +Deploy Application Checkout code 2026-03-06T05:30:04.5260779Z ssh-user: git +Deploy Application Checkout code 2026-03-06T05:30:04.5261051Z persist-credentials: true +Deploy Application Checkout code 2026-03-06T05:30:04.5261350Z clean: true +Deploy Application Checkout code 2026-03-06T05:30:04.5261712Z sparse-checkout-cone-mode: true +Deploy Application Checkout code 2026-03-06T05:30:04.5283182Z fetch-depth: 1 +Deploy Application Checkout code 2026-03-06T05:30:04.5283514Z fetch-tags: false +Deploy Application Checkout code 2026-03-06T05:30:04.5283905Z show-progress: true +Deploy Application Checkout code 2026-03-06T05:30:04.5284216Z lfs: false +Deploy Application Checkout code 2026-03-06T05:30:04.5284495Z submodules: false +Deploy Application Checkout code 2026-03-06T05:30:04.5284768Z set-safe-directory: true +Deploy Application Checkout code 2026-03-06T05:30:04.5285558Z env: +Deploy Application Checkout code 2026-03-06T05:30:04.5285829Z ANSIBLE_DIRECTORY: ansible +Deploy Application Checkout code 2026-03-06T05:30:04.5286151Z DEPLOY_PLAYBOOK: playbooks/deploy.yml +Deploy Application Checkout code 2026-03-06T05:30:04.5286485Z DEPLOY_TAGS: app_deploy +Deploy Application Checkout code 2026-03-06T05:30:04.5286765Z ##[endgroup] +Deploy Application Checkout code 2026-03-06T05:30:04.6162086Z Syncing repository: LocalT0aster/DevOps-Core-S26 +Deploy Application Checkout code 2026-03-06T05:30:04.6172832Z ##[group]Getting Git version info +Deploy Application Checkout code 2026-03-06T05:30:04.6173515Z Working directory is '/opt/actions-runner/_work/DevOps-Core-S26/DevOps-Core-S26' +Deploy Application Checkout code 2026-03-06T05:30:04.6174360Z [command]/usr/bin/git version +Deploy Application Checkout code 2026-03-06T05:30:04.6174679Z git version 2.52.0 +Deploy Application Checkout code 2026-03-06T05:30:04.6189251Z ##[endgroup] +Deploy Application Checkout code 2026-03-06T05:30:04.6201711Z Temporarily overriding HOME='/opt/actions-runner/_work/_temp/02e2583d-1f43-4511-ab95-a17dab0dc139' before making global git config changes +Deploy Application Checkout code 2026-03-06T05:30:04.6202668Z Adding repository directory to the temporary git global config as a safe directory +Deploy Application Checkout code 2026-03-06T05:30:04.6226851Z [command]/usr/bin/git config --global --add safe.directory /opt/actions-runner/_work/DevOps-Core-S26/DevOps-Core-S26 +Deploy Application Checkout code 2026-03-06T05:30:04.6268709Z [command]/usr/bin/git config --local --get remote.origin.url +Deploy Application Checkout code 2026-03-06T05:30:04.6289926Z https://github.com/LocalT0aster/DevOps-Core-S26 +Deploy Application Checkout code 2026-03-06T05:30:04.6302713Z ##[group]Removing previously created refs, to avoid conflicts +Deploy Application Checkout code 2026-03-06T05:30:04.6306437Z [command]/usr/bin/git rev-parse --symbolic-full-name --verify --quiet HEAD +Deploy Application Checkout code 2026-03-06T05:30:04.6335472Z refs/heads/lab06 +Deploy Application Checkout code 2026-03-06T05:30:04.6360933Z [command]/usr/bin/git checkout --detach +Deploy Application Checkout code 2026-03-06T05:30:04.6361427Z HEAD is now at a55c6b2 fix: rebuild ansible ci venv on each run +Deploy Application Checkout code 2026-03-06T05:30:04.6399727Z [command]/usr/bin/git branch --delete --force lab06 +Deploy Application Checkout code 2026-03-06T05:30:04.6419714Z Deleted branch lab06 (was a55c6b2). +Deploy Application Checkout code 2026-03-06T05:30:04.6444500Z ##[endgroup] +Deploy Application Checkout code 2026-03-06T05:30:04.6447185Z [command]/usr/bin/git submodule status +Deploy Application Checkout code 2026-03-06T05:30:04.6599060Z ##[group]Cleaning the repository +Deploy Application Checkout code 2026-03-06T05:30:04.6599701Z [command]/usr/bin/git clean -ffdx +Deploy Application Checkout code 2026-03-06T05:30:04.7382400Z Removing ansible/.venv-ci/ +Deploy Application Checkout code 2026-03-06T05:30:04.7399074Z [command]/usr/bin/git reset --hard HEAD +Deploy Application Checkout code 2026-03-06T05:30:04.7435602Z HEAD is now at a55c6b2 fix: rebuild ansible ci venv on each run +Deploy Application Checkout code 2026-03-06T05:30:04.7439527Z ##[endgroup] +Deploy Application Checkout code 2026-03-06T05:30:04.7441304Z ##[group]Disabling automatic garbage collection +Deploy Application Checkout code 2026-03-06T05:30:04.7446972Z [command]/usr/bin/git config --local gc.auto 0 +Deploy Application Checkout code 2026-03-06T05:30:04.7478554Z ##[endgroup] +Deploy Application Checkout code 2026-03-06T05:30:04.7479110Z ##[group]Setting up auth +Deploy Application Checkout code 2026-03-06T05:30:04.7486602Z [command]/usr/bin/git config --local --name-only --get-regexp core\.sshCommand +Deploy Application Checkout code 2026-03-06T05:30:04.7524555Z [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'core\.sshCommand' && git config --local --unset-all 'core.sshCommand' || :" +Deploy Application Checkout code 2026-03-06T05:30:04.7696597Z [command]/usr/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader +Deploy Application Checkout code 2026-03-06T05:30:04.7718808Z [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'http\.https\:\/\/github\.com\/\.extraheader' && git config --local --unset-all 'http.https://github.com/.extraheader' || :" +Deploy Application Checkout code 2026-03-06T05:30:05.1868602Z [command]/usr/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir: +Deploy Application Checkout code 2026-03-06T05:30:05.1870199Z [command]/usr/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url +Deploy Application Checkout code 2026-03-06T05:30:05.1871124Z [command]/usr/bin/git config --local http.https://github.com/.extraheader AUTHORIZATION: basic *** +Deploy Application Checkout code 2026-03-06T05:30:05.1871927Z ##[endgroup] +Deploy Application Checkout code 2026-03-06T05:30:05.1872274Z ##[group]Fetching the repository +Deploy Application Checkout code 2026-03-06T05:30:05.1872929Z [command]/usr/bin/git -c protocol.version=2 fetch --no-tags --prune --no-recurse-submodules --depth=1 origin +2492c7d27ac02a50f12e2ca7f51bc1d7882b8489:refs/remotes/origin/lab06 +Deploy Application Checkout code 2026-03-06T05:30:05.4238858Z From https://github.com/LocalT0aster/DevOps-Core-S26 +Deploy Application Checkout code 2026-03-06T05:30:05.4240195Z + a55c6b2...2492c7d 2492c7d27ac02a50f12e2ca7f51bc1d7882b8489 -> origin/lab06 (forced update) +Deploy Application Checkout code 2026-03-06T05:30:05.4253108Z ##[endgroup] +Deploy Application Checkout code 2026-03-06T05:30:05.4253515Z ##[group]Determining the checkout info +Deploy Application Checkout code 2026-03-06T05:30:05.4253862Z ##[endgroup] +Deploy Application Checkout code 2026-03-06T05:30:05.4254090Z [command]/usr/bin/git sparse-checkout disable +Deploy Application Checkout code 2026-03-06T05:30:05.4319076Z [command]/usr/bin/git config --local --unset-all extensions.worktreeConfig +Deploy Application Checkout code 2026-03-06T05:30:05.4355659Z ##[group]Checking out the ref +Deploy Application Checkout code 2026-03-06T05:30:05.4357258Z [command]/usr/bin/git checkout --progress --force -B lab06 refs/remotes/origin/lab06 +Deploy Application Checkout code 2026-03-06T05:30:05.4395770Z Warning: you are leaving 1 commit behind, not connected to +Deploy Application Checkout code 2026-03-06T05:30:05.4397071Z any of your branches: +Deploy Application Checkout code 2026-03-06T05:30:05.4397250Z +Deploy Application Checkout code 2026-03-06T05:30:05.4397372Z a55c6b2 fix: rebuild ansible ci venv on each run +Deploy Application Checkout code 2026-03-06T05:30:05.4397551Z +Deploy Application Checkout code 2026-03-06T05:30:05.4397727Z If you want to keep it by creating a new branch, this may be a good time +Deploy Application Checkout code 2026-03-06T05:30:05.4398006Z to do so with: +Deploy Application Checkout code 2026-03-06T05:30:05.4398107Z +Deploy Application Checkout code 2026-03-06T05:30:05.4398222Z git branch a55c6b2 +Deploy Application Checkout code 2026-03-06T05:30:05.4398368Z +Deploy Application Checkout code 2026-03-06T05:30:05.4401993Z Switched to a new branch 'lab06' +Deploy Application Checkout code 2026-03-06T05:30:05.4406524Z branch 'lab06' set up to track 'origin/lab06'. +Deploy Application Checkout code 2026-03-06T05:30:05.4409674Z ##[endgroup] +Deploy Application Checkout code 2026-03-06T05:30:05.4436197Z [command]/usr/bin/git log -1 --format=%H +Deploy Application Checkout code 2026-03-06T05:30:05.4451707Z 2492c7d27ac02a50f12e2ca7f51bc1d7882b8489 +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:05.4663275Z Prepare all required actions +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:05.4663720Z Getting action download info +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:05.7487960Z Download action repository 'actions/setup-python@v5' (SHA:a26af69be951a213d495a4c3e4e4022e16d87065) +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:09.0415725Z Download action repository 'actions/cache@v4' (SHA:0057852bfaa89a56745cba8c7296529d2fc39830) +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:13.5880420Z ##[group]Run ./.github/actions/ansible-setup +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:13.5880698Z with: +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:13.5880863Z python-version: 3.12 +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:13.5881059Z working-directory: ansible +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:13.5881319Z python-requirements-path: ansible/requirements-ci.txt +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:13.5881672Z collection-requirements-path: ansible/requirements.yml +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:13.5881948Z env: +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:13.5882110Z ANSIBLE_DIRECTORY: ansible +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:13.5882411Z DEPLOY_PLAYBOOK: playbooks/deploy.yml +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:13.5882818Z DEPLOY_TAGS: app_deploy +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:13.5883002Z ##[endgroup] +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:13.5991311Z ##[group]Run actions/setup-python@v5 +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:13.5991626Z with: +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:13.5991785Z python-version: 3.12 +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:13.5991981Z check-latest: false +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:13.5992382Z token: *** +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:13.5992626Z update-environment: true +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:13.5992839Z allow-prereleases: false +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:13.5993026Z freethreaded: false +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:13.5993367Z env: +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:13.5993524Z ANSIBLE_DIRECTORY: ansible +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:13.5993726Z DEPLOY_PLAYBOOK: playbooks/deploy.yml +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:13.5993962Z DEPLOY_TAGS: app_deploy +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:13.5994142Z ##[endgroup] +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:13.7393979Z ##[group]Installed versions +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:13.7434733Z Successfully set up CPython (3.12.13) +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:13.7436487Z ##[endgroup] +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:13.7957480Z ##[group]Run actions/cache@v4 +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:13.7957724Z with: +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:13.7957975Z path: ~/.cache/pip +Deploy Application Setup Ansible toolchain ~/.ansible/collections +Deploy Application Setup Ansible toolchain +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:13.7958375Z key: Linux-py3.12-ansible-70fee6f2b98d7def1a2c43ddbf364d7b6b2648821ca185e0955c8d98e4cb9364 +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:13.7958770Z restore-keys: Linux-py3.12-ansible- +Deploy Application Setup Ansible toolchain +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:13.7959012Z enableCrossOsArchive: false +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:13.7959210Z fail-on-cache-miss: false +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:13.7959399Z lookup-only: false +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:13.7959567Z save-always: false +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:13.7959726Z env: +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:13.7959881Z ANSIBLE_DIRECTORY: ansible +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:13.7960079Z DEPLOY_PLAYBOOK: playbooks/deploy.yml +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:13.7960298Z DEPLOY_TAGS: app_deploy +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:13.7960561Z pythonLocation: /opt/actions-runner/_work/_tool/Python/3.12.13/x64 +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:13.7960944Z PKG_CONFIG_PATH: /opt/actions-runner/_work/_tool/Python/3.12.13/x64/lib/pkgconfig +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:13.7961317Z Python_ROOT_DIR: /opt/actions-runner/_work/_tool/Python/3.12.13/x64 +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:13.7961663Z Python2_ROOT_DIR: /opt/actions-runner/_work/_tool/Python/3.12.13/x64 +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:13.7962001Z Python3_ROOT_DIR: /opt/actions-runner/_work/_tool/Python/3.12.13/x64 +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:13.7962559Z LD_LIBRARY_PATH: /opt/actions-runner/_work/_tool/Python/3.12.13/x64/lib +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:13.7963084Z ##[endgroup] +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:14.4043248Z Cache hit for: Linux-py3.12-ansible-70fee6f2b98d7def1a2c43ddbf364d7b6b2648821ca185e0955c8d98e4cb9364 +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:16.4773003Z Received 0 of 16876233 (0.0%), 0.0 MBs/sec +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:17.4766920Z Received 0 of 16876233 (0.0%), 0.0 MBs/sec +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:18.4769115Z Received 99017 of 16876233 (0.6%), 0.0 MBs/sec +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:19.4773453Z Received 99017 of 16876233 (0.6%), 0.0 MBs/sec +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:20.4771646Z Received 99017 of 16876233 (0.6%), 0.0 MBs/sec +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:21.4765071Z Received 99017 of 16876233 (0.6%), 0.0 MBs/sec +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:22.4774139Z Received 99017 of 16876233 (0.6%), 0.0 MBs/sec +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:23.4776252Z Received 99017 of 16876233 (0.6%), 0.0 MBs/sec +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:24.4785122Z Received 99017 of 16876233 (0.6%), 0.0 MBs/sec +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:25.4782607Z Received 99017 of 16876233 (0.6%), 0.0 MBs/sec +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:26.4783331Z Received 99017 of 16876233 (0.6%), 0.0 MBs/sec +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:27.4786680Z Received 99017 of 16876233 (0.6%), 0.0 MBs/sec +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:28.4791776Z Received 99017 of 16876233 (0.6%), 0.0 MBs/sec +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:29.4805527Z Received 99017 of 16876233 (0.6%), 0.0 MBs/sec +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:30.4799815Z Received 99017 of 16876233 (0.6%), 0.0 MBs/sec +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:31.4800143Z Received 99017 of 16876233 (0.6%), 0.0 MBs/sec +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:32.4799538Z Received 99017 of 16876233 (0.6%), 0.0 MBs/sec +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:33.4800713Z Received 99017 of 16876233 (0.6%), 0.0 MBs/sec +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:34.4799954Z Received 99017 of 16876233 (0.6%), 0.0 MBs/sec +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:35.4798905Z Received 99017 of 16876233 (0.6%), 0.0 MBs/sec +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:36.4805551Z Received 99017 of 16876233 (0.6%), 0.0 MBs/sec +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:37.4820057Z Received 99017 of 16876233 (0.6%), 0.0 MBs/sec +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:38.4819188Z Received 99017 of 16876233 (0.6%), 0.0 MBs/sec +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:39.4827866Z Received 99017 of 16876233 (0.6%), 0.0 MBs/sec +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:40.4828823Z Received 99017 of 16876233 (0.6%), 0.0 MBs/sec +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:41.4833593Z Received 99017 of 16876233 (0.6%), 0.0 MBs/sec +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:42.4832544Z Received 99017 of 16876233 (0.6%), 0.0 MBs/sec +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:43.4837095Z Received 99017 of 16876233 (0.6%), 0.0 MBs/sec +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:44.4843083Z Received 99017 of 16876233 (0.6%), 0.0 MBs/sec +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:45.4846837Z Received 99017 of 16876233 (0.6%), 0.0 MBs/sec +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:46.4855272Z Received 99017 of 16876233 (0.6%), 0.0 MBs/sec +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:47.4858765Z Received 99017 of 16876233 (0.6%), 0.0 MBs/sec +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:48.4860108Z Received 99017 of 16876233 (0.6%), 0.0 MBs/sec +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:49.4862180Z Received 99017 of 16876233 (0.6%), 0.0 MBs/sec +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:50.4867065Z Received 99017 of 16876233 (0.6%), 0.0 MBs/sec +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:51.4866433Z Received 99017 of 16876233 (0.6%), 0.0 MBs/sec +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:52.4864504Z Received 99017 of 16876233 (0.6%), 0.0 MBs/sec +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:53.4860951Z Received 99017 of 16876233 (0.6%), 0.0 MBs/sec +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:54.4862233Z Received 99017 of 16876233 (0.6%), 0.0 MBs/sec +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:55.4862078Z Received 99017 of 16876233 (0.6%), 0.0 MBs/sec +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:56.4862231Z Received 99017 of 16876233 (0.6%), 0.0 MBs/sec +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:57.4862363Z Received 4293321 of 16876233 (25.4%), 0.1 MBs/sec +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:58.4866137Z Received 4293321 of 16876233 (25.4%), 0.1 MBs/sec +Deploy Application Setup Ansible toolchain 2026-03-06T05:30:59.4877504Z Received 8487625 of 16876233 (50.3%), 0.2 MBs/sec +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:00.4885835Z Received 8487625 of 16876233 (50.3%), 0.2 MBs/sec +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:01.4890920Z Received 8487625 of 16876233 (50.3%), 0.2 MBs/sec +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:02.4895700Z Received 8487625 of 16876233 (50.3%), 0.2 MBs/sec +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:03.4901206Z Received 8487625 of 16876233 (50.3%), 0.2 MBs/sec +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:04.3205436Z Received 16876233 of 16876233 (100.0%), 0.3 MBs/sec +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:04.3206066Z Cache Size: ~16 MB (16876233 B) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:04.3225913Z [command]/usr/bin/tar -xf /opt/actions-runner/_work/_temp/2ef53ebd-2583-4392-acbe-fba664f93a07/cache.tzst -P -C /opt/actions-runner/_work/DevOps-Core-S26/DevOps-Core-S26 --use-compress-program unzstd +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:04.3692804Z Cache restored successfully +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:04.3761111Z Cache restored from key: Linux-py3.12-ansible-70fee6f2b98d7def1a2c43ddbf364d7b6b2648821ca185e0955c8d98e4cb9364 +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:04.3836550Z ##[group]Run set -euo pipefail +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:04.3836883Z set -euo pipefail +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:04.3837088Z rm -rf "ansible/.venv-ci" +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:04.3837324Z python -m venv "ansible/.venv-ci" +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:04.3837570Z . "ansible/.venv-ci/bin/activate" +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:04.3837812Z python -m pip install --upgrade pip +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:04.3838110Z python -m pip install -r "ansible/requirements-ci.txt" +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:04.3850274Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:04.3850741Z env: +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:04.3850906Z ANSIBLE_DIRECTORY: ansible +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:04.3851125Z DEPLOY_PLAYBOOK: playbooks/deploy.yml +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:04.3851360Z DEPLOY_TAGS: app_deploy +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:04.3851632Z pythonLocation: /opt/actions-runner/_work/_tool/Python/3.12.13/x64 +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:04.3852014Z PKG_CONFIG_PATH: /opt/actions-runner/_work/_tool/Python/3.12.13/x64/lib/pkgconfig +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:04.3852397Z Python_ROOT_DIR: /opt/actions-runner/_work/_tool/Python/3.12.13/x64 +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:04.3852748Z Python2_ROOT_DIR: /opt/actions-runner/_work/_tool/Python/3.12.13/x64 +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:04.3853097Z Python3_ROOT_DIR: /opt/actions-runner/_work/_tool/Python/3.12.13/x64 +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:04.3853450Z LD_LIBRARY_PATH: /opt/actions-runner/_work/_tool/Python/3.12.13/x64/lib +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:04.3853731Z ##[endgroup] +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:06.5334681Z Requirement already satisfied: pip in ./ansible/.venv-ci/lib/python3.12/site-packages (25.0.1) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:13.9460353Z Collecting pip +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:13.9471527Z Using cached pip-26.0.1-py3-none-any.whl.metadata (4.7 kB) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:13.9495739Z Using cached pip-26.0.1-py3-none-any.whl (1.8 MB) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:13.9631733Z Installing collected packages: pip +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:13.9633426Z Attempting uninstall: pip +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:13.9651606Z Found existing installation: pip 25.0.1 +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:13.9891716Z Uninstalling pip-25.0.1: +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:13.9931126Z Successfully uninstalled pip-25.0.1 +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:14.6728555Z Successfully installed pip-26.0.1 +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:15.2284637Z Collecting ansible-core<2.20,>=2.16 (from -r ansible/requirements-ci.txt (line 1)) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:15.2295418Z Using cached ansible_core-2.19.7-py3-none-any.whl.metadata (7.7 kB) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:15.3078820Z Collecting ansible-lint==26.3.0 (from -r ansible/requirements-ci.txt (line 2)) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:15.3088678Z Using cached ansible_lint-26.3.0-py3-none-any.whl.metadata (6.2 kB) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:15.3781496Z Collecting ansible-compat>=25.8.2 (from ansible-lint==26.3.0->-r ansible/requirements-ci.txt (line 2)) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:15.3790856Z Using cached ansible_compat-25.12.1-py3-none-any.whl.metadata (3.4 kB) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:15.4707132Z Collecting black>=24.3.0 (from ansible-lint==26.3.0->-r ansible/requirements-ci.txt (line 2)) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:15.4716630Z Using cached black-26.1.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.metadata (88 kB) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:15.6128224Z Collecting cffi>=1.15.1 (from ansible-lint==26.3.0->-r ansible/requirements-ci.txt (line 2)) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:15.6137764Z Using cached cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.metadata (2.6 kB) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:15.7927015Z Collecting cryptography>=37 (from ansible-lint==26.3.0->-r ansible/requirements-ci.txt (line 2)) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:15.7937012Z Using cached cryptography-46.0.5-cp311-abi3-manylinux_2_34_x86_64.whl.metadata (5.7 kB) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:15.8671128Z Collecting distro>=1.9.0 (from ansible-lint==26.3.0->-r ansible/requirements-ci.txt (line 2)) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:15.8682256Z Using cached distro-1.9.0-py3-none-any.whl.metadata (6.8 kB) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:15.9373489Z Collecting filelock>=3.8.2 (from ansible-lint==26.3.0->-r ansible/requirements-ci.txt (line 2)) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:15.9386611Z Using cached filelock-3.25.0-py3-none-any.whl.metadata (2.0 kB) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:16.0109744Z Collecting jsonschema>=4.10.0 (from ansible-lint==26.3.0->-r ansible/requirements-ci.txt (line 2)) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:16.0120324Z Using cached jsonschema-4.26.0-py3-none-any.whl.metadata (7.6 kB) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:16.0792137Z Collecting packaging>=22.0 (from ansible-lint==26.3.0->-r ansible/requirements-ci.txt (line 2)) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:16.0801561Z Using cached packaging-26.0-py3-none-any.whl.metadata (3.3 kB) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:16.1437771Z Collecting pathspec<1.1.0,>=1.0.3 (from ansible-lint==26.3.0->-r ansible/requirements-ci.txt (line 2)) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:16.1452500Z Using cached pathspec-1.0.4-py3-none-any.whl.metadata (13 kB) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:16.2274470Z Collecting pyyaml>=6.0.1 (from ansible-lint==26.3.0->-r ansible/requirements-ci.txt (line 2)) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:16.2288415Z Using cached pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.metadata (2.4 kB) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:16.2980758Z Collecting referencing>=0.36.2 (from ansible-lint==26.3.0->-r ansible/requirements-ci.txt (line 2)) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:16.2990421Z Using cached referencing-0.37.0-py3-none-any.whl.metadata (2.8 kB) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:16.4413848Z Collecting ruamel-yaml>=0.18.11 (from ansible-lint==26.3.0->-r ansible/requirements-ci.txt (line 2)) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:16.4431007Z Using cached ruamel_yaml-0.19.1-py3-none-any.whl.metadata (16 kB) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:16.5318734Z Collecting ruamel-yaml-clib>=0.2.12 (from ansible-lint==26.3.0->-r ansible/requirements-ci.txt (line 2)) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:16.5330098Z Using cached ruamel_yaml_clib-0.2.15-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.metadata (3.5 kB) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:16.5966352Z Collecting subprocess-tee>=0.4.1 (from ansible-lint==26.3.0->-r ansible/requirements-ci.txt (line 2)) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:16.5975349Z Using cached subprocess_tee-0.4.2-py3-none-any.whl.metadata (3.3 kB) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:16.6638567Z Collecting wcmatch>=8.5.0 (from ansible-lint==26.3.0->-r ansible/requirements-ci.txt (line 2)) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:16.6651187Z Using cached wcmatch-10.1-py3-none-any.whl.metadata (5.1 kB) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:16.7312397Z Collecting yamllint>=1.38.0 (from ansible-lint==26.3.0->-r ansible/requirements-ci.txt (line 2)) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:16.7323026Z Using cached yamllint-1.38.0-py3-none-any.whl.metadata (4.2 kB) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:16.7987117Z Collecting jinja2>=3.1.0 (from ansible-core<2.20,>=2.16->-r ansible/requirements-ci.txt (line 1)) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:16.7997263Z Using cached jinja2-3.1.6-py3-none-any.whl.metadata (2.9 kB) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:16.8639164Z Collecting resolvelib<2.0.0,>=0.5.3 (from ansible-core<2.20,>=2.16->-r ansible/requirements-ci.txt (line 1)) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:16.8651084Z Using cached resolvelib-1.2.1-py3-none-any.whl.metadata (3.7 kB) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:16.9362504Z Collecting click>=8.0.0 (from black>=24.3.0->ansible-lint==26.3.0->-r ansible/requirements-ci.txt (line 2)) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:16.9375445Z Using cached click-8.3.1-py3-none-any.whl.metadata (2.6 kB) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:17.0012448Z Collecting mypy-extensions>=0.4.3 (from black>=24.3.0->ansible-lint==26.3.0->-r ansible/requirements-ci.txt (line 2)) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:17.0024237Z Using cached mypy_extensions-1.1.0-py3-none-any.whl.metadata (1.1 kB) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:17.0715338Z Collecting platformdirs>=2 (from black>=24.3.0->ansible-lint==26.3.0->-r ansible/requirements-ci.txt (line 2)) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:17.0726463Z Using cached platformdirs-4.9.4-py3-none-any.whl.metadata (4.7 kB) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:17.1416270Z Collecting pytokens>=0.3.0 (from black>=24.3.0->ansible-lint==26.3.0->-r ansible/requirements-ci.txt (line 2)) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:17.1425142Z Using cached pytokens-0.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.metadata (3.8 kB) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:17.2067636Z Collecting pycparser (from cffi>=1.15.1->ansible-lint==26.3.0->-r ansible/requirements-ci.txt (line 2)) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:17.2082912Z Using cached pycparser-3.0-py3-none-any.whl.metadata (8.2 kB) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:17.3010526Z Collecting MarkupSafe>=2.0 (from jinja2>=3.1.0->ansible-core<2.20,>=2.16->-r ansible/requirements-ci.txt (line 1)) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:17.3019786Z Using cached markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.metadata (2.7 kB) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:17.4000818Z Collecting attrs>=22.2.0 (from jsonschema>=4.10.0->ansible-lint==26.3.0->-r ansible/requirements-ci.txt (line 2)) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:17.4016296Z Using cached attrs-25.4.0-py3-none-any.whl.metadata (10 kB) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:17.4695332Z Collecting jsonschema-specifications>=2023.03.6 (from jsonschema>=4.10.0->ansible-lint==26.3.0->-r ansible/requirements-ci.txt (line 2)) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:17.4707000Z Using cached jsonschema_specifications-2025.9.1-py3-none-any.whl.metadata (2.9 kB) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:17.7147396Z Collecting rpds-py>=0.25.0 (from jsonschema>=4.10.0->ansible-lint==26.3.0->-r ansible/requirements-ci.txt (line 2)) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:17.7156027Z Using cached rpds_py-0.30.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (4.1 kB) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:17.7938498Z Collecting typing-extensions>=4.4.0 (from referencing>=0.36.2->ansible-lint==26.3.0->-r ansible/requirements-ci.txt (line 2)) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:17.7949097Z Using cached typing_extensions-4.15.0-py3-none-any.whl.metadata (3.3 kB) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:17.8610682Z Collecting bracex>=2.1.1 (from wcmatch>=8.5.0->ansible-lint==26.3.0->-r ansible/requirements-ci.txt (line 2)) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:17.8620246Z Using cached bracex-2.6-py3-none-any.whl.metadata (3.6 kB) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:17.8657240Z Using cached ansible_lint-26.3.0-py3-none-any.whl (330 kB) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:17.8667064Z Using cached ansible_core-2.19.7-py3-none-any.whl (2.4 MB) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:17.8682968Z Using cached pathspec-1.0.4-py3-none-any.whl (55 kB) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:17.8690638Z Using cached resolvelib-1.2.1-py3-none-any.whl (18 kB) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:17.8698234Z Using cached ansible_compat-25.12.1-py3-none-any.whl (27 kB) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:17.8705759Z Using cached black-26.1.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (1.8 MB) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:17.8718422Z Using cached cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (219 kB) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:17.8726345Z Using cached click-8.3.1-py3-none-any.whl (108 kB) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:17.8735000Z Using cached cryptography-46.0.5-cp311-abi3-manylinux_2_34_x86_64.whl (4.5 MB) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:17.8755686Z Using cached distro-1.9.0-py3-none-any.whl (20 kB) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:17.8763372Z Using cached filelock-3.25.0-py3-none-any.whl (26 kB) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:17.8770674Z Using cached jinja2-3.1.6-py3-none-any.whl (134 kB) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:17.8778285Z Using cached jsonschema-4.26.0-py3-none-any.whl (90 kB) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:17.8786395Z Using cached attrs-25.4.0-py3-none-any.whl (67 kB) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:17.8793893Z Using cached jsonschema_specifications-2025.9.1-py3-none-any.whl (18 kB) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:17.8801335Z Using cached markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (22 kB) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:17.8810007Z Using cached mypy_extensions-1.1.0-py3-none-any.whl (5.0 kB) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:17.8818082Z Using cached packaging-26.0-py3-none-any.whl (74 kB) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:17.8827093Z Using cached platformdirs-4.9.4-py3-none-any.whl (21 kB) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:17.8835125Z Using cached pytokens-0.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (269 kB) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:17.8843675Z Using cached pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (807 kB) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:17.8853576Z Using cached referencing-0.37.0-py3-none-any.whl (26 kB) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:17.8861708Z Using cached rpds_py-0.30.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (394 kB) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:17.8870267Z Using cached ruamel_yaml-0.19.1-py3-none-any.whl (118 kB) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:17.8879101Z Using cached ruamel_yaml_clib-0.2.15-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (788 kB) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:17.8888596Z Using cached subprocess_tee-0.4.2-py3-none-any.whl (5.2 kB) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:17.8897105Z Using cached typing_extensions-4.15.0-py3-none-any.whl (44 kB) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:17.8905400Z Using cached wcmatch-10.1-py3-none-any.whl (39 kB) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:17.8912148Z Using cached bracex-2.6-py3-none-any.whl (11 kB) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:17.8920436Z Using cached yamllint-1.38.0-py3-none-any.whl (68 kB) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:17.8929741Z Using cached pycparser-3.0-py3-none-any.whl (48 kB) +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:17.9681888Z Installing collected packages: typing-extensions, subprocess-tee, ruamel-yaml-clib, ruamel-yaml, rpds-py, resolvelib, pyyaml, pytokens, pycparser, platformdirs, pathspec, packaging, mypy-extensions, MarkupSafe, filelock, distro, click, bracex, attrs, yamllint, wcmatch, referencing, jinja2, cffi, black, jsonschema-specifications, cryptography, jsonschema, ansible-core, ansible-compat, ansible-lint +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:20.4801930Z +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:20.4827204Z Successfully installed MarkupSafe-3.0.3 ansible-compat-25.12.1 ansible-core-2.19.7 ansible-lint-26.3.0 attrs-25.4.0 black-26.1.0 bracex-2.6 cffi-2.0.0 click-8.3.1 cryptography-46.0.5 distro-1.9.0 filelock-3.25.0 jinja2-3.1.6 jsonschema-4.26.0 jsonschema-specifications-2025.9.1 mypy-extensions-1.1.0 packaging-26.0 pathspec-1.0.4 platformdirs-4.9.4 pycparser-3.0 pytokens-0.4.1 pyyaml-6.0.3 referencing-0.37.0 resolvelib-1.2.1 rpds-py-0.30.0 ruamel-yaml-0.19.1 ruamel-yaml-clib-0.2.15 subprocess-tee-0.4.2 typing-extensions-4.15.0 wcmatch-10.1 yamllint-1.38.0 +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:20.7108789Z ##[group]Run set -euo pipefail +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:20.7109088Z set -euo pipefail +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:20.7109301Z . "ansible/.venv-ci/bin/activate" +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:20.7109613Z ansible-galaxy collection install -r "ansible/requirements.yml" +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:20.7118701Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:20.7118978Z env: +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:20.7119140Z ANSIBLE_DIRECTORY: ansible +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:20.7119362Z DEPLOY_PLAYBOOK: playbooks/deploy.yml +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:20.7119585Z DEPLOY_TAGS: app_deploy +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:20.7119866Z pythonLocation: /opt/actions-runner/_work/_tool/Python/3.12.13/x64 +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:20.7120262Z PKG_CONFIG_PATH: /opt/actions-runner/_work/_tool/Python/3.12.13/x64/lib/pkgconfig +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:20.7120665Z Python_ROOT_DIR: /opt/actions-runner/_work/_tool/Python/3.12.13/x64 +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:20.7121032Z Python2_ROOT_DIR: /opt/actions-runner/_work/_tool/Python/3.12.13/x64 +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:20.7121412Z Python3_ROOT_DIR: /opt/actions-runner/_work/_tool/Python/3.12.13/x64 +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:20.7121795Z LD_LIBRARY_PATH: /opt/actions-runner/_work/_tool/Python/3.12.13/x64/lib +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:20.7122083Z ##[endgroup] +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:20.8582727Z [WARNING]: Deprecation warnings can be disabled by setting `deprecation_warnings=False` in ansible.cfg. +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:20.8585490Z [DEPRECATION WARNING]: DEFAULT_MANAGED_STR option. Reason: The `ansible_managed` variable can be set just like any other variable, or a different variable can be used. +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:20.8586598Z Alternatives: Set the `ansible_managed` variable, or use any custom variable in templates. This feature will be removed from ansible-core version 2.23. +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:20.8587575Z +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:21.0412152Z Starting galaxy collection install process +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:21.0413773Z Nothing to do. All requested collections are already installed. If you want to reinstall them, consider using `--force`. +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:21.1165007Z ##[group]Run echo "/opt/actions-runner/_work/DevOps-Core-S26/DevOps-Core-S26/ansible/.venv-ci/bin" >> "$GITHUB_PATH" +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:21.1165671Z echo "/opt/actions-runner/_work/DevOps-Core-S26/DevOps-Core-S26/ansible/.venv-ci/bin" >> "$GITHUB_PATH" +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:21.1174955Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:21.1175220Z env: +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:21.1175388Z ANSIBLE_DIRECTORY: ansible +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:21.1175598Z DEPLOY_PLAYBOOK: playbooks/deploy.yml +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:21.1175823Z DEPLOY_TAGS: app_deploy +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:21.1176090Z pythonLocation: /opt/actions-runner/_work/_tool/Python/3.12.13/x64 +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:21.1176475Z PKG_CONFIG_PATH: /opt/actions-runner/_work/_tool/Python/3.12.13/x64/lib/pkgconfig +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:21.1176862Z Python_ROOT_DIR: /opt/actions-runner/_work/_tool/Python/3.12.13/x64 +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:21.1177206Z Python2_ROOT_DIR: /opt/actions-runner/_work/_tool/Python/3.12.13/x64 +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:21.1177576Z Python3_ROOT_DIR: /opt/actions-runner/_work/_tool/Python/3.12.13/x64 +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:21.1177923Z LD_LIBRARY_PATH: /opt/actions-runner/_work/_tool/Python/3.12.13/x64/lib +Deploy Application Setup Ansible toolchain 2026-03-06T05:31:21.1178380Z ##[endgroup] +Deploy Application Resolve target host from inventory 2026-03-06T05:31:21.1279754Z ##[group]Run set -euo pipefail +Deploy Application Resolve target host from inventory 2026-03-06T05:31:21.1280229Z set -euo pipefail +Deploy Application Resolve target host from inventory 2026-03-06T05:31:21.1280543Z target_host="$( +Deploy Application Resolve target host from inventory 2026-03-06T05:31:21.1280903Z  awk ' +Deploy Application Resolve target host from inventory 2026-03-06T05:31:21.1281137Z  /^[[:space:]]*#/ { next } +Deploy Application Resolve target host from inventory 2026-03-06T05:31:21.1281415Z  /^\[/ { next } +Deploy Application Resolve target host from inventory 2026-03-06T05:31:21.1281695Z  NF { +Deploy Application Resolve target host from inventory 2026-03-06T05:31:21.1281992Z  for (i = 1; i <= NF; i++) { +Deploy Application Resolve target host from inventory 2026-03-06T05:31:21.1282367Z  if ($i ~ /^ansible_host=/) { +Deploy Application Resolve target host from inventory 2026-03-06T05:31:21.1282691Z  split($i, value, "=") +Deploy Application Resolve target host from inventory 2026-03-06T05:31:21.1283073Z  print value[2] +Deploy Application Resolve target host from inventory 2026-03-06T05:31:21.1283403Z  exit +Deploy Application Resolve target host from inventory 2026-03-06T05:31:21.1283692Z  } +Deploy Application Resolve target host from inventory 2026-03-06T05:31:21.1284191Z  } +Deploy Application Resolve target host from inventory 2026-03-06T05:31:21.1284449Z  } +Deploy Application Resolve target host from inventory 2026-03-06T05:31:21.1284725Z  ' inventory/hosts.ini +Deploy Application Resolve target host from inventory 2026-03-06T05:31:21.1285173Z )" +Deploy Application Resolve target host from inventory 2026-03-06T05:31:21.1285419Z  +Deploy Application Resolve target host from inventory 2026-03-06T05:31:21.1285729Z if [ -z "$target_host" ]; then +Deploy Application Resolve target host from inventory 2026-03-06T05:31:21.1286258Z  echo "Could not determine ansible_host from inventory/hosts.ini" >&2 +Deploy Application Resolve target host from inventory 2026-03-06T05:31:21.1286775Z  exit 1 +Deploy Application Resolve target host from inventory 2026-03-06T05:31:21.1287030Z fi +Deploy Application Resolve target host from inventory 2026-03-06T05:31:21.1287277Z  +Deploy Application Resolve target host from inventory 2026-03-06T05:31:21.1287612Z echo "TARGET_VM_HOST=$target_host" >> "$GITHUB_ENV" +Deploy Application Resolve target host from inventory 2026-03-06T05:31:21.1304058Z shell: /usr/bin/bash -e {0} +Deploy Application Resolve target host from inventory 2026-03-06T05:31:21.1304401Z env: +Deploy Application Resolve target host from inventory 2026-03-06T05:31:21.1304663Z ANSIBLE_DIRECTORY: ansible +Deploy Application Resolve target host from inventory 2026-03-06T05:31:21.1305177Z DEPLOY_PLAYBOOK: playbooks/deploy.yml +Deploy Application Resolve target host from inventory 2026-03-06T05:31:21.1305563Z DEPLOY_TAGS: app_deploy +Deploy Application Resolve target host from inventory 2026-03-06T05:31:21.1305969Z pythonLocation: /opt/actions-runner/_work/_tool/Python/3.12.13/x64 +Deploy Application Resolve target host from inventory 2026-03-06T05:31:21.1306624Z PKG_CONFIG_PATH: /opt/actions-runner/_work/_tool/Python/3.12.13/x64/lib/pkgconfig +Deploy Application Resolve target host from inventory 2026-03-06T05:31:21.1307275Z Python_ROOT_DIR: /opt/actions-runner/_work/_tool/Python/3.12.13/x64 +Deploy Application Resolve target host from inventory 2026-03-06T05:31:21.1307883Z Python2_ROOT_DIR: /opt/actions-runner/_work/_tool/Python/3.12.13/x64 +Deploy Application Resolve target host from inventory 2026-03-06T05:31:21.1308559Z Python3_ROOT_DIR: /opt/actions-runner/_work/_tool/Python/3.12.13/x64 +Deploy Application Resolve target host from inventory 2026-03-06T05:31:21.1309167Z LD_LIBRARY_PATH: /opt/actions-runner/_work/_tool/Python/3.12.13/x64/lib +Deploy Application Resolve target host from inventory 2026-03-06T05:31:21.1309639Z ##[endgroup] +Deploy Application Configure SSH access to the target VM 2026-03-06T05:31:21.1398964Z Prepare all required actions +Deploy Application Configure SSH access to the target VM 2026-03-06T05:31:21.1425869Z ##[group]Run ./.github/actions/ansible-ssh-setup +Deploy Application Configure SSH access to the target VM 2026-03-06T05:31:21.1426139Z with: +Deploy Application Configure SSH access to the target VM 2026-03-06T05:31:21.1427741Z ssh-private-key: *** +Deploy Application Configure SSH access to the target VM 2026-03-06T05:31:21.1427946Z known-host: 192.168.121.50 +Deploy Application Configure SSH access to the target VM 2026-03-06T05:31:21.1428487Z ssh-key-path: ~/.ssh/vagrant +Deploy Application Configure SSH access to the target VM 2026-03-06T05:31:21.1428672Z env: +Deploy Application Configure SSH access to the target VM 2026-03-06T05:31:21.1428876Z ANSIBLE_DIRECTORY: ansible +Deploy Application Configure SSH access to the target VM 2026-03-06T05:31:21.1429141Z DEPLOY_PLAYBOOK: playbooks/deploy.yml +Deploy Application Configure SSH access to the target VM 2026-03-06T05:31:21.1429488Z DEPLOY_TAGS: app_deploy +Deploy Application Configure SSH access to the target VM 2026-03-06T05:31:21.1430020Z pythonLocation: /opt/actions-runner/_work/_tool/Python/3.12.13/x64 +Deploy Application Configure SSH access to the target VM 2026-03-06T05:31:21.1430557Z PKG_CONFIG_PATH: /opt/actions-runner/_work/_tool/Python/3.12.13/x64/lib/pkgconfig +Deploy Application Configure SSH access to the target VM 2026-03-06T05:31:21.1431104Z Python_ROOT_DIR: /opt/actions-runner/_work/_tool/Python/3.12.13/x64 +Deploy Application Configure SSH access to the target VM 2026-03-06T05:31:21.1431573Z Python2_ROOT_DIR: /opt/actions-runner/_work/_tool/Python/3.12.13/x64 +Deploy Application Configure SSH access to the target VM 2026-03-06T05:31:21.1432190Z Python3_ROOT_DIR: /opt/actions-runner/_work/_tool/Python/3.12.13/x64 +Deploy Application Configure SSH access to the target VM 2026-03-06T05:31:21.1432833Z LD_LIBRARY_PATH: /opt/actions-runner/_work/_tool/Python/3.12.13/x64/lib +Deploy Application Configure SSH access to the target VM 2026-03-06T05:31:21.1433368Z TARGET_VM_HOST: 192.168.121.50 +Deploy Application Configure SSH access to the target VM 2026-03-06T05:31:21.1433635Z ##[endgroup] +Deploy Application Configure SSH access to the target VM 2026-03-06T05:31:21.1450702Z ##[group]Run set -euo pipefail +Deploy Application Configure SSH access to the target VM 2026-03-06T05:31:21.1451087Z set -euo pipefail +Deploy Application Configure SSH access to the target VM 2026-03-06T05:31:21.1451359Z  +Deploy Application Configure SSH access to the target VM 2026-03-06T05:31:21.1451627Z key_path="${SSH_KEY_PATH/#\~/$HOME}" +Deploy Application Configure SSH access to the target VM 2026-03-06T05:31:21.1451990Z  +Deploy Application Configure SSH access to the target VM 2026-03-06T05:31:21.1452214Z install -d -m 700 "$HOME/.ssh" +Deploy Application Configure SSH access to the target VM 2026-03-06T05:31:21.1452546Z install -d -m 700 "$(dirname "$key_path")" +Deploy Application Configure SSH access to the target VM 2026-03-06T05:31:21.1452831Z printf '%s\n' "$SSH_PRIVATE_KEY" > "$key_path" +Deploy Application Configure SSH access to the target VM 2026-03-06T05:31:21.1453085Z chmod 600 "$key_path" +Deploy Application Configure SSH access to the target VM 2026-03-06T05:31:21.1453270Z  +Deploy Application Configure SSH access to the target VM 2026-03-06T05:31:21.1453450Z touch "$HOME/.ssh/known_hosts" +Deploy Application Configure SSH access to the target VM 2026-03-06T05:31:21.1453777Z chmod 600 "$HOME/.ssh/known_hosts" +Deploy Application Configure SSH access to the target VM 2026-03-06T05:31:21.1453991Z  +Deploy Application Configure SSH access to the target VM 2026-03-06T05:31:21.1454160Z if [ -n "$KNOWN_HOST" ]; then +Deploy Application Configure SSH access to the target VM 2026-03-06T05:31:21.1454476Z  ssh-keyscan -H "$KNOWN_HOST" >> "$HOME/.ssh/known_hosts" 2>/dev/null || true +Deploy Application Configure SSH access to the target VM 2026-03-06T05:31:21.1454781Z fi +Deploy Application Configure SSH access to the target VM 2026-03-06T05:31:21.1464672Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} +Deploy Application Configure SSH access to the target VM 2026-03-06T05:31:21.1465104Z env: +Deploy Application Configure SSH access to the target VM 2026-03-06T05:31:21.1465271Z ANSIBLE_DIRECTORY: ansible +Deploy Application Configure SSH access to the target VM 2026-03-06T05:31:21.1465655Z DEPLOY_PLAYBOOK: playbooks/deploy.yml +Deploy Application Configure SSH access to the target VM 2026-03-06T05:31:21.1465883Z DEPLOY_TAGS: app_deploy +Deploy Application Configure SSH access to the target VM 2026-03-06T05:31:21.1466159Z pythonLocation: /opt/actions-runner/_work/_tool/Python/3.12.13/x64 +Deploy Application Configure SSH access to the target VM 2026-03-06T05:31:21.1466572Z PKG_CONFIG_PATH: /opt/actions-runner/_work/_tool/Python/3.12.13/x64/lib/pkgconfig +Deploy Application Configure SSH access to the target VM 2026-03-06T05:31:21.1466981Z Python_ROOT_DIR: /opt/actions-runner/_work/_tool/Python/3.12.13/x64 +Deploy Application Configure SSH access to the target VM 2026-03-06T05:31:21.1467375Z Python2_ROOT_DIR: /opt/actions-runner/_work/_tool/Python/3.12.13/x64 +Deploy Application Configure SSH access to the target VM 2026-03-06T05:31:21.1467736Z Python3_ROOT_DIR: /opt/actions-runner/_work/_tool/Python/3.12.13/x64 +Deploy Application Configure SSH access to the target VM 2026-03-06T05:31:21.1468184Z LD_LIBRARY_PATH: /opt/actions-runner/_work/_tool/Python/3.12.13/x64/lib +Deploy Application Configure SSH access to the target VM 2026-03-06T05:31:21.1468502Z TARGET_VM_HOST: 192.168.121.50 +Deploy Application Configure SSH access to the target VM 2026-03-06T05:31:21.1470330Z SSH_PRIVATE_KEY: *** +Deploy Application Configure SSH access to the target VM 2026-03-06T05:31:21.1470552Z SSH_KEY_PATH: ~/.ssh/vagrant +Deploy Application Configure SSH access to the target VM 2026-03-06T05:31:21.1470761Z KNOWN_HOST: 192.168.121.50 +Deploy Application Configure SSH access to the target VM 2026-03-06T05:31:21.1470958Z ##[endgroup] +Deploy Application Prepare vault password file 2026-03-06T05:31:21.3636008Z ##[group]Run set -euo pipefail +Deploy Application Prepare vault password file 2026-03-06T05:31:21.3636331Z set -euo pipefail +Deploy Application Prepare vault password file 2026-03-06T05:31:21.3636526Z umask 077 +Deploy Application Prepare vault password file 2026-03-06T05:31:21.3636742Z printf '%s\n' "$VAULT_PASSWORD" > .vault_pass +Deploy Application Prepare vault password file 2026-03-06T05:31:21.3647110Z shell: /usr/bin/bash -e {0} +Deploy Application Prepare vault password file 2026-03-06T05:31:21.3647418Z env: +Deploy Application Prepare vault password file 2026-03-06T05:31:21.3647583Z ANSIBLE_DIRECTORY: ansible +Deploy Application Prepare vault password file 2026-03-06T05:31:21.3647796Z DEPLOY_PLAYBOOK: playbooks/deploy.yml +Deploy Application Prepare vault password file 2026-03-06T05:31:21.3648097Z DEPLOY_TAGS: app_deploy +Deploy Application Prepare vault password file 2026-03-06T05:31:21.3648379Z pythonLocation: /opt/actions-runner/_work/_tool/Python/3.12.13/x64 +Deploy Application Prepare vault password file 2026-03-06T05:31:21.3648795Z PKG_CONFIG_PATH: /opt/actions-runner/_work/_tool/Python/3.12.13/x64/lib/pkgconfig +Deploy Application Prepare vault password file 2026-03-06T05:31:21.3649207Z Python_ROOT_DIR: /opt/actions-runner/_work/_tool/Python/3.12.13/x64 +Deploy Application Prepare vault password file 2026-03-06T05:31:21.3649583Z Python2_ROOT_DIR: /opt/actions-runner/_work/_tool/Python/3.12.13/x64 +Deploy Application Prepare vault password file 2026-03-06T05:31:21.3650192Z Python3_ROOT_DIR: /opt/actions-runner/_work/_tool/Python/3.12.13/x64 +Deploy Application Prepare vault password file 2026-03-06T05:31:21.3650901Z LD_LIBRARY_PATH: /opt/actions-runner/_work/_tool/Python/3.12.13/x64/lib +Deploy Application Prepare vault password file 2026-03-06T05:31:21.3651195Z TARGET_VM_HOST: 192.168.121.50 +Deploy Application Prepare vault password file 2026-03-06T05:31:21.3651681Z VAULT_PASSWORD: *** +Deploy Application Prepare vault password file 2026-03-06T05:31:21.3651864Z ##[endgroup] +Deploy Application Verify target connectivity 2026-03-06T05:31:21.3715635Z ##[group]Run ansible webservers -m ansible.builtin.ping +Deploy Application Verify target connectivity 2026-03-06T05:31:21.3716023Z ansible webservers -m ansible.builtin.ping +Deploy Application Verify target connectivity 2026-03-06T05:31:21.3725398Z shell: /usr/bin/bash -e {0} +Deploy Application Verify target connectivity 2026-03-06T05:31:21.3725623Z env: +Deploy Application Verify target connectivity 2026-03-06T05:31:21.3725787Z ANSIBLE_DIRECTORY: ansible +Deploy Application Verify target connectivity 2026-03-06T05:31:21.3726022Z DEPLOY_PLAYBOOK: playbooks/deploy.yml +Deploy Application Verify target connectivity 2026-03-06T05:31:21.3726262Z DEPLOY_TAGS: app_deploy +Deploy Application Verify target connectivity 2026-03-06T05:31:21.3726550Z pythonLocation: /opt/actions-runner/_work/_tool/Python/3.12.13/x64 +Deploy Application Verify target connectivity 2026-03-06T05:31:21.3726964Z PKG_CONFIG_PATH: /opt/actions-runner/_work/_tool/Python/3.12.13/x64/lib/pkgconfig +Deploy Application Verify target connectivity 2026-03-06T05:31:21.3727372Z Python_ROOT_DIR: /opt/actions-runner/_work/_tool/Python/3.12.13/x64 +Deploy Application Verify target connectivity 2026-03-06T05:31:21.3727847Z Python2_ROOT_DIR: /opt/actions-runner/_work/_tool/Python/3.12.13/x64 +Deploy Application Verify target connectivity 2026-03-06T05:31:21.3728334Z Python3_ROOT_DIR: /opt/actions-runner/_work/_tool/Python/3.12.13/x64 +Deploy Application Verify target connectivity 2026-03-06T05:31:21.3728701Z LD_LIBRARY_PATH: /opt/actions-runner/_work/_tool/Python/3.12.13/x64/lib +Deploy Application Verify target connectivity 2026-03-06T05:31:21.3729032Z TARGET_VM_HOST: 192.168.121.50 +Deploy Application Verify target connectivity 2026-03-06T05:31:21.3729236Z ##[endgroup] +Deploy Application Verify target connectivity 2026-03-06T05:31:22.7085708Z vagrant | SUCCESS => { +Deploy Application Verify target connectivity 2026-03-06T05:31:22.7086542Z "changed": false, +Deploy Application Verify target connectivity 2026-03-06T05:31:22.7086737Z "ping": "pong" +Deploy Application Verify target connectivity 2026-03-06T05:31:22.7086919Z } +Deploy Application Deploy web application 2026-03-06T05:31:22.7740839Z Prepare all required actions +Deploy Application Deploy web application 2026-03-06T05:31:22.7772377Z ##[group]Run ./.github/actions/ansible-deploy +Deploy Application Deploy web application 2026-03-06T05:31:22.7772622Z with: +Deploy Application Deploy web application 2026-03-06T05:31:22.7772795Z ansible-directory: ansible +Deploy Application Deploy web application 2026-03-06T05:31:22.7773016Z playbook-path: playbooks/deploy.yml +Deploy Application Deploy web application 2026-03-06T05:31:22.7773339Z vault-password: *** +Deploy Application Deploy web application 2026-03-06T05:31:22.7773529Z tags: app_deploy +Deploy Application Deploy web application 2026-03-06T05:31:22.7773717Z inventory-path: inventory/hosts.ini +Deploy Application Deploy web application 2026-03-06T05:31:22.7774033Z env: +Deploy Application Deploy web application 2026-03-06T05:31:22.7774189Z ANSIBLE_DIRECTORY: ansible +Deploy Application Deploy web application 2026-03-06T05:31:22.7774391Z DEPLOY_PLAYBOOK: playbooks/deploy.yml +Deploy Application Deploy web application 2026-03-06T05:31:22.7774667Z DEPLOY_TAGS: app_deploy +Deploy Application Deploy web application 2026-03-06T05:31:22.7775068Z pythonLocation: /opt/actions-runner/_work/_tool/Python/3.12.13/x64 +Deploy Application Deploy web application 2026-03-06T05:31:22.7775475Z PKG_CONFIG_PATH: /opt/actions-runner/_work/_tool/Python/3.12.13/x64/lib/pkgconfig +Deploy Application Deploy web application 2026-03-06T05:31:22.7775860Z Python_ROOT_DIR: /opt/actions-runner/_work/_tool/Python/3.12.13/x64 +Deploy Application Deploy web application 2026-03-06T05:31:22.7776208Z Python2_ROOT_DIR: /opt/actions-runner/_work/_tool/Python/3.12.13/x64 +Deploy Application Deploy web application 2026-03-06T05:31:22.7776600Z Python3_ROOT_DIR: /opt/actions-runner/_work/_tool/Python/3.12.13/x64 +Deploy Application Deploy web application 2026-03-06T05:31:22.7776974Z LD_LIBRARY_PATH: /opt/actions-runner/_work/_tool/Python/3.12.13/x64/lib +Deploy Application Deploy web application 2026-03-06T05:31:22.7777285Z TARGET_VM_HOST: 192.168.121.50 +Deploy Application Deploy web application 2026-03-06T05:31:22.7777521Z ##[endgroup] +Deploy Application Deploy web application 2026-03-06T05:31:22.7789074Z ##[group]Run set -euo pipefail +Deploy Application Deploy web application 2026-03-06T05:31:22.7789339Z set -euo pipefail +Deploy Application Deploy web application 2026-03-06T05:31:22.7789542Z umask 077 +Deploy Application Deploy web application 2026-03-06T05:31:22.7789713Z  +Deploy Application Deploy web application 2026-03-06T05:31:22.7789906Z log_path="${RUNNER_TEMP}/ansible-deploy.log" +Deploy Application Deploy web application 2026-03-06T05:31:22.7790139Z  +Deploy Application Deploy web application 2026-03-06T05:31:22.7790294Z cleanup() { +Deploy Application Deploy web application 2026-03-06T05:31:22.7790472Z  rm -f .vault_pass +Deploy Application Deploy web application 2026-03-06T05:31:22.7790651Z } +Deploy Application Deploy web application 2026-03-06T05:31:22.7790808Z trap cleanup EXIT +Deploy Application Deploy web application 2026-03-06T05:31:22.7790990Z  +Deploy Application Deploy web application 2026-03-06T05:31:22.7791180Z printf '%s\n' "$VAULT_PASSWORD" > .vault_pass +Deploy Application Deploy web application 2026-03-06T05:31:22.7791419Z  +Deploy Application Deploy web application 2026-03-06T05:31:22.7791726Z ansible-playbook "$PLAYBOOK_PATH" -i "$INVENTORY_PATH" --tags "$PLAYBOOK_TAGS" | tee "$log_path" +Deploy Application Deploy web application 2026-03-06T05:31:22.7792091Z  +Deploy Application Deploy web application 2026-03-06T05:31:22.7792278Z echo "log-path=$log_path" >> "$GITHUB_OUTPUT" +Deploy Application Deploy web application 2026-03-06T05:31:22.7802395Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} +Deploy Application Deploy web application 2026-03-06T05:31:22.7802669Z env: +Deploy Application Deploy web application 2026-03-06T05:31:22.7802840Z ANSIBLE_DIRECTORY: ansible +Deploy Application Deploy web application 2026-03-06T05:31:22.7803059Z DEPLOY_PLAYBOOK: playbooks/deploy.yml +Deploy Application Deploy web application 2026-03-06T05:31:22.7803284Z DEPLOY_TAGS: app_deploy +Deploy Application Deploy web application 2026-03-06T05:31:22.7803560Z pythonLocation: /opt/actions-runner/_work/_tool/Python/3.12.13/x64 +Deploy Application Deploy web application 2026-03-06T05:31:22.7803946Z PKG_CONFIG_PATH: /opt/actions-runner/_work/_tool/Python/3.12.13/x64/lib/pkgconfig +Deploy Application Deploy web application 2026-03-06T05:31:22.7804328Z Python_ROOT_DIR: /opt/actions-runner/_work/_tool/Python/3.12.13/x64 +Deploy Application Deploy web application 2026-03-06T05:31:22.7804676Z Python2_ROOT_DIR: /opt/actions-runner/_work/_tool/Python/3.12.13/x64 +Deploy Application Deploy web application 2026-03-06T05:31:22.7805109Z Python3_ROOT_DIR: /opt/actions-runner/_work/_tool/Python/3.12.13/x64 +Deploy Application Deploy web application 2026-03-06T05:31:22.7805452Z LD_LIBRARY_PATH: /opt/actions-runner/_work/_tool/Python/3.12.13/x64/lib +Deploy Application Deploy web application 2026-03-06T05:31:22.7805733Z TARGET_VM_HOST: 192.168.121.50 +Deploy Application Deploy web application 2026-03-06T05:31:22.7806020Z VAULT_PASSWORD: *** +Deploy Application Deploy web application 2026-03-06T05:31:22.7806213Z PLAYBOOK_PATH: playbooks/deploy.yml +Deploy Application Deploy web application 2026-03-06T05:31:22.7806433Z INVENTORY_PATH: inventory/hosts.ini +Deploy Application Deploy web application 2026-03-06T05:31:22.7806651Z PLAYBOOK_TAGS: app_deploy +Deploy Application Deploy web application 2026-03-06T05:31:22.7806832Z ##[endgroup] +Deploy Application Deploy web application 2026-03-06T05:31:23.1853694Z +Deploy Application Deploy web application 2026-03-06T05:31:23.1855725Z PLAY [Deploy application] ****************************************************** +Deploy Application Deploy web application 2026-03-06T05:31:23.1870137Z +Deploy Application Deploy web application 2026-03-06T05:31:23.1871854Z TASK [Gathering Facts] ********************************************************* +Deploy Application Deploy web application 2026-03-06T05:31:24.1988353Z ok: [vagrant] +Deploy Application Deploy web application 2026-03-06T05:31:24.1991083Z +Deploy Application Deploy web application 2026-03-06T05:31:24.1991421Z TASK [Run web app role] ******************************************************** +Deploy Application Deploy web application 2026-03-06T05:31:24.2774549Z included: web_app for vagrant +Deploy Application Deploy web application 2026-03-06T05:31:24.2777912Z +Deploy Application Deploy web application 2026-03-06T05:31:24.2778295Z TASK [docker : Load docker role defaults] ************************************** +Deploy Application Deploy web application 2026-03-06T05:31:24.3006960Z ok: [vagrant] +Deploy Application Deploy web application 2026-03-06T05:31:24.3007239Z +Deploy Application Deploy web application 2026-03-06T05:31:24.3007555Z TASK [docker : Install Docker prerequisites] *********************************** +Deploy Application Deploy web application 2026-03-06T05:31:37.6684351Z ok: [vagrant] +Deploy Application Deploy web application 2026-03-06T05:31:37.6685233Z +Deploy Application Deploy web application 2026-03-06T05:31:37.6685698Z TASK [docker : Ensure Docker keyring directory exists] ************************* +Deploy Application Deploy web application 2026-03-06T05:31:38.0194162Z ok: [vagrant] +Deploy Application Deploy web application 2026-03-06T05:31:38.0195223Z +Deploy Application Deploy web application 2026-03-06T05:31:38.0195503Z TASK [docker : Add Docker GPG key] ********************************************* +Deploy Application Deploy web application 2026-03-06T05:31:38.6477382Z ok: [vagrant] +Deploy Application Deploy web application 2026-03-06T05:31:38.6478060Z +Deploy Application Deploy web application 2026-03-06T05:31:38.6478249Z TASK [docker : Add Docker apt repository] ************************************** +Deploy Application Deploy web application 2026-03-06T05:31:39.0961629Z ok: [vagrant] +Deploy Application Deploy web application 2026-03-06T05:31:39.0962379Z +Deploy Application Deploy web application 2026-03-06T05:31:39.0962593Z TASK [docker : Install Docker engine packages] ********************************* +Deploy Application Deploy web application 2026-03-06T05:31:39.9038774Z ok: [vagrant] +Deploy Application Deploy web application 2026-03-06T05:31:39.9039596Z +Deploy Application Deploy web application 2026-03-06T05:31:39.9039935Z TASK [docker : Install Docker Python SDK package] ****************************** +Deploy Application Deploy web application 2026-03-06T05:31:40.7113465Z ok: [vagrant] +Deploy Application Deploy web application 2026-03-06T05:31:40.7114301Z +Deploy Application Deploy web application 2026-03-06T05:31:40.7114984Z TASK [docker : Mark Docker service as ready] *********************************** +Deploy Application Deploy web application 2026-03-06T05:31:40.7248008Z ok: [vagrant] +Deploy Application Deploy web application 2026-03-06T05:31:40.7248187Z +Deploy Application Deploy web application 2026-03-06T05:31:40.7248370Z TASK [docker : Ensure Docker service is enabled and running] ******************* +Deploy Application Deploy web application 2026-03-06T05:31:41.2950461Z ok: [vagrant] +Deploy Application Deploy web application 2026-03-06T05:31:41.2951270Z +Deploy Application Deploy web application 2026-03-06T05:31:41.2951998Z TASK [docker : Record Docker installation block completion] ******************** +Deploy Application Deploy web application 2026-03-06T05:31:41.6671862Z ok: [vagrant] +Deploy Application Deploy web application 2026-03-06T05:31:41.6672474Z +Deploy Application Deploy web application 2026-03-06T05:31:41.6672884Z TASK [docker : Add deployment user to docker group] **************************** +Deploy Application Deploy web application 2026-03-06T05:31:42.1253486Z ok: [vagrant] +Deploy Application Deploy web application 2026-03-06T05:31:42.1253807Z +Deploy Application Deploy web application 2026-03-06T05:31:42.1254165Z TASK [docker : Record Docker configuration block completion] ******************* +Deploy Application Deploy web application 2026-03-06T05:31:42.4014420Z ok: [vagrant] +Deploy Application Deploy web application 2026-03-06T05:31:42.4015201Z +Deploy Application Deploy web application 2026-03-06T05:31:42.4015690Z TASK [web_app : Include web app wipe tasks] ************************************ +Deploy Application Deploy web application 2026-03-06T05:31:42.4227650Z included: /opt/actions-runner/_work/DevOps-Core-S26/DevOps-Core-S26/ansible/roles/web_app/tasks/wipe.yml for vagrant +Deploy Application Deploy web application 2026-03-06T05:31:42.4229296Z +Deploy Application Deploy web application 2026-03-06T05:31:42.4230444Z TASK [web_app : Log in to Docker Hub when credentials are available] *********** +Deploy Application Deploy web application 2026-03-06T05:31:43.0978245Z ok: [vagrant] +Deploy Application Deploy web application 2026-03-06T05:31:43.0985222Z +Deploy Application Deploy web application 2026-03-06T05:31:43.0986015Z TASK [web_app : Ensure Compose project directory exists] *********************** +Deploy Application Deploy web application 2026-03-06T05:31:43.3761498Z ok: [vagrant] +Deploy Application Deploy web application 2026-03-06T05:31:43.3761774Z +Deploy Application Deploy web application 2026-03-06T05:31:43.3762026Z TASK [web_app : Check for legacy standalone container] ************************* +Deploy Application Deploy web application 2026-03-06T05:31:44.0326329Z ok: [vagrant] +Deploy Application Deploy web application 2026-03-06T05:31:44.0326547Z +Deploy Application Deploy web application 2026-03-06T05:31:44.0326808Z TASK [web_app : Remove legacy standalone container before Compose migration] *** +Deploy Application Deploy web application 2026-03-06T05:31:44.0522208Z skipping: [vagrant] +Deploy Application Deploy web application 2026-03-06T05:31:44.0522462Z +Deploy Application Deploy web application 2026-03-06T05:31:44.0522727Z TASK [web_app : Template Docker Compose configuration] ************************* +Deploy Application Deploy web application 2026-03-06T05:31:44.6914512Z ok: [vagrant] +Deploy Application Deploy web application 2026-03-06T05:31:44.6915400Z +Deploy Application Deploy web application 2026-03-06T05:31:44.6915611Z TASK [web_app : Deploy application stack with Docker Compose] ****************** +Deploy Application Deploy web application 2026-03-06T05:31:47.5675136Z ok: [vagrant] +Deploy Application Deploy web application 2026-03-06T05:31:47.5675772Z +Deploy Application Deploy web application 2026-03-06T05:31:47.5675983Z TASK [web_app : Wait for application port] ************************************* +Deploy Application Deploy web application 2026-03-06T05:31:48.8916776Z ok: [vagrant -> localhost] +Deploy Application Deploy web application 2026-03-06T05:31:48.8917460Z +Deploy Application Deploy web application 2026-03-06T05:31:48.8917655Z TASK [web_app : Verify application health endpoint] **************************** +Deploy Application Deploy web application 2026-03-06T05:31:49.3035774Z ok: [vagrant -> localhost] +Deploy Application Deploy web application 2026-03-06T05:31:49.3035978Z +Deploy Application Deploy web application 2026-03-06T05:31:49.3036114Z PLAY RECAP ********************************************************************* +Deploy Application Deploy web application 2026-03-06T05:31:49.3036827Z vagrant : ok=22 changed=0 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0 +Deploy Application Deploy web application 2026-03-06T05:31:49.3037103Z +Deploy Application Upload deployment log 2026-03-06T05:31:49.3876767Z ##[group]Run actions/upload-artifact@v4 +Deploy Application Upload deployment log 2026-03-06T05:31:49.3877027Z with: +Deploy Application Upload deployment log 2026-03-06T05:31:49.3877263Z name: ansible-deploy-log +Deploy Application Upload deployment log 2026-03-06T05:31:49.3877536Z path: /opt/actions-runner/_work/_temp/ansible-deploy.log +Deploy Application Upload deployment log 2026-03-06T05:31:49.3878027Z if-no-files-found: warn +Deploy Application Upload deployment log 2026-03-06T05:31:49.3878218Z compression-level: 6 +Deploy Application Upload deployment log 2026-03-06T05:31:49.3878406Z overwrite: false +Deploy Application Upload deployment log 2026-03-06T05:31:49.3878581Z include-hidden-files: false +Deploy Application Upload deployment log 2026-03-06T05:31:49.3878774Z env: +Deploy Application Upload deployment log 2026-03-06T05:31:49.3878941Z ANSIBLE_DIRECTORY: ansible +Deploy Application Upload deployment log 2026-03-06T05:31:49.3879148Z DEPLOY_PLAYBOOK: playbooks/deploy.yml +Deploy Application Upload deployment log 2026-03-06T05:31:49.3879366Z DEPLOY_TAGS: app_deploy +Deploy Application Upload deployment log 2026-03-06T05:31:49.3879620Z pythonLocation: /opt/actions-runner/_work/_tool/Python/3.12.13/x64 +Deploy Application Upload deployment log 2026-03-06T05:31:49.3879995Z PKG_CONFIG_PATH: /opt/actions-runner/_work/_tool/Python/3.12.13/x64/lib/pkgconfig +Deploy Application Upload deployment log 2026-03-06T05:31:49.3880380Z Python_ROOT_DIR: /opt/actions-runner/_work/_tool/Python/3.12.13/x64 +Deploy Application Upload deployment log 2026-03-06T05:31:49.3880717Z Python2_ROOT_DIR: /opt/actions-runner/_work/_tool/Python/3.12.13/x64 +Deploy Application Upload deployment log 2026-03-06T05:31:49.3881090Z Python3_ROOT_DIR: /opt/actions-runner/_work/_tool/Python/3.12.13/x64 +Deploy Application Upload deployment log 2026-03-06T05:31:49.3881522Z LD_LIBRARY_PATH: /opt/actions-runner/_work/_tool/Python/3.12.13/x64/lib +Deploy Application Upload deployment log 2026-03-06T05:31:49.3881932Z TARGET_VM_HOST: 192.168.121.50 +Deploy Application Upload deployment log 2026-03-06T05:31:49.3882178Z ##[endgroup] +Deploy Application Upload deployment log 2026-03-06T05:31:49.5697737Z With the provided path, there will be 1 file uploaded +Deploy Application Upload deployment log 2026-03-06T05:31:49.5700524Z Artifact name is valid! +Deploy Application Upload deployment log 2026-03-06T05:31:49.5701410Z Root directory input is valid! +Deploy Application Upload deployment log 2026-03-06T05:31:50.0726944Z Beginning upload of artifact content to blob storage +Deploy Application Upload deployment log 2026-03-06T05:31:51.2153751Z Uploaded bytes 808 +Deploy Application Upload deployment log 2026-03-06T05:31:51.4759396Z Finished uploading artifact content to blob storage! +Deploy Application Upload deployment log 2026-03-06T05:31:51.4765601Z SHA256 digest of uploaded artifact zip is f81eaa1099002b69ff9e2cbf817f9266dd7ccfa0569af8cc9456757ad35a79e2 +Deploy Application Upload deployment log 2026-03-06T05:31:51.4766682Z Finalizing artifact upload +Deploy Application Upload deployment log 2026-03-06T05:31:51.7819447Z Artifact ansible-deploy-log.zip successfully finalized. Artifact ID 5792366004 +Deploy Application Upload deployment log 2026-03-06T05:31:51.7820077Z Artifact ansible-deploy-log has been successfully uploaded! Final size is 808 bytes. Artifact ID is 5792366004 +Deploy Application Upload deployment log 2026-03-06T05:31:51.7825632Z Artifact download URL: https://github.com/LocalT0aster/DevOps-Core-S26/actions/runs/22750506418/artifacts/5792366004 +Deploy Application Verify application health 2026-03-06T05:31:51.7906094Z Prepare all required actions +Deploy Application Verify application health 2026-03-06T05:31:51.7945544Z ##[group]Run ./.github/actions/http-healthcheck +Deploy Application Verify application health 2026-03-06T05:31:51.7945786Z with: +Deploy Application Verify application health 2026-03-06T05:31:51.7946000Z url: http://192.168.121.50:5000/health +Deploy Application Verify application health 2026-03-06T05:31:51.7946378Z retries: 10 +Deploy Application Verify application health 2026-03-06T05:31:51.7946541Z delay-seconds: 3 +Deploy Application Verify application health 2026-03-06T05:31:51.7946722Z jq-filter: .status == "healthy" +Deploy Application Verify application health 2026-03-06T05:31:51.7946918Z env: +Deploy Application Verify application health 2026-03-06T05:31:51.7947078Z ANSIBLE_DIRECTORY: ansible +Deploy Application Verify application health 2026-03-06T05:31:51.7947283Z DEPLOY_PLAYBOOK: playbooks/deploy.yml +Deploy Application Verify application health 2026-03-06T05:31:51.7947503Z DEPLOY_TAGS: app_deploy +Deploy Application Verify application health 2026-03-06T05:31:51.7947798Z pythonLocation: /opt/actions-runner/_work/_tool/Python/3.12.13/x64 +Deploy Application Verify application health 2026-03-06T05:31:51.7948210Z PKG_CONFIG_PATH: /opt/actions-runner/_work/_tool/Python/3.12.13/x64/lib/pkgconfig +Deploy Application Verify application health 2026-03-06T05:31:51.7948588Z Python_ROOT_DIR: /opt/actions-runner/_work/_tool/Python/3.12.13/x64 +Deploy Application Verify application health 2026-03-06T05:31:51.7948946Z Python2_ROOT_DIR: /opt/actions-runner/_work/_tool/Python/3.12.13/x64 +Deploy Application Verify application health 2026-03-06T05:31:51.7949312Z Python3_ROOT_DIR: /opt/actions-runner/_work/_tool/Python/3.12.13/x64 +Deploy Application Verify application health 2026-03-06T05:31:51.7949683Z LD_LIBRARY_PATH: /opt/actions-runner/_work/_tool/Python/3.12.13/x64/lib +Deploy Application Verify application health 2026-03-06T05:31:51.7949992Z TARGET_VM_HOST: 192.168.121.50 +Deploy Application Verify application health 2026-03-06T05:31:51.7950188Z ##[endgroup] +Deploy Application Verify application health 2026-03-06T05:31:51.7961664Z ##[group]Run set -euo pipefail +Deploy Application Verify application health 2026-03-06T05:31:51.7961940Z set -euo pipefail +Deploy Application Verify application health 2026-03-06T05:31:51.7962141Z  +Deploy Application Verify application health 2026-03-06T05:31:51.7962297Z response="" +Deploy Application Verify application health 2026-03-06T05:31:51.7962468Z  +Deploy Application Verify application health 2026-03-06T05:31:51.7962651Z for attempt in $(seq 1 "$RETRIES"); do +Deploy Application Verify application health 2026-03-06T05:31:51.7962922Z  if response="$(curl -fsSL "$URL")"; then +Deploy Application Verify application health 2026-03-06T05:31:51.7963152Z  break +Deploy Application Verify application health 2026-03-06T05:31:51.7963325Z  fi +Deploy Application Verify application health 2026-03-06T05:31:51.7963477Z  +Deploy Application Verify application health 2026-03-06T05:31:51.7963665Z  if [ "$attempt" -eq "$RETRIES" ]; then +Deploy Application Verify application health 2026-03-06T05:31:51.7964155Z  echo "Health check failed after $RETRIES attempts: $URL" >&2 +Deploy Application Verify application health 2026-03-06T05:31:51.7964541Z  exit 1 +Deploy Application Verify application health 2026-03-06T05:31:51.7964803Z  fi +Deploy Application Verify application health 2026-03-06T05:31:51.7965062Z  +Deploy Application Verify application health 2026-03-06T05:31:51.7965263Z  sleep "$DELAY_SECONDS" +Deploy Application Verify application health 2026-03-06T05:31:51.7965467Z done +Deploy Application Verify application health 2026-03-06T05:31:51.7965619Z  +Deploy Application Verify application health 2026-03-06T05:31:51.7965778Z echo "$response" | jq . +Deploy Application Verify application health 2026-03-06T05:31:51.7966048Z echo "$response" | jq -e "$JQ_FILTER" >/dev/null +Deploy Application Verify application health 2026-03-06T05:31:51.7975984Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} +Deploy Application Verify application health 2026-03-06T05:31:51.7976317Z env: +Deploy Application Verify application health 2026-03-06T05:31:51.7976490Z ANSIBLE_DIRECTORY: ansible +Deploy Application Verify application health 2026-03-06T05:31:51.7976706Z DEPLOY_PLAYBOOK: playbooks/deploy.yml +Deploy Application Verify application health 2026-03-06T05:31:51.7977112Z DEPLOY_TAGS: app_deploy +Deploy Application Verify application health 2026-03-06T05:31:51.7977471Z pythonLocation: /opt/actions-runner/_work/_tool/Python/3.12.13/x64 +Deploy Application Verify application health 2026-03-06T05:31:51.7977899Z PKG_CONFIG_PATH: /opt/actions-runner/_work/_tool/Python/3.12.13/x64/lib/pkgconfig +Deploy Application Verify application health 2026-03-06T05:31:51.7978322Z Python_ROOT_DIR: /opt/actions-runner/_work/_tool/Python/3.12.13/x64 +Deploy Application Verify application health 2026-03-06T05:31:51.7978707Z Python2_ROOT_DIR: /opt/actions-runner/_work/_tool/Python/3.12.13/x64 +Deploy Application Verify application health 2026-03-06T05:31:51.7979071Z Python3_ROOT_DIR: /opt/actions-runner/_work/_tool/Python/3.12.13/x64 +Deploy Application Verify application health 2026-03-06T05:31:51.7979436Z LD_LIBRARY_PATH: /opt/actions-runner/_work/_tool/Python/3.12.13/x64/lib +Deploy Application Verify application health 2026-03-06T05:31:51.7979733Z TARGET_VM_HOST: 192.168.121.50 +Deploy Application Verify application health 2026-03-06T05:31:51.7979968Z URL: http://192.168.121.50:5000/health +Deploy Application Verify application health 2026-03-06T05:31:51.7980186Z RETRIES: 10 +Deploy Application Verify application health 2026-03-06T05:31:51.7980346Z DELAY_SECONDS: 3 +Deploy Application Verify application health 2026-03-06T05:31:51.7980525Z JQ_FILTER: .status == "healthy" +Deploy Application Verify application health 2026-03-06T05:31:51.7980725Z ##[endgroup] +Deploy Application Verify application health 2026-03-06T05:31:51.8117339Z { +Deploy Application Verify application health 2026-03-06T05:31:51.8118416Z "status": "healthy", +Deploy Application Verify application health 2026-03-06T05:31:51.8119624Z "timestamp": "2026-03-06T05:31:51.856613+00:00", +Deploy Application Verify application health 2026-03-06T05:31:51.8125582Z "uptime_seconds": 7603 +Deploy Application Verify application health 2026-03-06T05:31:51.8126569Z } +Deploy Application Remove vault password file 2026-03-06T05:31:51.8173310Z ##[group]Run rm -f .vault_pass +Deploy Application Remove vault password file 2026-03-06T05:31:51.8173612Z rm -f .vault_pass +Deploy Application Remove vault password file 2026-03-06T05:31:51.8183658Z shell: /usr/bin/bash -e {0} +Deploy Application Remove vault password file 2026-03-06T05:31:51.8183890Z env: +Deploy Application Remove vault password file 2026-03-06T05:31:51.8184060Z ANSIBLE_DIRECTORY: ansible +Deploy Application Remove vault password file 2026-03-06T05:31:51.8184297Z DEPLOY_PLAYBOOK: playbooks/deploy.yml +Deploy Application Remove vault password file 2026-03-06T05:31:51.8184526Z DEPLOY_TAGS: app_deploy +Deploy Application Remove vault password file 2026-03-06T05:31:51.8184815Z pythonLocation: /opt/actions-runner/_work/_tool/Python/3.12.13/x64 +Deploy Application Remove vault password file 2026-03-06T05:31:51.8185349Z PKG_CONFIG_PATH: /opt/actions-runner/_work/_tool/Python/3.12.13/x64/lib/pkgconfig +Deploy Application Remove vault password file 2026-03-06T05:31:51.8185769Z Python_ROOT_DIR: /opt/actions-runner/_work/_tool/Python/3.12.13/x64 +Deploy Application Remove vault password file 2026-03-06T05:31:51.8186221Z Python2_ROOT_DIR: /opt/actions-runner/_work/_tool/Python/3.12.13/x64 +Deploy Application Remove vault password file 2026-03-06T05:31:51.8186587Z Python3_ROOT_DIR: /opt/actions-runner/_work/_tool/Python/3.12.13/x64 +Deploy Application Remove vault password file 2026-03-06T05:31:51.8186969Z LD_LIBRARY_PATH: /opt/actions-runner/_work/_tool/Python/3.12.13/x64/lib +Deploy Application Remove vault password file 2026-03-06T05:31:51.8187298Z TARGET_VM_HOST: 192.168.121.50 +Deploy Application Remove vault password file 2026-03-06T05:31:51.8187521Z ##[endgroup] +Deploy Application Post Setup Ansible toolchain 2026-03-06T05:31:51.8272725Z Post job cleanup. +Deploy Application Post Setup Ansible toolchain 2026-03-06T05:31:51.8758473Z Post job cleanup. +Deploy Application Post Setup Ansible toolchain 2026-03-06T05:31:51.9913680Z Cache hit occurred on the primary key Linux-py3.12-ansible-70fee6f2b98d7def1a2c43ddbf364d7b6b2648821ca185e0955c8d98e4cb9364, not saving cache. +Deploy Application Post Setup Ansible toolchain 2026-03-06T05:31:51.9977690Z Post job cleanup. +Deploy Application Post Checkout code 2026-03-06T05:31:52.1550112Z Post job cleanup. +Deploy Application Post Checkout code 2026-03-06T05:31:52.2320436Z [command]/usr/bin/git version +Deploy Application Post Checkout code 2026-03-06T05:31:52.2355214Z git version 2.52.0 +Deploy Application Post Checkout code 2026-03-06T05:31:52.2385866Z Temporarily overriding HOME='/opt/actions-runner/_work/_temp/92425419-0a79-44b9-9641-d9e6f2b4f52e' before making global git config changes +Deploy Application Post Checkout code 2026-03-06T05:31:52.2453359Z Adding repository directory to the temporary git global config as a safe directory +Deploy Application Post Checkout code 2026-03-06T05:31:52.2456877Z [command]/usr/bin/git config --global --add safe.directory /opt/actions-runner/_work/DevOps-Core-S26/DevOps-Core-S26 +Deploy Application Post Checkout code 2026-03-06T05:31:52.2458061Z [command]/usr/bin/git config --local --name-only --get-regexp core\.sshCommand +Deploy Application Post Checkout code 2026-03-06T05:31:52.2475428Z [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'core\.sshCommand' && git config --local --unset-all 'core.sshCommand' || :" +Deploy Application Post Checkout code 2026-03-06T05:31:52.2676524Z [command]/usr/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader +Deploy Application Post Checkout code 2026-03-06T05:31:52.2696268Z http.https://github.com/.extraheader +Deploy Application Post Checkout code 2026-03-06T05:31:52.2704496Z [command]/usr/bin/git config --local --unset-all http.https://github.com/.extraheader +Deploy Application Post Checkout code 2026-03-06T05:31:52.2731261Z [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'http\.https\:\/\/github\.com\/\.extraheader' && git config --local --unset-all 'http.https://github.com/.extraheader' || :" +Deploy Application Post Checkout code 2026-03-06T05:31:52.2879233Z [command]/usr/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir: +Deploy Application Post Checkout code 2026-03-06T05:31:52.2903772Z [command]/usr/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url +Deploy Application Complete job 2026-03-06T05:31:52.3147748Z Cleaning up orphan processes +``` + +
+ + +### Validation Status + +- The local Ansible side is already validated: `ansible-lint` passes, and the playbooks used by the workflow pass syntax checks. +- `vagrant validate` for the isolated runner VM passes. +- The GitHub Actions workflow completed successfully in run `22750506418`. +- The `Ansible Lint` and `Deploy Application` jobs both completed successfully. +- The deploy job resolved the target host from inventory, prepared `.vault_pass`, verified SSH connectivity with `ansible ping`, deployed the playbook, uploaded the deployment log artifact, checked `/health`, and removed `.vault_pass` afterwards. +- Two workflow defects were found and fixed during testing: stale self-hosted runner virtualenv caching and creating `.vault_pass` too late for the connectivity check. +- Pull requests from external forks are intentionally excluded from the secret-backed lint path, because vault decryption requires repository secrets. +- The workflow now has successful GitHub-side evidence, not just local validation. + +### Research Answers + +1. **What are the security implications of storing SSH keys in GitHub Secrets?** + - The main benefit is that the key is not committed to the repository, but it is still high-value material. Anyone who can modify a trusted workflow on the default branch can potentially exfiltrate it. The practical controls are branch protection, restricted workflow write access, least-privilege keys, and avoiding self-hosted execution on untrusted pull requests. + +2. **How would you implement a staging → production deployment pipeline?** + - I would split deployment into at least two environments, each with separate inventories, secrets, and GitHub environments. The workflow would deploy automatically to staging, run verification, and only then allow a protected manual approval gate for production. + +3. **What would you add to make rollbacks possible?** + - I would pin image tags to immutable versions instead of `latest`, persist the previously deployed tag, and add a rollback workflow input that redeploys the last known good version. For stronger rollback guarantees, I would also archive the exact Compose template and deployment metadata as workflow artifacts. + +4. **How does self-hosted runner improve security compared to GitHub-hosted?** + - In this lab's setup, the runner stays inside the local private network and can reach the VM directly without exposing SSH to the public internet. That reduces credential sprawl and keeps deployment traffic local. The tradeoff is that a self-hosted runner is persistent, so its trust boundary must be managed more carefully than GitHub-hosted ephemeral runners. + +## Task 5: Documentation + +This file now serves as the complete lab report for Lab 6. + +### Final Status + +- Task 1 blocks and tags are implemented and validated. +- Task 2 Docker Compose deployment is implemented, idempotent, and verified on the VM. +- Task 3 wipe logic is implemented and tested across the required scenarios. +- Task 4 GitHub Actions CI/CD is implemented and validated with successful workflow run `22750506418`. +- Supporting raw evidence files collected during the lab include `task1.log`, `task3.log`, and `task4.log`. diff --git a/ansible/playbooks/deploy.yml b/ansible/playbooks/deploy.yml index 0710726c35..880c313fb7 100644 --- a/ansible/playbooks/deploy.yml +++ b/ansible/playbooks/deploy.yml @@ -6,9 +6,16 @@ - ../group_vars/all.yml tasks: - - name: Run app deploy role tasks/defaults/handlers + - name: Run web app role ansible.builtin.include_role: - name: app_deploy - tasks_from: app_deploy_tasks - defaults_from: app_deploy_defaults - handlers_from: app_deploy_handlers + name: web_app + tasks_from: web_app_tasks + defaults_from: web_app_defaults + apply: + tags: + - web_app + tags: + - web_app + - app_deploy + - compose + - web_app_wipe diff --git a/ansible/playbooks/provision.yml b/ansible/playbooks/provision.yml index 77ccedc3a1..cdb77ad22a 100644 --- a/ansible/playbooks/provision.yml +++ b/ansible/playbooks/provision.yml @@ -9,10 +9,22 @@ name: common tasks_from: common_tasks defaults_from: common_defaults + apply: + tags: + - common + tags: + - common + - packages + - users - name: Run docker role tasks/defaults/handlers ansible.builtin.include_role: name: docker - tasks_from: docker_tasks defaults_from: docker_defaults - handlers_from: docker_handlers + apply: + tags: + - docker + tags: + - docker + - docker_install + - docker_config diff --git a/ansible/playbooks/site.yml b/ansible/playbooks/site.yml index 139c08f693..a80d09911d 100644 --- a/ansible/playbooks/site.yml +++ b/ansible/playbooks/site.yml @@ -1,3 +1,34 @@ --- -- import_playbook: provision.yml -- import_playbook: deploy.yml +- name: Provision and deploy application + hosts: webservers + become: true + vars_files: + - ../group_vars/all.yml + + tasks: + - name: Run common role tasks/defaults + ansible.builtin.include_role: + name: common + tasks_from: common_tasks + defaults_from: common_defaults + apply: + tags: + - common + tags: + - common + - packages + - users + + - name: Run web app role + ansible.builtin.include_role: + name: web_app + tasks_from: web_app_tasks + defaults_from: web_app_defaults + apply: + tags: + - web_app + tags: + - web_app + - app_deploy + - compose + - web_app_wipe diff --git a/ansible/requirements-ci.txt b/ansible/requirements-ci.txt new file mode 100644 index 0000000000..313cb46fde --- /dev/null +++ b/ansible/requirements-ci.txt @@ -0,0 +1,2 @@ +ansible-core>=2.16,<2.20 +ansible-lint==26.3.0 diff --git a/ansible/requirements-lint.txt b/ansible/requirements-lint.txt new file mode 100644 index 0000000000..3a71006dca --- /dev/null +++ b/ansible/requirements-lint.txt @@ -0,0 +1 @@ +ansible-lint==26.3.0 diff --git a/ansible/roles/app_deploy/defaults/app_deploy_defaults.yml b/ansible/roles/app_deploy/defaults/app_deploy_defaults.yml deleted file mode 100644 index b98b9d0b27..0000000000 --- a/ansible/roles/app_deploy/defaults/app_deploy_defaults.yml +++ /dev/null @@ -1,22 +0,0 @@ ---- -app_name: devops-app-py -docker_image: "{{ dockerhub_username }}/{{ app_name }}" -docker_image_tag: latest - -app_port: 5000 -app_container_name: devops-app -app_container_internal_port: 5000 -app_restart_policy: unless-stopped - -app_environment: - HOST: "0.0.0.0" - PORT: "{{ app_container_internal_port | string }}" -app_container_command: "gunicorn --bind 0.0.0.0:{{ app_container_internal_port }} src.main:app" - -app_healthcheck_path: /health -app_healthcheck_retries: 20 -app_healthcheck_delay: 3 -app_healthcheck_timeout: 3 -app_recreate_on_pull: true -app_healthcheck_host: "{{ ansible_host | default(inventory_hostname) }}" -app_healthcheck_delegate_to: localhost diff --git a/ansible/roles/app_deploy/handlers/app_deploy_handlers.yml b/ansible/roles/app_deploy/handlers/app_deploy_handlers.yml deleted file mode 100644 index 1fc3fba48b..0000000000 --- a/ansible/roles/app_deploy/handlers/app_deploy_handlers.yml +++ /dev/null @@ -1,6 +0,0 @@ ---- -- name: restart app container - community.docker.docker_container: - name: "{{ app_container_name }}" - state: started - restart: true diff --git a/ansible/roles/app_deploy/tasks/app_deploy_tasks.yml b/ansible/roles/app_deploy/tasks/app_deploy_tasks.yml deleted file mode 100644 index 4bab455012..0000000000 --- a/ansible/roles/app_deploy/tasks/app_deploy_tasks.yml +++ /dev/null @@ -1,88 +0,0 @@ ---- -- name: Resolve Docker Hub auth secret - ansible.builtin.set_fact: - dockerhub_auth_secret: "{{ dockerhub_password | default(docker_api_token | default('')) }}" - no_log: true - -- name: Validate required Docker Hub credentials - ansible.builtin.assert: - that: - - dockerhub_username is defined - - dockerhub_username | string | length > 0 - - dockerhub_auth_secret | string | length > 0 - fail_msg: >- - Missing Docker Hub credentials. Define dockerhub_username and one of: - dockerhub_password or docker_api_token in ansible/group_vars/all.yml (vaulted). - -- name: Log in to Docker Hub - community.docker.docker_login: - registry_url: https://index.docker.io/v1/ - username: "{{ dockerhub_username }}" - password: "{{ dockerhub_auth_secret }}" - no_log: true - -- name: Pull application image - community.docker.docker_image: - name: "{{ docker_image }}:{{ docker_image_tag }}" - source: pull - register: app_image_pull - notify: restart app container - -- name: Check whether application container already exists - community.docker.docker_container_info: - name: "{{ app_container_name }}" - register: app_container_info - -- name: Stop existing container before replacement - community.docker.docker_container: - name: "{{ app_container_name }}" - state: stopped - when: - - app_container_info.exists | bool - - app_recreate_on_pull | bool - - app_image_pull.changed - - app_container_info.container is defined and app_container_info.container.State.Running | default(false) - -- name: Remove old container before replacement - community.docker.docker_container: - name: "{{ app_container_name }}" - state: absent - when: - - app_container_info.exists | bool - - app_recreate_on_pull | bool - - app_image_pull.changed - -- name: Run application container - community.docker.docker_container: - name: "{{ app_container_name }}" - image: "{{ docker_image }}:{{ docker_image_tag }}" - command: "{{ app_container_command | default(omit) }}" - state: started - restart_policy: "{{ app_restart_policy }}" - ports: - - "{{ app_port }}:{{ app_container_internal_port }}" - env: "{{ app_environment }}" - -- name: Wait for application port - ansible.builtin.wait_for: - host: "{{ app_healthcheck_host }}" - port: "{{ app_port | int }}" - timeout: 60 - delay: 1 - delegate_to: "{{ app_healthcheck_delegate_to }}" - become: false - -- name: Verify application health endpoint - ansible.builtin.uri: - url: "http://{{ app_healthcheck_host }}:{{ app_port }}{{ app_healthcheck_path }}" - method: GET - status_code: 200 - return_content: true - timeout: "{{ app_healthcheck_timeout | int }}" - register: app_healthcheck - retries: "{{ app_healthcheck_retries | int }}" - delay: "{{ app_healthcheck_delay | int }}" - until: app_healthcheck.status == 200 - failed_when: app_healthcheck.json.status | default("") != "healthy" - delegate_to: "{{ app_healthcheck_delegate_to }}" - become: false diff --git a/ansible/roles/common/defaults/common_defaults.yml b/ansible/roles/common/defaults/common_defaults.yml index 65d0c186ad..c9f6d61424 100644 --- a/ansible/roles/common/defaults/common_defaults.yml +++ b/ansible/roles/common/defaults/common_defaults.yml @@ -11,3 +11,9 @@ common_packages: common_manage_timezone: true common_timezone: "Etc/UTC" +common_completion_log_path: "/tmp/ansible-common-role.log" + +common_managed_users: + - name: "{{ ansible_user | default('ubuntu') }}" + shell: "/bin/bash" + create_home: true diff --git a/ansible/roles/common/tasks/common_tasks.yml b/ansible/roles/common/tasks/common_tasks.yml index fbfff7a160..a0a740aa0b 100644 --- a/ansible/roles/common/tasks/common_tasks.yml +++ b/ansible/roles/common/tasks/common_tasks.yml @@ -1,13 +1,51 @@ --- -- name: Update apt cache - ansible.builtin.apt: - update_cache: true - cache_valid_time: 3600 +- name: Manage common packages + become: true + tags: + - packages + block: + - name: Update apt cache + ansible.builtin.apt: + update_cache: true + cache_valid_time: 3600 -- name: Install common packages - ansible.builtin.apt: - name: "{{ common_packages }}" - state: present + - name: Install common packages + ansible.builtin.apt: + name: "{{ common_packages }}" + state: present + + rescue: + - name: Mark common package rescue as triggered + ansible.builtin.set_fact: + common_packages_rescue_triggered: true + + - name: Refresh apt cache with fix-missing + ansible.builtin.command: + argv: + - apt-get + - update + - --fix-missing + changed_when: false + + - name: Retry apt cache update + ansible.builtin.apt: + update_cache: true + cache_valid_time: 3600 + + - name: Retry common package installation + ansible.builtin.apt: + name: "{{ common_packages }}" + state: present + + always: + - name: Record common packages block completion + ansible.builtin.lineinfile: + path: "{{ common_completion_log_path }}" + line: >- + packages block completed + (rescue_triggered={{ common_packages_rescue_triggered | default(false) }}) + create: true + mode: "0644" - name: Set /etc/timezone ansible.builtin.copy: @@ -25,3 +63,27 @@ state: link force: true when: common_manage_timezone | bool + +- name: Manage common users + become: true + tags: + - users + block: + - name: Ensure managed users exist + ansible.builtin.user: + name: "{{ item.name }}" + state: "{{ item.state | default('present') }}" + shell: "{{ item.shell | default('/bin/bash') }}" + create_home: "{{ item.create_home | default(true) }}" + loop: "{{ common_managed_users }}" + loop_control: + label: "{{ item.name }}" + when: common_managed_users | length > 0 + + always: + - name: Record common users block completion + ansible.builtin.lineinfile: + path: "{{ common_completion_log_path }}" + line: users block completed + create: true + mode: "0644" diff --git a/ansible/roles/docker/defaults/docker_defaults.yml b/ansible/roles/docker/defaults/docker_defaults.yml index b6fee5c18c..ebc8ad6ac0 100644 --- a/ansible/roles/docker/defaults/docker_defaults.yml +++ b/ansible/roles/docker/defaults/docker_defaults.yml @@ -16,3 +16,4 @@ docker_packages: docker_user: "{{ ansible_user | default('ubuntu') }}" docker_install_python_sdk: true +docker_completion_log_path: "/tmp/ansible-docker-role.log" diff --git a/ansible/roles/docker/handlers/docker_handlers.yml b/ansible/roles/docker/handlers/main.yml similarity index 75% rename from ansible/roles/docker/handlers/docker_handlers.yml rename to ansible/roles/docker/handlers/main.yml index 1a5058da5e..0162ba52da 100644 --- a/ansible/roles/docker/handlers/docker_handlers.yml +++ b/ansible/roles/docker/handlers/main.yml @@ -1,5 +1,5 @@ --- -- name: restart docker +- name: Restart Docker ansible.builtin.service: name: docker state: restarted diff --git a/ansible/roles/docker/tasks/docker_tasks.yml b/ansible/roles/docker/tasks/docker_tasks.yml deleted file mode 100644 index e856b97cda..0000000000 --- a/ansible/roles/docker/tasks/docker_tasks.yml +++ /dev/null @@ -1,56 +0,0 @@ ---- -- name: Install Docker prerequisites - ansible.builtin.apt: - name: - - apt-transport-https - - ca-certificates - - curl - - gnupg - - software-properties-common - state: present - update_cache: true - -- name: Ensure Docker keyring directory exists - ansible.builtin.file: - path: /etc/apt/keyrings - state: directory - mode: "0755" - -- name: Add Docker GPG key - ansible.builtin.get_url: - url: https://download.docker.com/linux/ubuntu/gpg - dest: /etc/apt/keyrings/docker.asc - mode: "0644" - force: true - -- name: Add Docker apt repository - ansible.builtin.apt_repository: - repo: "deb [arch={{ docker_apt_arch }} signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu {{ ansible_facts['distribution_release'] }} stable" - filename: docker - state: present - update_cache: true - -- name: Install Docker engine packages - ansible.builtin.apt: - name: "{{ docker_packages }}" - state: present - notify: restart docker - -- name: Install Docker Python SDK package - ansible.builtin.apt: - name: python3-docker - state: present - when: docker_install_python_sdk | bool - -- name: Ensure Docker service is enabled and running - ansible.builtin.service: - name: docker - state: started - enabled: true - -- name: Add deployment user to docker group - ansible.builtin.user: - name: "{{ docker_user }}" - groups: docker - append: true - when: docker_user | length > 0 diff --git a/ansible/roles/docker/tasks/main.yml b/ansible/roles/docker/tasks/main.yml new file mode 100644 index 0000000000..8e29842d8b --- /dev/null +++ b/ansible/roles/docker/tasks/main.yml @@ -0,0 +1,145 @@ +--- +- name: Load docker role defaults + ansible.builtin.include_vars: + file: "{{ role_path }}/defaults/docker_defaults.yml" + tags: + - always + +- name: Manage Docker installation + become: true + tags: + - docker_install + block: + - name: Install Docker prerequisites + ansible.builtin.apt: + name: + - apt-transport-https + - ca-certificates + - curl + - gnupg + - software-properties-common + state: present + update_cache: true + + - name: Ensure Docker keyring directory exists + ansible.builtin.file: + path: /etc/apt/keyrings + state: directory + mode: "0755" + + - name: Add Docker GPG key + ansible.builtin.get_url: + url: https://download.docker.com/linux/ubuntu/gpg + dest: /etc/apt/keyrings/docker.asc + mode: "0644" + force: true + + - name: Add Docker apt repository + ansible.builtin.apt_repository: + repo: >- + deb [arch={{ docker_apt_arch }} signed-by=/etc/apt/keyrings/docker.asc] + https://download.docker.com/linux/ubuntu + {{ ansible_facts['distribution_release'] }} stable + filename: docker + state: present + update_cache: true + + - name: Install Docker engine packages + ansible.builtin.apt: + name: "{{ docker_packages }}" + state: present + notify: Restart Docker + + - name: Install Docker Python SDK package + ansible.builtin.apt: + name: python3-docker + state: present + when: docker_install_python_sdk | bool + + - name: Mark Docker service as ready + ansible.builtin.set_fact: + docker_service_ready: true + + rescue: + - name: Mark Docker install rescue as triggered + ansible.builtin.set_fact: + docker_install_rescue_triggered: true + + - name: Wait before retrying Docker apt setup + ansible.builtin.pause: + seconds: 10 + + - name: Refresh apt cache before Docker retry + ansible.builtin.apt: + update_cache: true + cache_valid_time: 0 + + - name: Retry adding Docker GPG key + ansible.builtin.get_url: + url: https://download.docker.com/linux/ubuntu/gpg + dest: /etc/apt/keyrings/docker.asc + mode: "0644" + force: true + + - name: Retry adding Docker apt repository + ansible.builtin.apt_repository: + repo: >- + deb [arch={{ docker_apt_arch }} signed-by=/etc/apt/keyrings/docker.asc] + https://download.docker.com/linux/ubuntu + {{ ansible_facts['distribution_release'] }} stable + filename: docker + state: present + update_cache: true + + - name: Retry installing Docker engine packages + ansible.builtin.apt: + name: "{{ docker_packages }}" + state: present + notify: Restart Docker + + - name: Retry installing Docker Python SDK package + ansible.builtin.apt: + name: python3-docker + state: present + when: docker_install_python_sdk | bool + + - name: Mark Docker service as ready after retry + ansible.builtin.set_fact: + docker_service_ready: true + + always: + - name: Ensure Docker service is enabled and running + ansible.builtin.service: + name: docker + state: started + enabled: true + when: docker_service_ready | default(false) + + - name: Record Docker installation block completion + ansible.builtin.lineinfile: + path: "{{ docker_completion_log_path }}" + line: >- + docker installation block completed + (rescue_triggered={{ docker_install_rescue_triggered | default(false) }}) + create: true + mode: "0644" + +- name: Manage Docker configuration + become: true + tags: + - docker_config + block: + - name: Add deployment user to docker group + ansible.builtin.user: + name: "{{ docker_user }}" + groups: docker + append: true + when: docker_user | length > 0 + + always: + - name: Record Docker configuration block completion + ansible.builtin.lineinfile: + path: "{{ docker_completion_log_path }}" + line: docker configuration block completed + create: true + mode: "0644" diff --git a/ansible/roles/web_app/defaults/web_app_defaults.yml b/ansible/roles/web_app/defaults/web_app_defaults.yml new file mode 100644 index 0000000000..b79d064df1 --- /dev/null +++ b/ansible/roles/web_app/defaults/web_app_defaults.yml @@ -0,0 +1,46 @@ +--- +web_app_registry_username: "{{ dockerhub_username | default('') }}" +web_app_registry_password: "{{ dockerhub_password | default(docker_api_token | default('')) }}" + +web_app_name: "{{ app_name | default('devops-app-py') }}" +web_app_service_name: "{{ web_app_name }}" +web_app_image: >- + {{ docker_image | default((web_app_registry_username ~ '/' ~ web_app_name) + if web_app_registry_username | length > 0 else web_app_name) }} +web_app_image_tag: "{{ docker_tag | default(docker_image_tag | default('latest')) }}" + +web_app_port: "{{ app_port | default(5000) }}" +web_app_container_name: "{{ app_container_name | default(web_app_name) }}" +web_app_internal_port: "{{ app_internal_port | default(app_container_internal_port | default(web_app_port)) }}" +web_app_restart_policy: "{{ app_restart_policy | default('unless-stopped') }}" + +web_app_environment: >- + {{ {'HOST': '0.0.0.0', 'PORT': (web_app_internal_port | string)} + | combine(app_environment | default({})) }} + +web_app_healthcheck_path: "{{ app_healthcheck_path | default('/health') }}" +web_app_healthcheck_retries: "{{ app_healthcheck_retries | default(20) }}" +web_app_healthcheck_delay: "{{ app_healthcheck_delay | default(3) }}" +web_app_healthcheck_timeout: "{{ app_healthcheck_timeout | default(3) }}" +web_app_healthcheck_host: "{{ app_healthcheck_host | default(ansible_host | default(inventory_hostname)) }}" +web_app_healthcheck_delegate_to: "{{ app_healthcheck_delegate_to | default('localhost') }}" + +web_app_compose_version: "{{ docker_compose_version | default('3.8') }}" +web_app_compose_project_dir: "{{ compose_project_dir | default('/opt/' ~ web_app_name) }}" +web_app_compose_file_name: "docker-compose.yml" +web_app_compose_pull_policy: "{{ app_compose_pull_policy | default('always') }}" +web_app_compose_recreate: "{{ app_compose_recreate | default('auto') }}" +web_app_compose_wait: "{{ app_compose_wait | default(true) }}" +web_app_compose_wait_timeout: "{{ app_compose_wait_timeout | default(60) }}" +web_app_compose_remove_orphans: "{{ app_compose_remove_orphans | default(true) }}" +web_app_network_name: "{{ web_app_name }}-network" +web_app_container_command: "{{ app_container_command | default('') }}" + +# Wipe logic control +# Set to true to remove the deployed application before continuing. +# Wipe only: ansible-playbook playbooks/deploy.yml -e "web_app_wipe=true" --tags web_app_wipe +# Clean install: ansible-playbook playbooks/deploy.yml -e "web_app_wipe=true" +web_app_wipe: false +web_app_wipe_remove_images: false +web_app_wipe_remove_volumes: false +web_app_wipe_log_path: "/tmp/ansible-web-app-wipe.log" diff --git a/ansible/roles/web_app/meta/main.yml b/ansible/roles/web_app/meta/main.yml new file mode 100644 index 0000000000..2f1b4fbf00 --- /dev/null +++ b/ansible/roles/web_app/meta/main.yml @@ -0,0 +1,10 @@ +--- +dependencies: + - role: docker + tags: + - docker + - docker_install + - docker_config + - web_app + - app_deploy + - compose diff --git a/ansible/roles/web_app/tasks/web_app_tasks.yml b/ansible/roles/web_app/tasks/web_app_tasks.yml new file mode 100644 index 0000000000..c8de93b0ca --- /dev/null +++ b/ansible/roles/web_app/tasks/web_app_tasks.yml @@ -0,0 +1,117 @@ +--- +- name: Include web app wipe tasks + ansible.builtin.include_tasks: + file: wipe.yml + apply: + tags: + - web_app_wipe + tags: + - always + - web_app_wipe + +- name: Deploy web application with Docker Compose + become: true + tags: + - web_app + - app_deploy + - compose + block: + - name: Log in to Docker Hub when credentials are available + community.docker.docker_login: + registry_url: https://index.docker.io/v1/ + username: "{{ web_app_registry_username }}" + password: "{{ web_app_registry_password }}" + no_log: true + when: + - web_app_registry_username | string | length > 0 + - web_app_registry_password | string | length > 0 + + - name: Ensure Compose project directory exists + ansible.builtin.file: + path: "{{ web_app_compose_project_dir }}" + state: directory + owner: root + group: root + mode: "0755" + + - name: Check for legacy standalone container + community.docker.docker_container_info: + name: "{{ web_app_container_name }}" + register: web_app_legacy_container + + - name: Remove legacy standalone container before Compose migration + community.docker.docker_container: + name: "{{ web_app_container_name }}" + state: absent + when: + - web_app_legacy_container.exists | bool + - web_app_legacy_container.container is defined + - "'com.docker.compose.project' not in (web_app_legacy_container.container.Config.Labels | default({}))" + + - name: Template Docker Compose configuration + ansible.builtin.template: + src: docker-compose.yml.j2 + dest: "{{ web_app_compose_project_dir }}/{{ web_app_compose_file_name }}" + owner: root + group: root + mode: "0644" + + - name: Deploy application stack with Docker Compose + community.docker.docker_compose_v2: + project_src: "{{ web_app_compose_project_dir }}" + files: + - "{{ web_app_compose_file_name }}" + pull: "{{ web_app_compose_pull_policy }}" + recreate: "{{ web_app_compose_recreate }}" + remove_orphans: "{{ web_app_compose_remove_orphans | bool }}" + state: present + wait: "{{ web_app_compose_wait | bool }}" + wait_timeout: "{{ web_app_compose_wait_timeout | int }}" + register: web_app_compose_result + retries: 3 + delay: 10 + until: web_app_compose_result is succeeded + + - name: Wait for application port + ansible.builtin.wait_for: + host: "{{ web_app_healthcheck_host }}" + port: "{{ web_app_port | int }}" + timeout: 60 + delay: 1 + delegate_to: "{{ web_app_healthcheck_delegate_to }}" + become: false + + - name: Verify application health endpoint + ansible.builtin.uri: + url: "http://{{ web_app_healthcheck_host }}:{{ web_app_port }}{{ web_app_healthcheck_path }}" + method: GET + status_code: 200 + return_content: true + timeout: "{{ web_app_healthcheck_timeout | int }}" + register: web_app_healthcheck + retries: "{{ web_app_healthcheck_retries | int }}" + delay: "{{ web_app_healthcheck_delay | int }}" + until: web_app_healthcheck.status == 200 + failed_when: web_app_healthcheck.json.status | default("") != "healthy" + delegate_to: "{{ web_app_healthcheck_delegate_to }}" + become: false + + rescue: + - name: Capture docker compose status after failed deployment + ansible.builtin.command: + argv: + - docker + - compose + - -f + - "{{ web_app_compose_project_dir }}/{{ web_app_compose_file_name }}" + - ps + - --all + register: web_app_compose_ps + changed_when: false + failed_when: false + + - name: Fail deployment with compose status context + ansible.builtin.fail: + msg: >- + Web app deployment failed. Compose status: + {{ web_app_compose_ps.stdout | default('no compose status available') }} diff --git a/ansible/roles/web_app/tasks/wipe.yml b/ansible/roles/web_app/tasks/wipe.yml new file mode 100644 index 0000000000..12bfce55f0 --- /dev/null +++ b/ansible/roles/web_app/tasks/wipe.yml @@ -0,0 +1,69 @@ +--- +- name: Check whether Compose file exists for wipe + ansible.builtin.stat: + path: "{{ web_app_compose_project_dir }}/{{ web_app_compose_file_name }}" + register: web_app_wipe_compose_file + become: true + tags: + - web_app_wipe + +- name: Wipe web application deployment + become: true + when: web_app_wipe | bool + tags: + - web_app_wipe + block: + - name: Stop and remove Compose-managed containers + community.docker.docker_compose_v2: + project_src: "{{ web_app_compose_project_dir }}" + files: + - "{{ web_app_compose_file_name }}" + state: absent + remove_orphans: true + remove_volumes: "{{ web_app_wipe_remove_volumes | bool }}" + when: web_app_wipe_compose_file.stat.exists + register: web_app_wipe_compose_down + failed_when: false + + - name: Remove standalone web app container if present + community.docker.docker_container: + name: "{{ web_app_container_name }}" + state: absent + + - name: Remove Compose file + ansible.builtin.file: + path: "{{ web_app_compose_project_dir }}/{{ web_app_compose_file_name }}" + state: absent + + - name: Remove Compose project directory + ansible.builtin.file: + path: "{{ web_app_compose_project_dir }}" + state: absent + + - name: Optionally remove deployed image + community.docker.docker_image_remove: + name: "{{ web_app_image }}" + tag: "{{ web_app_image_tag }}" + force: true + when: web_app_wipe_remove_images | bool + register: web_app_wipe_image_remove + failed_when: false + + always: + - name: Record web app wipe completion + ansible.builtin.lineinfile: + path: "{{ web_app_wipe_log_path }}" + line: >- + web_app wipe completed + (requested={{ web_app_wipe | bool }}, + compose_file_present={{ web_app_wipe_compose_file.stat.exists | default(false) }}, + remove_images={{ web_app_wipe_remove_images | bool }}, + remove_volumes={{ web_app_wipe_remove_volumes | bool }}) + create: true + mode: "0644" + + - name: Report web app wipe status + ansible.builtin.debug: + msg: >- + Web app {{ web_app_name }} wipe completed. + Project directory={{ web_app_compose_project_dir }}. diff --git a/ansible/roles/web_app/templates/docker-compose.yml.j2 b/ansible/roles/web_app/templates/docker-compose.yml.j2 new file mode 100644 index 0000000000..0470877645 --- /dev/null +++ b/ansible/roles/web_app/templates/docker-compose.yml.j2 @@ -0,0 +1,21 @@ +services: + {{ web_app_service_name }}: + image: "{{ web_app_image }}:{{ web_app_image_tag }}" + container_name: "{{ web_app_container_name }}" +{% if web_app_container_command | length > 0 %} + command: "{{ web_app_container_command }}" +{% endif %} + ports: + - "{{ web_app_port }}:{{ web_app_internal_port }}" + environment: +{% for env_name, env_value in web_app_environment | dictsort %} + {{ env_name }}: "{{ env_value }}" +{% endfor %} + restart: "{{ web_app_restart_policy }}" + networks: + - web_app_network + +networks: + web_app_network: + name: "{{ web_app_network_name }}" + driver: bridge diff --git a/app_python/Dockerfile b/app_python/Dockerfile index e9b02ed024..f28f1d8a88 100644 --- a/app_python/Dockerfile +++ b/app_python/Dockerfile @@ -20,4 +20,4 @@ ENV PORT=5000 ENV HOST="0.0.0.0" USER appuser -CMD ["sh", "-c", "gunicorn --bind ${HOST:-0.0.0.0}:${PORT:-5000} src.flask_instance:app"] +CMD ["sh", "-c", "gunicorn --bind ${HOST:-0.0.0.0}:${PORT:-5000} src.main:app"] diff --git a/app_python/README.md b/app_python/README.md index 1979c45e82..ffbc05e2ba 100644 --- a/app_python/README.md +++ b/app_python/README.md @@ -37,9 +37,9 @@ poetry install Production-style local run with Gunicorn: ```bash -poetry run gunicorn --bind 0.0.0.0:5000 src.flask_instance:app +poetry run gunicorn --bind 0.0.0.0:5000 src.main:app # Or with custom config -HOST=127.0.0.1 PORT=8080 poetry run gunicorn --bind 127.0.0.1:8080 src.flask_instance:app +HOST=127.0.0.1 PORT=8080 poetry run gunicorn --bind 127.0.0.1:8080 src.main:app ``` ### Docker diff --git a/vagrant/.gitignore b/vagrant/.gitignore index 09fd60c6cc..f6183f774c 100644 --- a/vagrant/.gitignore +++ b/vagrant/.gitignore @@ -7,3 +7,6 @@ shared/** !shared/provision.sh !shared/provision-post-kernel.sh +!shared/provision-gh-runner.sh +!shared/provision-gh-runner-register.sh +!shared/github-runner.env.example diff --git a/vagrant/README.md b/vagrant/README.md index f7d3d056e3..24174798f9 100644 --- a/vagrant/README.md +++ b/vagrant/README.md @@ -1,8 +1,11 @@ # Vagrant (libvirt) -This VM is configured for the `libvirt` provider and uses: +This Vagrant setup is configured for the `libvirt` provider and uses: - Box: `alvistack/ubuntu-24.04` +- Machines: + - `default` — main lab VM / deployment target + - `github-runner` — isolated self-hosted GitHub Actions runner VM ## Requirements @@ -28,11 +31,22 @@ To re-run provisioning on an existing VM: vagrant provision ``` +The `github-runner` machine is defined with `autostart: false`, so it will not +come up unless you ask for it explicitly: + +```bash +cd vagrant +vagrant up github-runner +vagrant ssh github-runner +``` + Provisioning is split into two stages: - `shared/provision.sh` (kernel/package update stage) - automatic reboot between stages - `shared/provision-post-kernel.sh` (post-kernel stage with ansible install) +- `shared/provision-gh-runner.sh` (runner VM only; installs the GitHub runner binaries) +- `shared/provision-gh-runner-register.sh` (runner VM only; manual registration step) SSH key setup: @@ -44,6 +58,8 @@ Static VM IP: - default: `192.168.121.50` - override: `VM_IP=192.168.121.60 vagrant up` +- runner default: `192.168.121.51` +- runner override: `RUNNER_VM_IP=192.168.121.61 vagrant up github-runner` This setup uses: @@ -65,3 +81,68 @@ Host vagrant User vagrant IdentityFile ~/.ssh/vagrant ``` + +## GitHub Runner VM + +The runner is intentionally isolated in its own VM. That keeps the deployment +target and the CI runner state separate. + +Bring up the runner VM: + +```bash +cd vagrant +vagrant up github-runner +``` + +Base runner provisioning installs: + +- `ansible` +- `git`, `curl`, `jq`, `tar`, `unzip` +- the GitHub Actions runner under `/opt/actions-runner` +- a dedicated `github-runner` user + +Registration is a separate manual step because GitHub registration tokens are +short-lived. + +1. Copy the example environment file: + +```bash +cp shared/github-runner.env.example shared/github-runner.env +``` + +2. Edit `shared/github-runner.env` and fill in: + +- `GH_RUNNER_URL` +- `GH_RUNNER_TOKEN` +- optional runner name / labels / group / workdir + +If the runner VM is already running, sync the updated file into the guest: + +```bash +vagrant rsync github-runner +``` + +3. Run the registration provisioner: + +```bash +vagrant provision github-runner --provision-with github-runner-register +``` + +You can also pass the same values through host environment variables instead of +using `shared/github-runner.env`. + +Useful commands: + +```bash +vagrant ssh github-runner +sudo systemctl list-units 'actions.runner.*' +sudo systemctl status 'actions.runner.*' +``` + +Notes: + +- The registration step is idempotent for an already configured runner; it + starts the service again if needed. +- The runner VM does not install Docker by default. For this lab's Ansible + workflow, that is sufficient. If you later add container actions, install + Docker on the runner VM as well. diff --git a/vagrant/Vagrantfile b/vagrant/Vagrantfile index 53e78574f2..f6bc680c11 100644 --- a/vagrant/Vagrantfile +++ b/vagrant/Vagrantfile @@ -1,56 +1,100 @@ Vagrant.configure("2") do |config| - config.vm.box = "alvistack/ubuntu-24.04" - config.vm.box_check_update = false - config.vm.hostname = "devops-core-s26" - vm_ip = ENV.fetch("VM_IP", "192.168.121.50") + box_name = "alvistack/ubuntu-24.04" + target_vm_ip = ENV.fetch("VM_IP", "192.168.121.50") + runner_vm_ip = ENV.fetch("RUNNER_VM_IP", "192.168.121.51") host_ssh_key = File.expand_path("~/.ssh/vagrant") host_ssh_pub = "#{host_ssh_key}.pub" + fallback_ssh_key = File.expand_path("~/.vagrant.d/insecure_private_key") - # Prefer host key for SSH, but keep Vagrant's insecure key as a fallback. - config.ssh.insert_key = false - config.ssh.private_key_path = [ - host_ssh_key, - File.expand_path("~/.vagrant.d/insecure_private_key") - ] - - # Keep project root available in the guest for labs and tooling. - config.vm.synced_folder ".", "/vagrant", disabled: true - config.vm.synced_folder "./shared", "/shared" - config.vm.network "private_network", ip: vm_ip - - # Install host public key for `vagrant` user access. - if File.exist?(host_ssh_pub) - config.vm.provision "file", source: host_ssh_pub, destination: "/tmp/vagrant.pub" - config.vm.provision "shell", - name: "install-host-ssh-key", - inline: <<-SHELL - set -euo pipefail - if [ ! -f /tmp/vagrant.pub ]; then - echo "Skipping host SSH key install: /tmp/vagrant.pub not found." - exit 0 - fi - install -d -m 700 /home/vagrant/.ssh - touch /home/vagrant/.ssh/authorized_keys - pub_key="$(cat /tmp/vagrant.pub)" - grep -qxF "$pub_key" /home/vagrant/.ssh/authorized_keys || echo "$pub_key" >> /home/vagrant/.ssh/authorized_keys - chown -R vagrant:vagrant /home/vagrant/.ssh - chmod 700 /home/vagrant/.ssh - chmod 600 /home/vagrant/.ssh/authorized_keys - rm -f /tmp/vagrant.pub - SHELL + runner_env = { + "GH_RUNNER_VERSION" => ENV.fetch("GH_RUNNER_VERSION", ""), + "GH_RUNNER_URL" => ENV.fetch("GH_RUNNER_URL", ""), + "GH_RUNNER_TOKEN" => ENV.fetch("GH_RUNNER_TOKEN", ""), + "GH_RUNNER_NAME" => ENV.fetch("GH_RUNNER_NAME", ""), + "GH_RUNNER_LABELS" => ENV.fetch("GH_RUNNER_LABELS", ""), + "GH_RUNNER_GROUP" => ENV.fetch("GH_RUNNER_GROUP", ""), + "GH_RUNNER_WORKDIR" => ENV.fetch("GH_RUNNER_WORKDIR", ""), + "GH_RUNNER_DISABLE_UPDATE" => ENV.fetch("GH_RUNNER_DISABLE_UPDATE", "") + } + + configure_common_vm = lambda do |machine, hostname:, ip:, cpus:, memory:| + machine.vm.box = box_name + machine.vm.box_check_update = false + machine.vm.hostname = hostname + + machine.ssh.insert_key = false + machine.ssh.private_key_path = [host_ssh_key, fallback_ssh_key] + + machine.vm.synced_folder ".", "/vagrant", disabled: true + machine.vm.synced_folder "./shared", "/shared" + machine.vm.network "private_network", ip: ip + + if File.exist?(host_ssh_pub) + machine.vm.provision "file", source: host_ssh_pub, destination: "/tmp/vagrant.pub" + machine.vm.provision "shell", + name: "install-host-ssh-key", + inline: <<-SHELL + set -euo pipefail + if [ ! -f /tmp/vagrant.pub ]; then + echo "Skipping host SSH key install: /tmp/vagrant.pub not found." + exit 0 + fi + install -d -m 700 /home/vagrant/.ssh + touch /home/vagrant/.ssh/authorized_keys + pub_key="$(cat /tmp/vagrant.pub)" + grep -qxF "$pub_key" /home/vagrant/.ssh/authorized_keys || echo "$pub_key" >> /home/vagrant/.ssh/authorized_keys + chown -R vagrant:vagrant /home/vagrant/.ssh + chmod 700 /home/vagrant/.ssh + chmod 600 /home/vagrant/.ssh/authorized_keys + rm -f /tmp/vagrant.pub + SHELL + end + + machine.vm.provider :libvirt do |libvirt| + libvirt.cpus = cpus.to_i + libvirt.memory = memory.to_i + end end - # Stage 1: update/purge packages, including kernel changes. - config.vm.provision "shell", - name: "kernel-update", - path: "shared/provision.sh", - reboot: true - # Stage 2: post-reboot setup. - config.vm.provision "shell", name: "post-kernel", path: "shared/provision-post-kernel.sh" - - config.vm.provider :libvirt do |libvirt| - libvirt.cpus = ENV.fetch("VM_CPUS", "2").to_i - libvirt.memory = ENV.fetch("VM_MEMORY", "4096").to_i + config.vm.define "default", primary: true do |target| + configure_common_vm.call( + target, + hostname: "devops-core-s26", + ip: target_vm_ip, + cpus: ENV.fetch("VM_CPUS", "2"), + memory: ENV.fetch("VM_MEMORY", "2048") + ) + + target.vm.provision "shell", + name: "kernel-update", + path: "shared/provision.sh", + reboot: true + target.vm.provision "shell", name: "post-kernel", path: "shared/provision-post-kernel.sh" + end + + config.vm.define "github-runner", autostart: false do |runner| + configure_common_vm.call( + runner, + hostname: "github-runner-s26", + ip: runner_vm_ip, + cpus: ENV.fetch("RUNNER_VM_CPUS", "2"), + memory: ENV.fetch("RUNNER_VM_MEMORY", "2048") + ) + + runner.vm.provision "shell", + name: "kernel-update", + path: "shared/provision.sh", + reboot: true + runner.vm.provision "shell", name: "post-kernel", path: "shared/provision-post-kernel.sh" + runner.vm.provision "shell", + name: "github-runner-base", + path: "shared/provision-gh-runner.sh", + env: runner_env + runner.vm.provision "shell", + name: "github-runner-register", + path: "shared/provision-gh-runner-register.sh", + env: runner_env, + run: "never" end end diff --git a/vagrant/shared/github-runner.env.example b/vagrant/shared/github-runner.env.example new file mode 100644 index 0000000000..7c750fba09 --- /dev/null +++ b/vagrant/shared/github-runner.env.example @@ -0,0 +1,14 @@ +# Copy this file to shared/github-runner.env and fill in the values before +# running: +# vagrant provision github-runner --provision-with github-runner-register + +GH_RUNNER_URL="https://github.com/OWNER/REPOSITORY" +GH_RUNNER_TOKEN="REPLACE_WITH_EPHEMERAL_REGISTRATION_TOKEN" + +# Optional overrides +GH_RUNNER_NAME="github-runner-s26" +GH_RUNNER_LABELS="self-hosted,linux,vagrant" +GH_RUNNER_GROUP="Default" +GH_RUNNER_WORKDIR="_work" +# GH_RUNNER_VERSION="PIN_A_KNOWN_RUNNER_VERSION" +# GH_RUNNER_DISABLE_UPDATE="true" diff --git a/vagrant/shared/provision-gh-runner-register.sh b/vagrant/shared/provision-gh-runner-register.sh new file mode 100644 index 0000000000..be6902328a --- /dev/null +++ b/vagrant/shared/provision-gh-runner-register.sh @@ -0,0 +1,100 @@ +#!/usr/bin/env bash +set -euo pipefail + +if [ "$(id -u)" -ne 0 ]; then + echo "Please run this script as root or using sudo!" + exit 13 +fi + +if [ -f /shared/github-runner.env ]; then + set -a + # shellcheck disable=SC1091 + . /shared/github-runner.env + set +a +fi + +if [ ! -f /shared/github-runner.env ] && [ -z "${GH_RUNNER_URL:-}" ] && [ -z "${GH_RUNNER_TOKEN:-}" ]; then + cat <<'EOF' >&2 +Runner configuration is missing inside the guest. +If you created vagrant/shared/github-runner.env on the host after the VM was already running, +sync it first with: + vagrant rsync github-runner +Or bypass the shared file and pass GH_RUNNER_URL / GH_RUNNER_TOKEN in the host environment. +EOF +fi + +: "${GH_RUNNER_URL:?Set GH_RUNNER_URL in /shared/github-runner.env or the host environment.}" +: "${GH_RUNNER_TOKEN:?Set GH_RUNNER_TOKEN in /shared/github-runner.env or the host environment.}" + +if [ ! -x /opt/actions-runner/config.sh ]; then + echo "GitHub runner is not installed. Run the base provisioner first." >&2 + exit 1 +fi + +runner_name="${GH_RUNNER_NAME:-$(hostname -s)}" +runner_labels="${GH_RUNNER_LABELS:-self-hosted,linux,vagrant}" +runner_group="${GH_RUNNER_GROUP:-Default}" +runner_workdir="${GH_RUNNER_WORKDIR:-_work}" +runner_disable_update="${GH_RUNNER_DISABLE_UPDATE:-false}" + +export RUNNER_URL="$GH_RUNNER_URL" +export RUNNER_TOKEN="$GH_RUNNER_TOKEN" +export RUNNER_NAME="$runner_name" +export RUNNER_LABELS="$runner_labels" +export RUNNER_GROUP="$runner_group" +export RUNNER_WORKDIR="$runner_workdir" +export RUNNER_DISABLE_UPDATE="$runner_disable_update" + +if [ ! -f /opt/actions-runner/.runner ]; then + sudo -u github-runner --preserve-env=RUNNER_URL,RUNNER_TOKEN,RUNNER_NAME,RUNNER_LABELS,RUNNER_GROUP,RUNNER_WORKDIR,RUNNER_DISABLE_UPDATE bash <<'EOF' +set -euo pipefail +cd /opt/actions-runner + +config_args=( + ./config.sh + --unattended + --url "$RUNNER_URL" + --token "$RUNNER_TOKEN" + --name "$RUNNER_NAME" + --labels "$RUNNER_LABELS" + --work "$RUNNER_WORKDIR" + --replace +) + +if [ "$RUNNER_GROUP" != "Default" ]; then + config_args+=(--runnergroup "$RUNNER_GROUP") +fi + +if [ "$RUNNER_DISABLE_UPDATE" = "true" ]; then + config_args+=(--disableupdate) +fi + +"${config_args[@]}" +EOF +fi + +install -d /etc/needrestart/conf.d +cat <<'EOF' > /etc/needrestart/conf.d/actions_runner_services.conf +$nrconf{override_rc}{qr(^actions\.runner\..+\.service$)} = 0; +EOF + +if ! compgen -G "/etc/systemd/system/actions.runner.*.service" >/dev/null; then + ( + cd /opt/actions-runner + ./svc.sh install github-runner + ) +fi + +systemctl daemon-reload + +service_units=(/etc/systemd/system/actions.runner.*.service) +if [ "${service_units[0]}" = "/etc/systemd/system/actions.runner.*.service" ]; then + echo "Runner service unit was not created." >&2 + exit 1 +fi + +for service_unit in "${service_units[@]}"; do + systemctl enable --now "$(basename "$service_unit")" +done + +echo "GitHub runner configured and started successfully." diff --git a/vagrant/shared/provision-gh-runner.sh b/vagrant/shared/provision-gh-runner.sh new file mode 100644 index 0000000000..fe22cd89e2 --- /dev/null +++ b/vagrant/shared/provision-gh-runner.sh @@ -0,0 +1,91 @@ +#!/usr/bin/env bash +set -euo pipefail + +if [ "$(id -u)" -ne 0 ]; then + echo "Please run this script as root or using sudo!" + exit 13 +fi + +export DEBIAN_FRONTEND=noninteractive + +apt-get update +apt-get install -y --no-install-recommends \ + ca-certificates \ + curl \ + git \ + jq \ + tar \ + unzip + +if ! id -u github-runner >/dev/null 2>&1; then + useradd --create-home --home-dir /home/github-runner --shell /bin/bash github-runner +fi + +install -d -o github-runner -g github-runner /opt/actions-runner +install -d -o github-runner -g github-runner /opt/actions-runner/_work + +runner_version="${GH_RUNNER_VERSION:-}" +if [ -z "$runner_version" ]; then + runner_version="$(curl -fsSL https://api.github.com/repos/actions/runner/releases/latest | jq -r '.tag_name | ltrimstr("v")')" +fi + +runner_arch="$(dpkg --print-architecture)" +case "$runner_arch" in + amd64) + runner_arch="x64" + ;; + arm64) + runner_arch="arm64" + ;; + *) + echo "Unsupported runner architecture: $runner_arch" >&2 + exit 1 + ;; +esac + +install_marker="/opt/actions-runner/.runner-version" +installed_version="" +if [ -f "$install_marker" ]; then + installed_version="$(cat "$install_marker")" +fi + +runner_is_configured="false" +if [ -f /opt/actions-runner/.runner ]; then + runner_is_configured="true" +fi + +if [ "$installed_version" != "$runner_version" ] || [ ! -x /opt/actions-runner/bin/Runner.Listener ]; then + if [ "$runner_is_configured" = "true" ] && [ -x /opt/actions-runner/bin/Runner.Listener ]; then + cat < "$install_marker" + chown -R github-runner:github-runner /opt/actions-runner +fi + +if [ ! -f /shared/github-runner.env ]; then + cat <<'EOF' +GitHub runner base installation complete. +Create /shared/github-runner.env from /shared/github-runner.env.example, +fill in GH_RUNNER_URL and GH_RUNNER_TOKEN, then run: + vagrant provision github-runner --provision-with github-runner-register +EOF +fi From 2dc7eb8f3bb698aafc075da7e81890f0aaa079ff Mon Sep 17 00:00:00 2001 From: LocalT0aster Dan <90502400+LocalT0aster@users.noreply.github.com> Date: Fri, 13 Mar 2026 02:53:52 +0300 Subject: [PATCH 07/21] Lab07 Completed (#7) * task 1 * feat: app_python json logging * upd: actions * feat: app_go logging + proper service version * task 2 * task 3+4 * Bonus --- .github/actions/ansible-setup/action.yml | 4 +- .github/actions/python-setup/action.yml | 4 +- .github/workflows/ansible-deploy.yml | 180 +++- .github/workflows/go-docker.yml | 82 ++ .github/workflows/python-ci.yml | 4 +- .github/workflows/python-docker.yml | 12 +- .github/workflows/python-snyk.yml | 2 +- ansible/playbooks/deploy-monitoring.yml | 18 + ansible/roles/monitoring/defaults/main.yml | 83 ++ ansible/roles/monitoring/tasks/deploy.yml | 174 ++++ ansible/roles/monitoring/tasks/main.yml | 8 + ansible/roles/monitoring/tasks/setup.yml | 55 ++ .../templates/docker-compose.yml.j2 | 183 ++++ ansible/roles/monitoring/templates/env.j2 | 2 + .../templates/grafana-loki-datasource.yml.j2 | 10 + .../monitoring/templates/loki-config.yml.j2 | 42 + .../templates/promtail-config.yml.j2 | 38 + app_go/main.go | 118 ++- app_go/main_test.go | 140 +++ app_python/.dockerignore | 1 + app_python/Dockerfile | 4 +- app_python/README.md | 7 +- app_python/gunicorn.conf.py | 17 + app_python/src/flask_instance.py | 29 +- app_python/src/logging_utils.py | 73 ++ app_python/src/router.py | 25 +- app_python/tests/test_logging_utils.py | 34 + monitoring/.env.example | 2 + monitoring/.gitignore | 1 + monitoring/docker-compose.yml | 187 ++++ monitoring/docs/LAB07.md | 800 ++++++++++++++++++ monitoring/docs/img/task2_apps.png | Bin 0 -> 127189 bytes monitoring/docs/img/task2_get.png | Bin 0 -> 134741 bytes monitoring/docs/img/task2_warn.png | Bin 0 -> 88877 bytes monitoring/docs/img/task3_panel.png | Bin 0 -> 194491 bytes .../docs/img/task4_password_required.png | Bin 0 -> 127162 bytes .../grafana/provisioning/datasources/loki.yml | 10 + monitoring/loki/config.yml | 42 + monitoring/promtail/config.yml | 38 + 39 files changed, 2387 insertions(+), 42 deletions(-) create mode 100644 .github/workflows/go-docker.yml create mode 100644 ansible/playbooks/deploy-monitoring.yml create mode 100644 ansible/roles/monitoring/defaults/main.yml create mode 100644 ansible/roles/monitoring/tasks/deploy.yml create mode 100644 ansible/roles/monitoring/tasks/main.yml create mode 100644 ansible/roles/monitoring/tasks/setup.yml create mode 100644 ansible/roles/monitoring/templates/docker-compose.yml.j2 create mode 100644 ansible/roles/monitoring/templates/env.j2 create mode 100644 ansible/roles/monitoring/templates/grafana-loki-datasource.yml.j2 create mode 100644 ansible/roles/monitoring/templates/loki-config.yml.j2 create mode 100644 ansible/roles/monitoring/templates/promtail-config.yml.j2 create mode 100644 app_go/main_test.go create mode 100644 app_python/gunicorn.conf.py create mode 100644 app_python/src/logging_utils.py create mode 100644 app_python/tests/test_logging_utils.py create mode 100644 monitoring/.env.example create mode 100644 monitoring/.gitignore create mode 100644 monitoring/docker-compose.yml create mode 100644 monitoring/docs/LAB07.md create mode 100644 monitoring/docs/img/task2_apps.png create mode 100644 monitoring/docs/img/task2_get.png create mode 100644 monitoring/docs/img/task2_warn.png create mode 100644 monitoring/docs/img/task3_panel.png create mode 100644 monitoring/docs/img/task4_password_required.png create mode 100644 monitoring/grafana/provisioning/datasources/loki.yml create mode 100644 monitoring/loki/config.yml create mode 100644 monitoring/promtail/config.yml diff --git a/.github/actions/ansible-setup/action.yml b/.github/actions/ansible-setup/action.yml index db9bf8e309..8ebb487f0d 100644 --- a/.github/actions/ansible-setup/action.yml +++ b/.github/actions/ansible-setup/action.yml @@ -23,12 +23,12 @@ runs: using: composite steps: - name: Setup Python - uses: actions/setup-python@v5 + uses: actions/setup-python@v6 with: python-version: ${{ inputs.python-version }} - name: Cache Ansible toolchain - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: | ~/.cache/pip diff --git a/.github/actions/python-setup/action.yml b/.github/actions/python-setup/action.yml index 25c87fa7c7..626200b3f9 100644 --- a/.github/actions/python-setup/action.yml +++ b/.github/actions/python-setup/action.yml @@ -27,7 +27,7 @@ runs: using: composite steps: - name: Setup Python - uses: actions/setup-python@v4 + uses: actions/setup-python@v6 with: python-version: ${{ inputs.python-version }} @@ -42,7 +42,7 @@ runs: run: poetry config virtualenvs.in-project true - name: Cache Poetry dependencies - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: | ~/.cache/pypoetry diff --git a/.github/workflows/ansible-deploy.yml b/.github/workflows/ansible-deploy.yml index ce0f001192..c7e29f0a17 100644 --- a/.github/workflows/ansible-deploy.yml +++ b/.github/workflows/ansible-deploy.yml @@ -30,6 +30,7 @@ on: permissions: contents: read + actions: read concurrency: group: ansible-deploy-${{ github.ref }} @@ -47,7 +48,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout code - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Setup Ansible toolchain uses: ./.github/actions/ansible-setup @@ -58,9 +59,180 @@ jobs: ansible-directory: ${{ env.ANSIBLE_DIRECTORY }} vault-password: ${{ secrets.ANSIBLE_VAULT_PASSWORD }} + wait-for-prerequisites: + name: Wait for Prerequisite Workflows + if: github.event_name != 'workflow_dispatch' + runs-on: ubuntu-latest + timeout-minutes: 20 + steps: + - name: Wait for required workflow runs on current commit + env: + GITHUB_TOKEN: ${{ github.token }} + REPOSITORY: ${{ github.repository }} + COMMIT_SHA: ${{ github.sha }} + EVENT_NAME: ${{ github.event_name }} + REF_NAME: ${{ github.ref_name }} + BEFORE_SHA: ${{ github.event.before || '' }} + PR_NUMBER: ${{ github.event.pull_request.number || '' }} + run: | + set -euo pipefail + + api() { + curl -fsSL \ + -H "Authorization: Bearer $GITHUB_TOKEN" \ + -H "Accept: application/vnd.github+json" \ + "$1" + } + + declare -A required_workflows=() + + add_workflow() { + required_workflows["$1"]=1 + } + + changed_files=() + if [[ "$EVENT_NAME" == "pull_request" && -n "$PR_NUMBER" ]]; then + while IFS= read -r path; do + [[ -n "$path" ]] && changed_files+=("$path") + done < <( + api "https://api.github.com/repos/$REPOSITORY/pulls/$PR_NUMBER/files?per_page=100" \ + | jq -r '.[].filename' + ) + elif [[ -n "$BEFORE_SHA" && "$BEFORE_SHA" != "0000000000000000000000000000000000000000" ]]; then + while IFS= read -r path; do + [[ -n "$path" ]] && changed_files+=("$path") + done < <( + api "https://api.github.com/repos/$REPOSITORY/compare/$BEFORE_SHA...$COMMIT_SHA" \ + | jq -r '.files[]?.filename' + ) + fi + + for path in "${changed_files[@]}"; do + case "$path" in + app_go/*|.github/workflows/go-docker.yml) + if [[ "$REF_NAME" == lab* ]]; then + add_workflow "Go Docker Publish" + fi + ;; + esac + + case "$path" in + app_python/*|.github/actions/python-setup/*|.github/workflows/python-ci.yml) + add_workflow "Python CI" + ;; + esac + + case "$path" in + app_python/*|.github/workflows/python-docker.yml) + if [[ "$REF_NAME" == lab* ]]; then + add_workflow "Python Docker Publish" + fi + ;; + esac + done + + deadline=$(( $(date +%s) + 900 )) + grace_deadline=$(( $(date +%s) + 60 )) + tracked_workflows=( + "Go Docker Publish" + "Python CI" + "Python Docker Publish" + ) + + while (( $(date +%s) < deadline )); do + runs_json="$( + api "https://api.github.com/repos/$REPOSITORY/actions/runs?head_sha=$COMMIT_SHA&per_page=100" + )" + + while IFS= read -r workflow_name; do + [[ -n "$workflow_name" ]] && add_workflow "$workflow_name" + done < <( + jq -r ' + .workflow_runs[] + | select( + .name == "Go Docker Publish" + or .name == "Python CI" + or .name == "Python Docker Publish" + ) + | .name + ' <<<"$runs_json" + ) + + if (( ${#required_workflows[@]} == 0 )); then + echo "No prerequisite workflows apply to this commit." + exit 0 + fi + + pending=0 + failures=() + + for workflow_name in "${tracked_workflows[@]}"; do + if [[ -z "${required_workflows[$workflow_name]+x}" ]]; then + continue + fi + + run_json="$( + jq -c \ + --arg name "$workflow_name" \ + '.workflow_runs + | map(select(.name == $name)) + | sort_by(.run_started_at // .created_at) + | last // empty' <<<"$runs_json" + )" + + if [[ -z "$run_json" ]]; then + if (( $(date +%s) < grace_deadline )); then + echo "Waiting for workflow record: $workflow_name" + pending=1 + continue + fi + + echo "No run found for $workflow_name on $COMMIT_SHA after grace period; treating it as not triggered." + continue + fi + + status="$(jq -r '.status' <<<"$run_json")" + conclusion="$(jq -r '.conclusion // ""' <<<"$run_json")" + event="$(jq -r '.event' <<<"$run_json")" + html_url="$(jq -r '.html_url' <<<"$run_json")" + + echo "$workflow_name: status=$status conclusion=${conclusion:-n/a} event=$event" + + if [[ "$status" != "completed" ]]; then + pending=1 + continue + fi + + case "$conclusion" in + success|skipped) + ;; + *) + failures+=("$workflow_name ($conclusion) $html_url") + ;; + esac + done + + if (( ${#failures[@]} > 0 )); then + printf 'Prerequisite workflow failed: %s\n' "${failures[@]}" >&2 + exit 1 + fi + + if (( pending == 0 )); then + echo "All prerequisite workflows finished successfully." + exit 0 + fi + + sleep 15 + done + + echo "Timed out while waiting for prerequisite workflows on $COMMIT_SHA." >&2 + exit 1 + deploy: name: Deploy Application - needs: lint + needs: + - lint + - wait-for-prerequisites if: github.event_name != 'pull_request' runs-on: - self-hosted @@ -69,7 +241,7 @@ jobs: timeout-minutes: 20 steps: - name: Checkout code - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Setup Ansible toolchain uses: ./.github/actions/ansible-setup @@ -131,7 +303,7 @@ jobs: - name: Upload deployment log if: always() && steps.deploy.outputs.log-path != '' - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: name: ansible-deploy-log path: ${{ steps.deploy.outputs.log-path }} diff --git a/.github/workflows/go-docker.yml b/.github/workflows/go-docker.yml new file mode 100644 index 0000000000..a1fcc9268f --- /dev/null +++ b/.github/workflows/go-docker.yml @@ -0,0 +1,82 @@ +name: Go Docker Publish + +on: + push: + branches: + - "lab*" + paths: + - app_go/** + - .github/workflows/go-docker.yml + pull_request: + branches: + - master + types: + - closed + paths: + - app_go/** + - .github/workflows/go-docker.yml + +jobs: + build-and-push-branch: + if: github.event_name == 'push' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + - name: Derive lab+sha tag from branch + id: version + run: | + source_branch="${{ github.ref_name }}" + if [[ "$source_branch" =~ ([0-9]+) ]]; then + lab_number="${BASH_REMATCH[1]}" + lab_number=$((10#$lab_number)) + short_sha="${GITHUB_SHA::7}" + echo "branch_tag=1.${lab_number}.${short_sha}" >> "$GITHUB_OUTPUT" + else + echo "Failed to extract lab number from branch: $source_branch" >&2 + exit 1 + fi + - name: Log in to Docker Hub + uses: docker/login-action@v4 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Build and push Docker image (branch) + uses: docker/build-push-action@v7 + with: + context: ./app_go + file: ./app_go/Dockerfile + push: true + tags: | + ${{ secrets.DOCKERHUB_USERNAME }}/devops-app-go:${{ steps.version.outputs.branch_tag }} + + build-and-push: + if: github.event.pull_request.merged == true + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + - name: Derive lab version tag from merged branch + id: version + run: | + source_branch="${{ github.event.pull_request.head.ref }}" + if [[ "$source_branch" =~ ([0-9]+) ]]; then + lab_number="${BASH_REMATCH[1]}" + lab_number=$((10#$lab_number)) + echo "version_tag=1.${lab_number}" >> "$GITHUB_OUTPUT" + else + echo "Failed to extract lab number from merged branch: $source_branch" >&2 + exit 1 + fi + - name: Log in to Docker Hub + uses: docker/login-action@v4 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Build and push Docker image + uses: docker/build-push-action@v7 + with: + context: ./app_go + file: ./app_go/Dockerfile + push: true + tags: | + ${{ secrets.DOCKERHUB_USERNAME }}/devops-app-go:${{ steps.version.outputs.version_tag }} + ${{ secrets.DOCKERHUB_USERNAME }}/devops-app-go:latest diff --git a/.github/workflows/python-ci.yml b/.github/workflows/python-ci.yml index 712fe39c42..62c6a465fd 100644 --- a/.github/workflows/python-ci.yml +++ b/.github/workflows/python-ci.yml @@ -27,7 +27,7 @@ jobs: run: working-directory: ./app_python steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v6 - name: Setup Python tooling and dependencies uses: ./.github/actions/python-setup with: @@ -48,7 +48,7 @@ jobs: --cov-report=xml:test-results/coverage.xml - name: Upload pytest and coverage reports if: always() - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: name: python-test-reports path: | diff --git a/.github/workflows/python-docker.yml b/.github/workflows/python-docker.yml index dde175a645..dc486928df 100644 --- a/.github/workflows/python-docker.yml +++ b/.github/workflows/python-docker.yml @@ -21,7 +21,7 @@ jobs: if: github.event_name == 'push' runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - name: Derive lab+sha tag from branch id: version run: | @@ -36,12 +36,12 @@ jobs: exit 1 fi - name: Log in to Docker Hub - uses: docker/login-action@v3 + uses: docker/login-action@v4 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Build and push Docker image (branch) - uses: docker/build-push-action@v6 + uses: docker/build-push-action@v7 with: context: ./app_python file: ./app_python/Dockerfile @@ -53,7 +53,7 @@ jobs: if: github.event.pull_request.merged == true runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - name: Derive lab version tag from merged branch id: version run: | @@ -67,12 +67,12 @@ jobs: exit 1 fi - name: Log in to Docker Hub - uses: docker/login-action@v3 + uses: docker/login-action@v4 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Build and push Docker image - uses: docker/build-push-action@v6 + uses: docker/build-push-action@v7 with: context: ./app_python file: ./app_python/Dockerfile diff --git a/.github/workflows/python-snyk.yml b/.github/workflows/python-snyk.yml index c3297eccc1..a9967bc9b9 100644 --- a/.github/workflows/python-snyk.yml +++ b/.github/workflows/python-snyk.yml @@ -21,7 +21,7 @@ jobs: run: working-directory: ./app_python steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - name: Setup Python tooling and dependencies uses: ./.github/actions/python-setup - name: Setup Snyk CLI diff --git a/ansible/playbooks/deploy-monitoring.yml b/ansible/playbooks/deploy-monitoring.yml new file mode 100644 index 0000000000..97a00f34e2 --- /dev/null +++ b/ansible/playbooks/deploy-monitoring.yml @@ -0,0 +1,18 @@ +--- +- name: Deploy monitoring stack + hosts: webservers + become: true + vars_files: + - ../group_vars/all.yml + + tasks: + - name: Run monitoring role + ansible.builtin.include_role: + name: monitoring + apply: + tags: + - monitoring + tags: + - monitoring + - monitoring_deploy + - compose diff --git a/ansible/roles/monitoring/defaults/main.yml b/ansible/roles/monitoring/defaults/main.yml new file mode 100644 index 0000000000..d9d610fbf5 --- /dev/null +++ b/ansible/roles/monitoring/defaults/main.yml @@ -0,0 +1,83 @@ +--- +monitoring_registry_username: "{{ dockerhub_username | default('') }}" +monitoring_registry_password: "{{ dockerhub_password | default(docker_api_token | default('')) }}" + +monitoring_dir: /opt/devops-monitoring +monitoring_compose_file: docker-compose.yml +monitoring_env_file: .env +monitoring_project_name: "{{ monitoring_dir | basename }}" + +monitoring_loki_version: 3.0.0 +monitoring_promtail_version: 3.0.0 +monitoring_grafana_version: 12.3.1 + +monitoring_loki_port: 3100 +monitoring_loki_grpc_port: 9096 +monitoring_promtail_port: 9080 +monitoring_grafana_port: 3000 + +monitoring_loki_retention_period: 168h +monitoring_loki_schema_version: v13 +monitoring_loki_schema_from: "2024-01-01" + +monitoring_grafana_admin_user: "{{ grafana_admin_user | default('admin') }}" +monitoring_grafana_admin_password: "{{ grafana_admin_password | default('ChangeMe!123') }}" +monitoring_grafana_allow_embedding: true +monitoring_grafana_anonymous_enabled: false + +monitoring_python_image: >- + {{ (monitoring_registry_username ~ '/devops-app-py') + if monitoring_registry_username | length > 0 else 'localt0aster/devops-app-py' }} +monitoring_python_tag: "{{ monitoring_python_image_tag | default(docker_image_tag | default('latest')) }}" +monitoring_python_port: 8000 +monitoring_python_internal_port: 8000 +monitoring_python_app_label: devops-python +monitoring_python_health_path: /health + +monitoring_go_image: >- + {{ (monitoring_registry_username ~ '/devops-app-go') + if monitoring_registry_username | length > 0 else 'localt0aster/devops-app-go' }} +monitoring_go_tag: "{{ monitoring_go_image_tag | default(docker_image_tag | default('latest')) }}" +monitoring_go_port: 8001 +monitoring_go_internal_port: 8001 +monitoring_go_app_label: devops-go +monitoring_go_health_path: /health +monitoring_go_external_healthcheck_enabled: true +monitoring_go_healthcheck_image: curlimages/curl:8.18.0 + +monitoring_loki_cpu_limit: "1.0" +monitoring_loki_memory_limit: 1G +monitoring_loki_cpu_reservation: "0.25" +monitoring_loki_memory_reservation: 256M + +monitoring_promtail_cpu_limit: "0.5" +monitoring_promtail_memory_limit: 256M +monitoring_promtail_cpu_reservation: "0.10" +monitoring_promtail_memory_reservation: 64M + +monitoring_grafana_cpu_limit: "1.0" +monitoring_grafana_memory_limit: 512M +monitoring_grafana_cpu_reservation: "0.25" +monitoring_grafana_memory_reservation: 128M + +monitoring_app_cpu_limit: "0.5" +monitoring_app_memory_limit: 256M +monitoring_app_cpu_reservation: "0.10" +monitoring_app_memory_reservation: 64M + +monitoring_go_healthcheck_cpu_limit: "0.10" +monitoring_go_healthcheck_memory_limit: 64M +monitoring_go_healthcheck_cpu_reservation: "0.05" +monitoring_go_healthcheck_memory_reservation: 32M + +monitoring_compose_pull_policy: always +monitoring_compose_recreate: auto +monitoring_compose_wait: true +monitoring_compose_wait_timeout: 180 +monitoring_compose_remove_orphans: true + +monitoring_healthcheck_host: "{{ monitoring_public_host | default(ansible_host | default(inventory_hostname)) }}" +monitoring_healthcheck_delegate_to: "{{ monitoring_healthcheck_delegate | default('localhost') }}" +monitoring_healthcheck_timeout: 5 +monitoring_healthcheck_retries: 20 +monitoring_healthcheck_delay: 3 diff --git a/ansible/roles/monitoring/tasks/deploy.yml b/ansible/roles/monitoring/tasks/deploy.yml new file mode 100644 index 0000000000..ccb6b6b4a0 --- /dev/null +++ b/ansible/roles/monitoring/tasks/deploy.yml @@ -0,0 +1,174 @@ +--- +- name: Skip monitoring deployment actions in check mode + ansible.builtin.debug: + msg: Monitoring stack deployment is skipped in check mode. + when: ansible_check_mode + +- name: Deploy monitoring stack with Docker Compose + tags: + - monitoring + - monitoring_deploy + - compose + when: not ansible_check_mode + block: + - name: Log in to Docker Hub when credentials are available + community.docker.docker_login: + registry_url: https://index.docker.io/v1/ + username: "{{ monitoring_registry_username }}" + password: "{{ monitoring_registry_password }}" + no_log: true + when: + - monitoring_registry_username | string | length > 0 + - monitoring_registry_password | string | length > 0 + + - name: Deploy monitoring stack with Docker Compose v2 + community.docker.docker_compose_v2: + project_src: "{{ monitoring_dir }}" + files: + - "{{ monitoring_compose_file }}" + pull: "{{ monitoring_compose_pull_policy }}" + recreate: "{{ monitoring_compose_recreate }}" + remove_orphans: "{{ monitoring_compose_remove_orphans | bool }}" + state: present + wait: "{{ monitoring_compose_wait | bool }}" + wait_timeout: "{{ monitoring_compose_wait_timeout | int }}" + register: monitoring_compose_result + retries: 3 + delay: 10 + until: monitoring_compose_result is succeeded + + - name: Wait for exposed monitoring ports + ansible.builtin.wait_for: + host: "{{ monitoring_healthcheck_host }}" + port: "{{ item | int }}" + timeout: 60 + delay: 1 + loop: + - "{{ monitoring_loki_port }}" + - "{{ monitoring_promtail_port }}" + - "{{ monitoring_grafana_port }}" + - "{{ monitoring_python_port }}" + - "{{ monitoring_go_port }}" + delegate_to: "{{ monitoring_healthcheck_delegate_to }}" + become: false + + - name: Verify Loki readiness endpoint + ansible.builtin.uri: + url: "http://{{ monitoring_healthcheck_host }}:{{ monitoring_loki_port }}/ready" + method: GET + status_code: 200 + return_content: true + timeout: "{{ monitoring_healthcheck_timeout | int }}" + register: monitoring_loki_ready + retries: "{{ monitoring_healthcheck_retries | int }}" + delay: "{{ monitoring_healthcheck_delay | int }}" + until: + - monitoring_loki_ready.status == 200 + - "'ready' in (monitoring_loki_ready.content | default(''))" + delegate_to: "{{ monitoring_healthcheck_delegate_to }}" + become: false + + - name: Verify Promtail targets endpoint + ansible.builtin.uri: + url: "http://{{ monitoring_healthcheck_host }}:{{ monitoring_promtail_port }}/targets" + method: GET + status_code: 200 + timeout: "{{ monitoring_healthcheck_timeout | int }}" + register: monitoring_promtail_targets + retries: "{{ monitoring_healthcheck_retries | int }}" + delay: "{{ monitoring_healthcheck_delay | int }}" + until: monitoring_promtail_targets.status == 200 + delegate_to: "{{ monitoring_healthcheck_delegate_to }}" + become: false + + - name: Verify Grafana API health + ansible.builtin.uri: + url: "http://{{ monitoring_healthcheck_host }}:{{ monitoring_grafana_port }}/api/health" + method: GET + status_code: 200 + timeout: "{{ monitoring_healthcheck_timeout | int }}" + register: monitoring_grafana_health + retries: "{{ monitoring_healthcheck_retries | int }}" + delay: "{{ monitoring_healthcheck_delay | int }}" + until: monitoring_grafana_health.status == 200 + delegate_to: "{{ monitoring_healthcheck_delegate_to }}" + become: false + + - name: Verify Grafana requires authentication + ansible.builtin.uri: + url: "http://{{ monitoring_healthcheck_host }}:{{ monitoring_grafana_port }}/api/user" + method: GET + status_code: 401 + timeout: "{{ monitoring_healthcheck_timeout | int }}" + register: monitoring_grafana_auth_gate + retries: "{{ monitoring_healthcheck_retries | int }}" + delay: "{{ monitoring_healthcheck_delay | int }}" + until: monitoring_grafana_auth_gate.status == 401 + delegate_to: "{{ monitoring_healthcheck_delegate_to }}" + become: false + + - name: Verify Python application health endpoint + ansible.builtin.uri: + url: "http://{{ monitoring_healthcheck_host }}:{{ monitoring_python_port }}{{ monitoring_python_health_path }}" + method: GET + status_code: 200 + return_content: true + timeout: "{{ monitoring_healthcheck_timeout | int }}" + register: monitoring_python_health + retries: "{{ monitoring_healthcheck_retries | int }}" + delay: "{{ monitoring_healthcheck_delay | int }}" + until: + - monitoring_python_health.status == 200 + - monitoring_python_health.json.status | default('') == 'healthy' + delegate_to: "{{ monitoring_healthcheck_delegate_to }}" + become: false + + - name: Verify Go application health endpoint + ansible.builtin.uri: + url: "http://{{ monitoring_healthcheck_host }}:{{ monitoring_go_port }}{{ monitoring_go_health_path }}" + method: GET + status_code: 200 + return_content: true + timeout: "{{ monitoring_healthcheck_timeout | int }}" + register: monitoring_go_health + retries: "{{ monitoring_healthcheck_retries | int }}" + delay: "{{ monitoring_healthcheck_delay | int }}" + until: + - monitoring_go_health.status == 200 + - monitoring_go_health.json.status | default('') == 'healthy' + delegate_to: "{{ monitoring_healthcheck_delegate_to }}" + become: false + + - name: Read external Go healthcheck container info + community.docker.docker_container_info: + name: "{{ monitoring_project_name }}-app-go-healthcheck-1" + register: monitoring_go_healthcheck_container + when: monitoring_go_external_healthcheck_enabled | bool + + - name: Assert external Go healthcheck is healthy + ansible.builtin.assert: + that: + - monitoring_go_healthcheck_container.exists | bool + - monitoring_go_healthcheck_container.container.State.Health.Status == 'healthy' + fail_msg: External Go healthcheck container is not healthy. + when: monitoring_go_external_healthcheck_enabled | bool + + rescue: + - name: Capture docker compose status after failed monitoring deployment + ansible.builtin.command: + argv: + - docker + - compose + - -f + - "{{ monitoring_dir }}/{{ monitoring_compose_file }}" + - ps + - --all + register: monitoring_compose_ps + changed_when: false + failed_when: false + + - name: Fail deployment with compose status context + ansible.builtin.fail: + msg: >- + Monitoring deployment failed. Compose status: + {{ monitoring_compose_ps.stdout | default('no compose status available') }} diff --git a/ansible/roles/monitoring/tasks/main.yml b/ansible/roles/monitoring/tasks/main.yml new file mode 100644 index 0000000000..e0b934409c --- /dev/null +++ b/ansible/roles/monitoring/tasks/main.yml @@ -0,0 +1,8 @@ +--- +- name: Prepare monitoring stack files + ansible.builtin.include_tasks: + file: setup.yml + +- name: Deploy monitoring stack + ansible.builtin.include_tasks: + file: deploy.yml diff --git a/ansible/roles/monitoring/tasks/setup.yml b/ansible/roles/monitoring/tasks/setup.yml new file mode 100644 index 0000000000..45fc1fe486 --- /dev/null +++ b/ansible/roles/monitoring/tasks/setup.yml @@ -0,0 +1,55 @@ +--- +- name: Ensure monitoring directory structure exists + ansible.builtin.file: + path: "{{ item }}" + state: directory + owner: root + group: root + mode: "0755" + loop: + - "{{ monitoring_dir }}" + - "{{ monitoring_dir }}/loki" + - "{{ monitoring_dir }}/promtail" + - "{{ monitoring_dir }}/grafana" + - "{{ monitoring_dir }}/grafana/provisioning" + - "{{ monitoring_dir }}/grafana/provisioning/datasources" + +- name: Template monitoring environment file + ansible.builtin.template: + src: env.j2 + dest: "{{ monitoring_dir }}/{{ monitoring_env_file }}" + owner: root + group: root + mode: "0600" + +- name: Template monitoring Docker Compose configuration + ansible.builtin.template: + src: docker-compose.yml.j2 + dest: "{{ monitoring_dir }}/{{ monitoring_compose_file }}" + owner: root + group: root + mode: "0644" + +- name: Template Loki configuration + ansible.builtin.template: + src: loki-config.yml.j2 + dest: "{{ monitoring_dir }}/loki/config.yml" + owner: root + group: root + mode: "0644" + +- name: Template Promtail configuration + ansible.builtin.template: + src: promtail-config.yml.j2 + dest: "{{ monitoring_dir }}/promtail/config.yml" + owner: root + group: root + mode: "0644" + +- name: Template Grafana Loki datasource provisioning + ansible.builtin.template: + src: grafana-loki-datasource.yml.j2 + dest: "{{ monitoring_dir }}/grafana/provisioning/datasources/loki.yml" + owner: root + group: root + mode: "0644" diff --git a/ansible/roles/monitoring/templates/docker-compose.yml.j2 b/ansible/roles/monitoring/templates/docker-compose.yml.j2 new file mode 100644 index 0000000000..73178674d3 --- /dev/null +++ b/ansible/roles/monitoring/templates/docker-compose.yml.j2 @@ -0,0 +1,183 @@ +services: + loki: + image: grafana/loki:{{ monitoring_loki_version }} + command: + - -config.file=/etc/loki/config.yml + ports: + - "{{ monitoring_loki_port }}:{{ monitoring_loki_port }}" + volumes: + - ./loki/config.yml:/etc/loki/config.yml:ro + - loki-data:/loki + healthcheck: + test: + - CMD-SHELL + - wget --no-verbose --tries=1 --spider http://127.0.0.1:{{ monitoring_loki_port }}/ready || exit 1 + interval: 10s + timeout: 5s + retries: 5 + start_period: 10s + deploy: + resources: + limits: + cpus: "{{ monitoring_loki_cpu_limit }}" + memory: {{ monitoring_loki_memory_limit }} + reservations: + cpus: "{{ monitoring_loki_cpu_reservation }}" + memory: {{ monitoring_loki_memory_reservation }} + networks: + - monitoring + restart: unless-stopped + + promtail: + image: grafana/promtail:{{ monitoring_promtail_version }} + command: + - -config.file=/etc/promtail/config.yml + user: "0:0" + depends_on: + loki: + condition: service_healthy + ports: + - "{{ monitoring_promtail_port }}:{{ monitoring_promtail_port }}" + volumes: + - ./promtail/config.yml:/etc/promtail/config.yml:ro + - promtail-data:/run/promtail + - /var/run/docker.sock:/var/run/docker.sock:ro + - /var/lib/docker/containers:/var/lib/docker/containers:ro + deploy: + resources: + limits: + cpus: "{{ monitoring_promtail_cpu_limit }}" + memory: {{ monitoring_promtail_memory_limit }} + reservations: + cpus: "{{ monitoring_promtail_cpu_reservation }}" + memory: {{ monitoring_promtail_memory_reservation }} + networks: + - monitoring + restart: unless-stopped + + grafana: + image: grafana/grafana:{{ monitoring_grafana_version }} + depends_on: + loki: + condition: service_healthy + env_file: + - .env + environment: + GF_AUTH_ANONYMOUS_ENABLED: "{{ monitoring_grafana_anonymous_enabled | ternary('true', 'false') }}" + GF_SECURITY_ADMIN_USER: ${GRAFANA_ADMIN_USER} + GF_SECURITY_ADMIN_PASSWORD: ${GRAFANA_ADMIN_PASSWORD} + GF_SECURITY_ALLOW_EMBEDDING: "{{ monitoring_grafana_allow_embedding | ternary('true', 'false') }}" + ports: + - "{{ monitoring_grafana_port }}:3000" + volumes: + - grafana-data:/var/lib/grafana + - ./grafana/provisioning/datasources:/etc/grafana/provisioning/datasources:ro + healthcheck: + test: + - CMD-SHELL + - wget --no-verbose --tries=1 --spider http://127.0.0.1:3000/api/health || exit 1 + interval: 10s + timeout: 5s + retries: 5 + start_period: 15s + deploy: + resources: + limits: + cpus: "{{ monitoring_grafana_cpu_limit }}" + memory: {{ monitoring_grafana_memory_limit }} + reservations: + cpus: "{{ monitoring_grafana_cpu_reservation }}" + memory: {{ monitoring_grafana_memory_reservation }} + networks: + - monitoring + restart: unless-stopped + + app-python: + image: {{ monitoring_python_image }}:{{ monitoring_python_tag }} + environment: + HOST: "0.0.0.0" + PORT: "{{ monitoring_python_internal_port }}" + ports: + - "{{ monitoring_python_port }}:{{ monitoring_python_internal_port }}" + labels: + logging: "promtail" + app: "{{ monitoring_python_app_label }}" + healthcheck: + test: + - CMD-SHELL + - wget --no-verbose --tries=1 --spider http://127.0.0.1:{{ monitoring_python_internal_port }}{{ monitoring_python_health_path }} || exit 1 + interval: 15s + timeout: 5s + retries: 5 + start_period: 10s + deploy: + resources: + limits: + cpus: "{{ monitoring_app_cpu_limit }}" + memory: {{ monitoring_app_memory_limit }} + reservations: + cpus: "{{ monitoring_app_cpu_reservation }}" + memory: {{ monitoring_app_memory_reservation }} + networks: + - monitoring + restart: unless-stopped + + app-go: + image: {{ monitoring_go_image }}:{{ monitoring_go_tag }} + environment: + HOST: "0.0.0.0" + PORT: "{{ monitoring_go_internal_port }}" + ports: + - "{{ monitoring_go_port }}:{{ monitoring_go_internal_port }}" + labels: + logging: "promtail" + app: "{{ monitoring_go_app_label }}" + deploy: + resources: + limits: + cpus: "{{ monitoring_app_cpu_limit }}" + memory: {{ monitoring_app_memory_limit }} + reservations: + cpus: "{{ monitoring_app_cpu_reservation }}" + memory: {{ monitoring_app_memory_reservation }} + networks: + - monitoring + restart: unless-stopped +{% if monitoring_go_external_healthcheck_enabled | bool %} + + app-go-healthcheck: + image: {{ monitoring_go_healthcheck_image }} + command: + - sh + - -c + - sleep infinity + depends_on: + - app-go + healthcheck: + test: + - CMD-SHELL + - curl -fsS http://app-go:{{ monitoring_go_internal_port }}{{ monitoring_go_health_path }} >/dev/null || exit 1 + interval: 15s + timeout: 5s + retries: 5 + start_period: 10s + deploy: + resources: + limits: + cpus: "{{ monitoring_go_healthcheck_cpu_limit }}" + memory: {{ monitoring_go_healthcheck_memory_limit }} + reservations: + cpus: "{{ monitoring_go_healthcheck_cpu_reservation }}" + memory: {{ monitoring_go_healthcheck_memory_reservation }} + networks: + - monitoring + restart: unless-stopped +{% endif %} + +volumes: + loki-data: + promtail-data: + grafana-data: + +networks: + monitoring: diff --git a/ansible/roles/monitoring/templates/env.j2 b/ansible/roles/monitoring/templates/env.j2 new file mode 100644 index 0000000000..c5134d339c --- /dev/null +++ b/ansible/roles/monitoring/templates/env.j2 @@ -0,0 +1,2 @@ +GRAFANA_ADMIN_USER={{ monitoring_grafana_admin_user }} +GRAFANA_ADMIN_PASSWORD={{ monitoring_grafana_admin_password }} diff --git a/ansible/roles/monitoring/templates/grafana-loki-datasource.yml.j2 b/ansible/roles/monitoring/templates/grafana-loki-datasource.yml.j2 new file mode 100644 index 0000000000..f13a7c7c40 --- /dev/null +++ b/ansible/roles/monitoring/templates/grafana-loki-datasource.yml.j2 @@ -0,0 +1,10 @@ +apiVersion: 1 + +datasources: + - name: Loki + uid: loki + type: loki + access: proxy + url: http://loki:{{ monitoring_loki_port }} + isDefault: true + editable: true diff --git a/ansible/roles/monitoring/templates/loki-config.yml.j2 b/ansible/roles/monitoring/templates/loki-config.yml.j2 new file mode 100644 index 0000000000..c6b83653fa --- /dev/null +++ b/ansible/roles/monitoring/templates/loki-config.yml.j2 @@ -0,0 +1,42 @@ +auth_enabled: false + +server: + http_listen_port: {{ monitoring_loki_port }} + grpc_listen_port: {{ monitoring_loki_grpc_port }} + +common: + path_prefix: /loki + replication_factor: 1 + ring: + kvstore: + store: inmemory + storage: + filesystem: + chunks_directory: /loki/chunks + rules_directory: /loki/rules + +schema_config: + configs: + - from: {{ monitoring_loki_schema_from }} + store: tsdb + object_store: filesystem + schema: {{ monitoring_loki_schema_version }} + index: + prefix: index_ + period: 24h + +storage_config: + tsdb_shipper: + active_index_directory: /loki/tsdb-index + cache_location: /loki/tsdb-cache + filesystem: + directory: /loki/chunks + +limits_config: + retention_period: {{ monitoring_loki_retention_period }} + +compactor: + working_directory: /loki/compactor + compaction_interval: 10m + retention_enabled: true + delete_request_store: filesystem diff --git a/ansible/roles/monitoring/templates/promtail-config.yml.j2 b/ansible/roles/monitoring/templates/promtail-config.yml.j2 new file mode 100644 index 0000000000..2cb509ba23 --- /dev/null +++ b/ansible/roles/monitoring/templates/promtail-config.yml.j2 @@ -0,0 +1,38 @@ +server: + http_listen_port: {{ monitoring_promtail_port }} + grpc_listen_port: 0 + +positions: + filename: /run/promtail/positions.yaml + +clients: + - url: http://loki:{{ monitoring_loki_port }}/loki/api/v1/push + +scrape_configs: + - job_name: docker + docker_sd_configs: + - host: unix:///var/run/docker.sock + refresh_interval: 5s + filters: + - name: label + values: + - logging=promtail + relabel_configs: + - target_label: job + replacement: docker + - source_labels: + - __meta_docker_container_label_app + action: replace + regex: "(.+)" + replacement: "$1" + target_label: app + - source_labels: + - __meta_docker_container_name + regex: "/(.*)" + target_label: container + - source_labels: + - __meta_docker_container_label_com_docker_compose_service + target_label: compose_service + - source_labels: + - __meta_docker_container_log_stream + target_label: logstream diff --git a/app_go/main.go b/app_go/main.go index 194aa657fc..14aa5441d8 100644 --- a/app_go/main.go +++ b/app_go/main.go @@ -4,20 +4,23 @@ package main import ( "encoding/json" "fmt" - "log" + "io" "net" "net/http" "os" "runtime" "strings" + "sync" "time" ) const ( serviceName = "devops-info-service" - serviceVersion = "1.0.0" + serviceVersion = "1.7.0" serviceDescription = "DevOps course info service" serviceFramework = "Go net/http" + serviceLoggerName = "devops_info_service" + accessLoggerName = "http.access" ) type ServiceInfo struct { @@ -71,6 +74,8 @@ type HealthResponse struct { var ( // startTime is used for uptime calculations. startTime = time.Now().UTC() + logMu sync.Mutex + logOutput io.Writer = os.Stdout // endpoints is a static list used to mirror the Python app output. endpoints = []EndpointInfo{ {Path: "/", Method: http.MethodGet, Description: "Service information."}, @@ -78,6 +83,12 @@ var ( } ) +type responseRecorder struct { + http.ResponseWriter + statusCode int + bytesWritten int +} + // getServiceInfo returns static service metadata. func getServiceInfo() ServiceInfo { return ServiceInfo{ @@ -195,6 +206,61 @@ func listEndpoints() []EndpointInfo { return endpoints } +func newResponseRecorder(w http.ResponseWriter) *responseRecorder { + return &responseRecorder{ + ResponseWriter: w, + statusCode: http.StatusOK, + } +} + +func (recorder *responseRecorder) WriteHeader(statusCode int) { + recorder.statusCode = statusCode + recorder.ResponseWriter.WriteHeader(statusCode) +} + +func (recorder *responseRecorder) Write(data []byte) (int, error) { + written, err := recorder.ResponseWriter.Write(data) + recorder.bytesWritten += written + return written, err +} + +func emitLog(level, loggerName, message string, fields map[string]any) { + payload := map[string]any{ + "timestamp": time.Now().UTC().Format(time.RFC3339Nano), + "level": level, + "logger": loggerName, + } + + if message != "" { + payload["message"] = message + } + + for key, value := range fields { + payload[key] = value + } + + encoded, err := json.Marshal(payload) + if err != nil { + fmt.Fprintf(os.Stderr, "failed to marshal log entry: %v\n", err) + return + } + + logMu.Lock() + defer logMu.Unlock() + + if _, err := fmt.Fprintln(logOutput, string(encoded)); err != nil { + fmt.Fprintf(os.Stderr, "failed to write log entry: %v\n", err) + } +} + +func queryString(r *http.Request) string { + if r.URL.RawQuery == "" { + return "" + } + + return "?" + r.URL.RawQuery +} + // mainHandler serves GET /. func mainHandler(w http.ResponseWriter, r *http.Request) { payload := RootResponse{ @@ -244,24 +310,53 @@ func recoverMiddleware(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { defer func() { if err := recover(); err != nil { - log.Printf("panic: %v", err) + emitLog("ERROR", serviceLoggerName, "request panic recovered", map[string]any{ + "error": fmt.Sprint(err), + "client_ip": clientIP(r), + "method": r.Method, + "path": r.URL.Path, + "query": queryString(r), + "user_agent": r.Header.Get("User-Agent"), + }) writeJSON(w, http.StatusInternalServerError, map[string]string{ "error": "Internal Server Error", "message": "An unexpected error occurred", }) } }() - log.Printf("Request: %s %s", r.Method, r.URL.Path) next.ServeHTTP(w, r) }) } +func requestLoggingMiddleware(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + startedAt := time.Now() + recorder := newResponseRecorder(w) + + next.ServeHTTP(recorder, r) + + emitLog("INFO", accessLoggerName, "", map[string]any{ + "client_ip": clientIP(r), + "method": r.Method, + "path": r.URL.Path, + "query": queryString(r), + "status_code": recorder.statusCode, + "response_bytes": fmt.Sprintf("%d", recorder.bytesWritten), + "request_time_us": time.Since(startedAt).Microseconds(), + "user_agent": r.Header.Get("User-Agent"), + }) + }) +} + // writeJSON serializes a payload with the given status code. func writeJSON(w http.ResponseWriter, status int, payload any) { w.Header().Set("Content-Type", "application/json") w.WriteHeader(status) if err := json.NewEncoder(w).Encode(payload); err != nil { - log.Printf("encode error: %v", err) + emitLog("ERROR", serviceLoggerName, "failed to encode response", map[string]any{ + "status_code": status, + "error": err.Error(), + }) } } @@ -277,10 +372,17 @@ func main() { } addr := net.JoinHostPort(host, port) - log.Printf("Application starting on %s", addr) + emitLog("INFO", serviceLoggerName, "application starting", map[string]any{ + "address": addr, + "service": serviceName, + "version": serviceVersion, + }) - handler := recoverMiddleware(http.HandlerFunc(router)) + handler := requestLoggingMiddleware(recoverMiddleware(http.HandlerFunc(router))) if err := http.ListenAndServe(addr, handler); err != nil { - log.Fatalf("server error: %v", err) + emitLog("ERROR", serviceLoggerName, "server error", map[string]any{ + "error": err.Error(), + }) + os.Exit(1) } } diff --git a/app_go/main_test.go b/app_go/main_test.go new file mode 100644 index 0000000000..2622645ec9 --- /dev/null +++ b/app_go/main_test.go @@ -0,0 +1,140 @@ +package main + +import ( + "bytes" + "encoding/json" + "io" + "net/http" + "net/http/httptest" + "testing" +) + +func captureLogOutput(w io.Writer) func() { + logMu.Lock() + previous := logOutput + logOutput = w + logMu.Unlock() + + return func() { + logMu.Lock() + logOutput = previous + logMu.Unlock() + } +} + +func decodeLogEntry(t *testing.T, buffer *bytes.Buffer) map[string]any { + t.Helper() + + lines := bytes.Split(bytes.TrimSpace(buffer.Bytes()), []byte("\n")) + if len(lines) != 1 { + t.Fatalf("expected exactly one log line, got %d", len(lines)) + } + + var entry map[string]any + if err := json.Unmarshal(lines[0], &entry); err != nil { + t.Fatalf("failed to decode log entry: %v", err) + } + + return entry +} + +func TestRequestLoggingMiddlewareEmitsJSONAccessLog(t *testing.T) { + var buffer bytes.Buffer + restore := captureLogOutput(&buffer) + defer restore() + + handler := requestLoggingMiddleware(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusCreated) + _, _ = w.Write([]byte(`{"ok":true}`)) + })) + + request := httptest.NewRequest(http.MethodGet, "/health?full=1", nil) + request.RemoteAddr = "203.0.113.10:4321" + request.Header.Set("User-Agent", "go-test") + + recorder := httptest.NewRecorder() + handler.ServeHTTP(recorder, request) + + if recorder.Code != http.StatusCreated { + t.Fatalf("expected status %d, got %d", http.StatusCreated, recorder.Code) + } + + entry := decodeLogEntry(t, &buffer) + if entry["level"] != "INFO" { + t.Fatalf("expected INFO level, got %#v", entry["level"]) + } + if entry["logger"] != accessLoggerName { + t.Fatalf("expected logger %q, got %#v", accessLoggerName, entry["logger"]) + } + if entry["client_ip"] != "203.0.113.10" { + t.Fatalf("expected client_ip to be logged, got %#v", entry["client_ip"]) + } + if entry["method"] != http.MethodGet { + t.Fatalf("expected method to be logged, got %#v", entry["method"]) + } + if entry["path"] != "/health" { + t.Fatalf("expected path to be logged, got %#v", entry["path"]) + } + if entry["query"] != "?full=1" { + t.Fatalf("expected query string to be logged, got %#v", entry["query"]) + } + if entry["status_code"] != float64(http.StatusCreated) { + t.Fatalf("expected status_code to be logged, got %#v", entry["status_code"]) + } + if entry["response_bytes"] != "11" { + t.Fatalf("expected response_bytes to be logged, got %#v", entry["response_bytes"]) + } + if _, ok := entry["request_time_us"].(float64); !ok { + t.Fatalf("expected request_time_us to be numeric, got %#v", entry["request_time_us"]) + } + if entry["user_agent"] != "go-test" { + t.Fatalf("expected user_agent to be logged, got %#v", entry["user_agent"]) + } + if _, hasMessage := entry["message"]; hasMessage { + t.Fatalf("access log should not include message, got %#v", entry["message"]) + } +} + +func TestRecoverMiddlewareEmitsJSONPanicLog(t *testing.T) { + var buffer bytes.Buffer + restore := captureLogOutput(&buffer) + defer restore() + + handler := recoverMiddleware(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + panic("boom") + })) + + request := httptest.NewRequest(http.MethodGet, "/explode", nil) + request.RemoteAddr = "203.0.113.20:8080" + request.Header.Set("User-Agent", "go-test") + + recorder := httptest.NewRecorder() + handler.ServeHTTP(recorder, request) + + if recorder.Code != http.StatusInternalServerError { + t.Fatalf("expected status %d, got %d", http.StatusInternalServerError, recorder.Code) + } + + entry := decodeLogEntry(t, &buffer) + if entry["level"] != "ERROR" { + t.Fatalf("expected ERROR level, got %#v", entry["level"]) + } + if entry["logger"] != serviceLoggerName { + t.Fatalf("expected logger %q, got %#v", serviceLoggerName, entry["logger"]) + } + if entry["message"] != "request panic recovered" { + t.Fatalf("expected panic message to be logged, got %#v", entry["message"]) + } + if entry["error"] != "boom" { + t.Fatalf("expected panic error to be logged, got %#v", entry["error"]) + } + if entry["path"] != "/explode" { + t.Fatalf("expected panic path to be logged, got %#v", entry["path"]) + } + if entry["query"] != "" { + t.Fatalf("expected empty query string, got %#v", entry["query"]) + } + if entry["client_ip"] != "203.0.113.20" { + t.Fatalf("expected client_ip to be logged, got %#v", entry["client_ip"]) + } +} diff --git a/app_python/.dockerignore b/app_python/.dockerignore index 511a810855..deb2fd9687 100644 --- a/app_python/.dockerignore +++ b/app_python/.dockerignore @@ -2,3 +2,4 @@ !src/** !pyproject.toml !poetry.lock +!gunicorn.conf.py diff --git a/app_python/Dockerfile b/app_python/Dockerfile index f28f1d8a88..2c59bb0ca7 100644 --- a/app_python/Dockerfile +++ b/app_python/Dockerfile @@ -10,7 +10,7 @@ RUN pip install --no-cache-dir "poetry==$POETRY_VERSION" \ WORKDIR /app -COPY pyproject.toml poetry.lock ./ +COPY pyproject.toml poetry.lock gunicorn.conf.py ./ RUN poetry config virtualenvs.create false \ && poetry install --only main --no-interaction --no-ansi --no-root @@ -20,4 +20,4 @@ ENV PORT=5000 ENV HOST="0.0.0.0" USER appuser -CMD ["sh", "-c", "gunicorn --bind ${HOST:-0.0.0.0}:${PORT:-5000} src.main:app"] +CMD ["sh", "-c", "gunicorn --config /app/gunicorn.conf.py src.main:app"] diff --git a/app_python/README.md b/app_python/README.md index ffbc05e2ba..1415a24a2a 100644 --- a/app_python/README.md +++ b/app_python/README.md @@ -37,11 +37,12 @@ poetry install Production-style local run with Gunicorn: ```bash -poetry run gunicorn --bind 0.0.0.0:5000 src.main:app -# Or with custom config -HOST=127.0.0.1 PORT=8080 poetry run gunicorn --bind 127.0.0.1:8080 src.main:app +poetry run gunicorn --config gunicorn.conf.py src.main:app +HOST=127.0.0.1 PORT=8080 poetry run gunicorn --config gunicorn.conf.py src.main:app ``` +Gunicorn access logs are emitted as JSON so Loki can parse request fields cleanly. + ### Docker - Run the container: diff --git a/app_python/gunicorn.conf.py b/app_python/gunicorn.conf.py new file mode 100644 index 0000000000..187118541e --- /dev/null +++ b/app_python/gunicorn.conf.py @@ -0,0 +1,17 @@ +"""Gunicorn configuration for container deployment.""" + +from __future__ import annotations + +import os + +bind = f"{os.getenv('HOST', '0.0.0.0')}:{os.getenv('PORT', '5000')}" +workers = int(os.getenv("GUNICORN_WORKERS", "1")) +accesslog = "-" +errorlog = "-" +loglevel = os.getenv("LOG_LEVEL", "info").lower() +access_log_format = ( + '{"timestamp":"%(t)s","level":"INFO","logger":"gunicorn.access",' + '"client_ip":"%(h)s","method":"%(m)s","path":"%(U)s","query":"%(q)s",' + '"status_code":%(s)s,"response_bytes":"%(B)s","request_time_us":%(D)s,' + '"user_agent":"%(a)s"}' +) diff --git a/app_python/src/flask_instance.py b/app_python/src/flask_instance.py index 7f3267ba03..13950caaff 100644 --- a/app_python/src/flask_instance.py +++ b/app_python/src/flask_instance.py @@ -1,16 +1,29 @@ -""" -Flask app instance and shared process-level state. -""" +"""Flask app instance and shared process-level state.""" from datetime import datetime, timezone -import logging +import os from flask import Flask -logging.basicConfig( - level=logging.INFO, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s" -) -logger = logging.getLogger(__name__) +try: + from .logging_utils import configure_json_logger +except ImportError: # pragma: no cover - allows `python src/main.py` + from logging_utils import configure_json_logger app = Flask("DevOps Info Service") START_TIME = datetime.now(timezone.utc) # Application start time (UTC). +logger = configure_json_logger("devops_info_service") + +app.logger.handlers = list(logger.handlers) +app.logger.setLevel(logger.level) +app.logger.propagate = False + +logger.info( + "application initialized", + extra={ + "event": "startup", + "host": os.getenv("HOST", "0.0.0.0"), + "port": int(os.getenv("PORT", 5000)), + "debug": os.getenv("DEBUG", "False").lower() == "true", + }, +) diff --git a/app_python/src/logging_utils.py b/app_python/src/logging_utils.py new file mode 100644 index 0000000000..1f4017ee6a --- /dev/null +++ b/app_python/src/logging_utils.py @@ -0,0 +1,73 @@ +"""Shared JSON logging helpers for the Python service.""" + +from __future__ import annotations + +from datetime import datetime, timezone +import json +import logging +import os +import sys +from typing import Any + +_RESERVED_RECORD_FIELDS = frozenset( + vars(logging.LogRecord("", logging.INFO, "", 0, "", (), None)).keys() +) | {"message", "asctime"} + + +def _to_jsonable(value: Any) -> Any: + """Convert values into JSON-safe representations.""" + if isinstance(value, (str, int, float, bool)) or value is None: + return value + if isinstance(value, datetime): + return value.astimezone(timezone.utc).isoformat().replace("+00:00", "Z") + if isinstance(value, dict): + return {str(key): _to_jsonable(item) for key, item in value.items()} + if isinstance(value, (list, tuple, set)): + return [_to_jsonable(item) for item in value] + return str(value) + + +class JSONFormatter(logging.Formatter): + """Format log records as a single JSON object per line.""" + + def format(self, record: logging.LogRecord) -> str: + payload: dict[str, Any] = { + "timestamp": datetime.fromtimestamp( + record.created, tz=timezone.utc + ).isoformat().replace("+00:00", "Z"), + "level": record.levelname, + "logger": record.name, + "message": record.getMessage(), + } + + for key, value in record.__dict__.items(): + if key in _RESERVED_RECORD_FIELDS or key.startswith("_"): + continue + payload[key] = _to_jsonable(value) + + if record.exc_info: + payload["exc_info"] = self.formatException(record.exc_info) + if record.stack_info: + payload["stack_info"] = self.formatStack(record.stack_info) + + return json.dumps(payload, separators=(",", ":")) + + +def get_log_level() -> int: + """Return the configured application log level.""" + raw_level = os.getenv("LOG_LEVEL", "INFO").upper() + return getattr(logging, raw_level, logging.INFO) + + +def configure_json_logger(name: str) -> logging.Logger: + """Create a stdout logger that emits JSON records.""" + logger = logging.getLogger(name) + logger.handlers.clear() + logger.setLevel(get_log_level()) + logger.propagate = False + + handler = logging.StreamHandler(sys.stdout) + handler.setFormatter(JSONFormatter()) + logger.addHandler(handler) + + return logger diff --git a/app_python/src/router.py b/app_python/src/router.py index 994b1340e4..b2590de495 100644 --- a/app_python/src/router.py +++ b/app_python/src/router.py @@ -15,7 +15,7 @@ except ImportError: # pragma: no cover - allows `python src/main.py` from flask_instance import START_TIME, app, logger -__version__ = "1.0.0" +__version__ = "1.7.0" def get_service_info() -> dict[str, str]: @@ -84,6 +84,13 @@ def get_request_info(req) -> dict[str, str | None]: } +def get_request_log_context(req, status_code: int) -> dict[str, str | int | None]: + """Return request metadata suitable for structured logs.""" + context = get_request_info(req) + context["status_code"] = status_code + return context + + def list_routes() -> list[dict[str, str]]: """Return a flat list of route + method + description.""" out: list[dict[str, str]] = [] @@ -113,7 +120,6 @@ def list_routes() -> list[dict[str, str]]: @app.route("/") def index(): """Service information.""" - logger.debug("Request: %s %s", request.method, request.path) return jsonify( { "service": get_service_info(), @@ -128,7 +134,6 @@ def index(): @app.route("/health") def health(): """Health check.""" - logger.debug("Request: %s %s", request.method, request.path) return jsonify( { "status": "healthy", @@ -141,13 +146,25 @@ def health(): @app.errorhandler(404) def not_found(error): # noqa: ARG001 """Return a JSON 404 payload.""" - logger.debug("Request: %s %s", request.method, request.path) + logger.warning( + "request returned not found", + extra=get_request_log_context(request, status_code=404), + ) return jsonify({"error": "Not Found", "message": "Endpoint does not exist"}), 404 @app.errorhandler(500) def internal_error(error): # noqa: ARG001 """Return a JSON 500 payload.""" + original_error = getattr(error, "original_exception", None) or error + logger.error( + "request failed", + extra={ + **get_request_log_context(request, status_code=500), + "error_type": type(original_error).__name__, + "error": str(original_error), + }, + ) return ( jsonify( { diff --git a/app_python/tests/test_logging_utils.py b/app_python/tests/test_logging_utils.py new file mode 100644 index 0000000000..bef1790ef3 --- /dev/null +++ b/app_python/tests/test_logging_utils.py @@ -0,0 +1,34 @@ +"""Unit tests for JSON logging helpers.""" + +import json +import logging + +from src.logging_utils import JSONFormatter + + +def test_json_formatter_serializes_message_and_extra_fields(): + """Formatter should emit a JSON line with standard and custom fields.""" + record = logging.LogRecord( + name="devops_info_service", + level=logging.INFO, + pathname=__file__, + lineno=12, + msg="hello %s", + args=("world",), + exc_info=None, + ) + record.client_ip = "203.0.113.7" + record.method = "GET" + record.path = "/health" + record.status_code = 200 + + payload = json.loads(JSONFormatter().format(record)) + + assert payload["logger"] == "devops_info_service" + assert payload["level"] == "INFO" + assert payload["message"] == "hello world" + assert payload["client_ip"] == "203.0.113.7" + assert payload["method"] == "GET" + assert payload["path"] == "/health" + assert payload["status_code"] == 200 + assert payload["timestamp"].endswith("Z") diff --git a/monitoring/.env.example b/monitoring/.env.example new file mode 100644 index 0000000000..5b4ba04148 --- /dev/null +++ b/monitoring/.env.example @@ -0,0 +1,2 @@ +GRAFANA_ADMIN_USER=admin +GRAFANA_ADMIN_PASSWORD=ChangeMe!123 diff --git a/monitoring/.gitignore b/monitoring/.gitignore new file mode 100644 index 0000000000..03bd4129be --- /dev/null +++ b/monitoring/.gitignore @@ -0,0 +1 @@ +*.env diff --git a/monitoring/docker-compose.yml b/monitoring/docker-compose.yml new file mode 100644 index 0000000000..ac36c52b2e --- /dev/null +++ b/monitoring/docker-compose.yml @@ -0,0 +1,187 @@ +services: + loki: + image: grafana/loki:3.0.0 + command: + - -config.file=/etc/loki/config.yml + ports: + - "3100:3100" + volumes: + - ./loki/config.yml:/etc/loki/config.yml:ro + - loki-data:/loki + healthcheck: + test: + - CMD-SHELL + - wget --no-verbose --tries=1 --spider http://127.0.0.1:3100/ready || exit 1 + interval: 10s + timeout: 5s + retries: 5 + start_period: 10s + deploy: + resources: + limits: + cpus: "1.0" + memory: 1G + reservations: + cpus: "0.25" + memory: 256M + networks: + - monitoring + restart: unless-stopped + + promtail: + image: grafana/promtail:3.0.0 + command: + - -config.file=/etc/promtail/config.yml + user: "0:0" + depends_on: + loki: + condition: service_healthy + ports: + - "9080:9080" + volumes: + - ./promtail/config.yml:/etc/promtail/config.yml:ro + - promtail-data:/run/promtail + - /var/run/docker.sock:/var/run/docker.sock:ro + - /var/lib/docker/containers:/var/lib/docker/containers:ro + deploy: + resources: + limits: + cpus: "0.5" + memory: 256M + reservations: + cpus: "0.10" + memory: 64M + networks: + - monitoring + restart: unless-stopped + + grafana: + image: grafana/grafana:12.3.1 + depends_on: + loki: + condition: service_healthy + environment: + GF_AUTH_ANONYMOUS_ENABLED: "false" + GF_SECURITY_ADMIN_USER: ${GRAFANA_ADMIN_USER:-admin} + GF_SECURITY_ADMIN_PASSWORD: ${GRAFANA_ADMIN_PASSWORD:?set in monitoring/.env} + GF_SECURITY_ALLOW_EMBEDDING: "true" + ports: + - "3000:3000" + volumes: + - grafana-data:/var/lib/grafana + - ./grafana/provisioning/datasources:/etc/grafana/provisioning/datasources:ro + healthcheck: + test: + - CMD-SHELL + - wget --no-verbose --tries=1 --spider http://127.0.0.1:3000/api/health || exit 1 + interval: 10s + timeout: 5s + retries: 5 + start_period: 15s + deploy: + resources: + limits: + cpus: "1.0" + memory: 512M + reservations: + cpus: "0.25" + memory: 128M + networks: + - monitoring + restart: unless-stopped + + app-python: + image: localt0aster/devops-app-py:1.7.9a42ee5 + # Re-enable local builds if Docker networking breaks behind the tun/VPN setup. + # build: + # context: ../app_python + # network: host + environment: + HOST: "0.0.0.0" + PORT: "8000" + ports: + - "8000:8000" + labels: + logging: "promtail" + app: "devops-python" + healthcheck: + test: + - CMD-SHELL + - wget --no-verbose --tries=1 --spider http://127.0.0.1:8000/health || exit 1 + interval: 15s + timeout: 5s + retries: 5 + start_period: 10s + deploy: + resources: + limits: + cpus: "0.5" + memory: 256M + reservations: + cpus: "0.10" + memory: 64M + networks: + - monitoring + restart: unless-stopped + + app-go: + image: localt0aster/devops-app-go:1.7.9a42ee5 + # Re-enable local builds if Docker networking breaks behind the tun/VPN setup. + # build: + # context: ../app_go + # network: host + environment: + HOST: "0.0.0.0" + PORT: "8001" + ports: + - "8001:8001" + labels: + logging: "promtail" + app: "devops-go" + deploy: + resources: + limits: + cpus: "0.5" + memory: 256M + reservations: + cpus: "0.10" + memory: 64M + networks: + - monitoring + restart: unless-stopped + + app-go-healthcheck: + image: curlimages/curl:8.18.0 + command: + - sh + - -c + - sleep infinity + depends_on: + - app-go + healthcheck: + test: + - CMD-SHELL + - curl -fsS http://app-go:8001/health >/dev/null || exit 1 + interval: 15s + timeout: 5s + retries: 5 + start_period: 10s + deploy: + resources: + limits: + cpus: "0.10" + memory: 64M + reservations: + cpus: "0.05" + memory: 32M + networks: + - monitoring + restart: unless-stopped + +volumes: + loki-data: + promtail-data: + grafana-data: + +networks: + monitoring: diff --git a/monitoring/docs/LAB07.md b/monitoring/docs/LAB07.md new file mode 100644 index 0000000000..cd74a47a51 --- /dev/null +++ b/monitoring/docs/LAB07.md @@ -0,0 +1,800 @@ +# LAB07 - Observability & Logging with Loki Stack + +## 1. Architecture + +This lab uses a single Docker Compose stack for log collection, storage, querying, and visualization. + +- `loki` stores logs on local disk with TSDB and schema `v13`. +- `promtail` discovers Docker containers through the Docker socket and ships selected logs to Loki. +- `grafana` uses Loki as the default data source and provides Explore plus a custom dashboard. +- `app-python` and `app-go` write structured JSON logs to container stdout. +- Only containers labeled `logging=promtail` are scraped. + +Current image tags in Compose are branch-style image tags: + +- `localt0aster/devops-app-py:1.7.9a42ee5` +- `localt0aster/devops-app-go:1.7.9a42ee5` + +The application payloads themselves report service version `1.7.0`. + +```text +curl / browser + | + v ++-----------------------------+ +| app-python app-go | +| JSON logs to stdout | ++-----------------------------+ + | + v ++-----------------------------+ +| promtail | +| docker_sd + relabeling | ++-----------------------------+ + | + v ++-----------------------------+ +| loki | +| TSDB + filesystem storage | ++-----------------------------+ + | + v ++-----------------------------+ +| grafana | +| Explore + dashboard | ++-----------------------------+ +``` + +## 2. Setup Guide + +The project structure for the monitoring stack is: + +```text +monitoring/ +├── docker-compose.yml +├── loki/config.yml +├── promtail/config.yml +├── grafana/provisioning/datasources/loki.yml +└── docs/LAB07.md +``` + +Bring the stack up from the repository root: + +```bash +cd monitoring +docker compose up -d +docker compose ps +``` + +Useful local endpoints: + +- Grafana: `http://localhost:3000` +- Loki: `http://localhost:3100` +- Promtail: `http://localhost:9080` +- Python app: `http://localhost:8000` +- Go app: `http://localhost:8001` + +Basic verification commands: + +```bash +curl -fSsL localhost:3100/ready +curl -fSsL localhost:9080/targets +curl -fSsL localhost:3000/api/health +curl -fSsL localhost:8000/health +curl -fSsL localhost:8001/health +``` + +Grafana is configured to provision Loki automatically, so the data source is available immediately after startup. + +## 3. Configuration + +### Docker Compose + +The stack keeps all services on one shared `monitoring` network and persists Loki, Promtail positions, and Grafana state in named volumes. + +Compose excerpt: + +```yaml +services: + loki: + image: grafana/loki:3.0.0 + promtail: + image: grafana/promtail:3.0.0 + grafana: + image: grafana/grafana:12.3.1 + app-python: + image: localt0aster/devops-app-py:1.7.9a42ee5 + labels: + logging: "promtail" + app: "devops-python" + app-go: + image: localt0aster/devops-app-go:1.7.9a42ee5 + labels: + logging: "promtail" + app: "devops-go" +``` + +Two practical decisions matter here: + +- published images are used for the apps instead of local builds; +- the earlier `build.network: host` workaround is preserved as commented YAML for the tun/VPN case, but it is not active in the final stack. + +### Loki + +Loki is configured as a single-node instance with filesystem storage, TSDB, schema `v13`, and 7-day retention. + +Snippet: + +```yaml +common: + path_prefix: /loki + replication_factor: 1 + storage: + filesystem: + chunks_directory: /loki/chunks + +schema_config: + configs: + - from: 2024-01-01 + store: tsdb + object_store: filesystem + schema: v13 + +limits_config: + retention_period: 168h + +compactor: + retention_enabled: true +``` + +Why this setup: + +- TSDB is the current Loki 3.x recommendation. +- Filesystem storage is enough for a single-node lab environment. +- 7-day retention keeps local disk usage bounded. + +### Promtail + +Promtail uses Docker service discovery and only scrapes labeled containers. + +Snippet: + +```yaml +scrape_configs: + - job_name: docker + docker_sd_configs: + - host: unix:///var/run/docker.sock + filters: + - name: label + values: + - logging=promtail + relabel_configs: + - target_label: job + replacement: docker + - source_labels: [__meta_docker_container_label_app] + target_label: app + - source_labels: [__meta_docker_container_name] + regex: "/(.*)" + target_label: container +``` + +Why this setup: + +- `logging=promtail` avoids scraping unrelated containers. +- the custom `app` label makes LogQL queries stable across container restarts; +- `container`, `compose_service`, and `logstream` are useful for debugging and panel filtering. + +### Grafana + +Loki is provisioned as the default data source. + +Snippet: + +```yaml +datasources: + - name: Loki + uid: loki + type: loki + url: http://loki:3100 + isDefault: true +``` + +This removes a manual setup step and makes the stack reproducible. + +## 4. Application Logging + +### Python app + +The Python service has two JSON logging paths: + +- Gunicorn access logging for every HTTP request. +- Application logging through a custom `JSONFormatter`. + +Gunicorn access format: + +```python +access_log_format = ( + '{"timestamp":"%(t)s","level":"INFO","logger":"gunicorn.access",' + '"client_ip":"%(h)s","method":"%(m)s","path":"%(U)s","query":"%(q)s",' + '"status_code":%(s)s,"response_bytes":"%(B)s","request_time_us":%(D)s,' + '"user_agent":"%(a)s"}' +) +``` + +Application logger behavior: + +- startup is logged as `application initialized`; +- `404` responses are logged as `WARNING`; +- `500` responses are logged as `ERROR` with `error_type` and `error`. + +### Go app + +The Go service was updated for parity with the Python service and now emits JSON for: + +- startup; +- access logs after each request; +- panic recovery; +- response encoding failures. + +Its access logger writes fields compatible with the Python app: + +- `timestamp` +- `level` +- `logger` +- `client_ip` +- `method` +- `path` +- `query` +- `status_code` +- `response_bytes` +- `request_time_us` +- `user_agent` + +### Example queries and evidence + +Logs from both applications: + +```logql +{job="docker", app=~"devops-python|devops-go"} +``` + +![](img/task2_apps.png) + +Only JSON request logs: + +```logql +{app=~"devops-python|devops-go"} | json | method="GET" +``` + +![](img/task2_get.png) + +Warnings: + +```logql +{app=~"devops-python|devops-go"} |= "WARN" +``` + +![](img/task2_warn.png) + +## 5. Dashboard + +The Grafana dashboard is named `DevOps Service`. It contains four panels and uses Loki as the only data source. + +![](img/task3_panel.png) + +### Panel overview + +#### Logs Table + +- Type: table +- Purpose: show recent raw logs from both applications +- Query: + +```logql +{app=~"devops-.*"} +``` + +#### Request Rate + +- Type: time series +- Purpose: show request throughput grouped by `app` +- Query: + +```logql +sum by (app) (rate({app=~"devops-.*"} [1m])) +``` + +#### Error Logs + +- Type: table +- Purpose: show only error-level log lines +- Query: + +```logql +{app=~"devops-.*"} | json | level=~"ERROR|error" +``` + +Practical note: + +- the dashboard currently includes one synthetic Python error record used to keep the panel non-empty during normal demo traffic; +- an easy public error endpoint was intentionally not added, because it would let any user spam error logs on demand; +- ordinary health and index requests only generate `INFO`, and missing endpoints generate `WARNING`, so a forced error was needed for visible evidence. + +#### Log Level Distribution + +- Type: stat +- Purpose: count logs by parsed JSON `level` +- Query: + +```logql +sum by (level) (count_over_time({app=~"devops-.*"} | json [5m])) +``` + +## 6. Production Hardening + +Task 4 is implemented in the Compose stack and verified locally. + +### Implemented changes + +- Resource limits and reservations were added to all services in `docker-compose.yml`. +- Anonymous Grafana access is disabled with `GF_AUTH_ANONYMOUS_ENABLED=false`. +- Grafana admin credentials are read from a local `.env` file. +- `.env` is ignored by git, and `.env.example` documents the required variables. +- Healthchecks were added for Loki, Grafana, and the Python app. +- The Go app is monitored by a small external probe service named `app-go-healthcheck`. +- Grafana and Promtail now wait for Loki to become healthy before starting. + +Implemented snippets: + +```yaml +deploy: + resources: + limits: + cpus: "1.0" + memory: 1G +``` + +```yaml +environment: + GF_AUTH_ANONYMOUS_ENABLED: "false" + GF_SECURITY_ADMIN_USER: ${GRAFANA_ADMIN_USER:-admin} + GF_SECURITY_ADMIN_PASSWORD: "${GRAFANA_ADMIN_PASSWORD}" +``` + +```yaml +healthcheck: + test: + [ + "CMD-SHELL", + "wget --no-verbose --tries=1 --spider http://localhost:3100/ready || exit 1", + ] + interval: 10s + timeout: 5s + retries: 5 +``` + +### Verification + +- `docker compose ps` shows Loki, Grafana, `app-python`, and `app-go-healthcheck` as `healthy`. +- Anonymous access to `http://localhost:3000/api/user` now returns `401`. +- Admin access works with the credentials from the local `.env`. +- The Grafana login page is served at `http://localhost:3000/login`. + +![](img/task4_password_required.png) + +Practical note: + +- the Go app image is based on `scratch`, so it does not contain shell or probe tools for a simple in-container HTTP healthcheck; +- for that reason, `app-go-healthcheck` performs the HTTP probe externally with `curl` against `http://app-go:8001/health`. + +## 7. Testing + +Commands used to generate traffic and verify ingestion: + +```bash +cd monitoring +docker compose up -d + +for i in $(seq 1 10); do + curl -fsSL localhost:8000/ >/dev/null + curl -fsSL localhost:8000/health >/dev/null + curl -fsSL localhost:8001/ >/dev/null + curl -fsSL localhost:8001/health >/dev/null +done + +curl -fsSL localhost:8000/do404 >/dev/null +curl -fsSL localhost:8001/do404 >/dev/null +``` + +Useful checks: + +```bash +curl -fSsL localhost:3100/ready +curl -fSsL localhost:9080/targets +curl -fSsL localhost:3000/api/health +curl -s -o /dev/null -w '%{http_code}\n' localhost:3000/api/user +docker compose ps +docker compose logs app-python --tail=20 +docker compose logs app-go --tail=20 +``` + +Useful LogQL checks: + +```logql +{app=~"devops-python|devops-go"} +{app=~"devops-python|devops-go"} | json | method="GET" +{app=~"devops-python|devops-go"} |= "WARN" +{app=~"devops-python|devops-go"} | json | level=~"ERROR|error" +``` + +## 8. Bonus Task + +### Automated deployment with Ansible + +The bonus task was implemented as a dedicated monitoring deployment playbook plus a reusable role: + +- `ansible/playbooks/deploy-monitoring.yml` +- `ansible/roles/monitoring/defaults/main.yml` +- `ansible/roles/monitoring/tasks/setup.yml` +- `ansible/roles/monitoring/tasks/deploy.yml` +- `ansible/roles/monitoring/templates/*.j2` + +The role creates `/opt/devops-monitoring`, templates the Compose stack plus Loki, Promtail, Grafana, and `.env` files, starts the stack with `community.docker.docker_compose_v2`, and verifies: + +- published ports for Loki, Promtail, Grafana, Python app, and Go app; +- Loki `/ready`; +- Promtail `/targets`; +- Grafana `/api/health`; +- Grafana auth gate returning `401` anonymously; +- Python `/health`; +- Go `/health`; +- the external `app-go-healthcheck` container status. + +The first manual runs exposed a real bug in the role: the healthcheck assertion was hard-coded to `monitoring-app-go-healthcheck-1`, but the VM uses Compose project name `devops-monitoring`, so the real container name is `devops-monitoring-app-go-healthcheck-1`. I fixed that by deriving the container name from `monitoring_dir | basename`. + +### CI dependency gate + +`.github/workflows/ansible-deploy.yml` now contains a `wait-for-prerequisites` job. It polls workflow runs for the current commit and waits for: + +- `Go Docker Publish` +- `Python CI` +- `Python Docker Publish` + +Practical behavior: + +- if one of these workflows exists for the same commit and is still running, Ansible deployment waits; +- if one exists and fails, the Ansible workflow fails before deployment; +- if a workflow never started for that commit because its path filters did not match, it is treated as not applicable after a short grace period instead of deadlocking the pipeline. + +### Playbook evidence + +Because the VM images were already pulled and Docker Hub reachability on my host is inconsistent, the successful validation reruns used: + +```bash +cd ansible +.venv/bin/ansible-playbook playbooks/deploy-monitoring.yml \ + -e monitoring_compose_pull_policy=missing \ + -e monitoring_compose_wait=false +``` + +
+Initial failed run before the container-name fix + +```text +PLAY [Deploy monitoring stack] ************************************************* + +TASK [Gathering Facts] ********************************************************* +ok: [vagrant] + +TASK [Run monitoring role] ***************************************************** +included: monitoring for vagrant + +TASK [monitoring : Prepare monitoring stack files] ***************************** +included: /home/t0ast/Repos/DevOps-Core-S26/ansible/roles/monitoring/tasks/setup.yml for vagrant + +TASK [monitoring : Ensure monitoring directory structure exists] *************** +ok: [vagrant] => (item=/opt/devops-monitoring) +ok: [vagrant] => (item=/opt/devops-monitoring/loki) +ok: [vagrant] => (item=/opt/devops-monitoring/promtail) +ok: [vagrant] => (item=/opt/devops-monitoring/grafana) +ok: [vagrant] => (item=/opt/devops-monitoring/grafana/provisioning) +ok: [vagrant] => (item=/opt/devops-monitoring/grafana/provisioning/datasources) + +TASK [monitoring : Template monitoring environment file] *********************** +ok: [vagrant] + +TASK [monitoring : Template monitoring Docker Compose configuration] *********** +ok: [vagrant] + +TASK [monitoring : Template Loki configuration] ******************************** +ok: [vagrant] + +TASK [monitoring : Template Promtail configuration] **************************** +ok: [vagrant] + +TASK [monitoring : Template Grafana Loki datasource provisioning] ************** +ok: [vagrant] + +TASK [monitoring : Deploy monitoring stack] ************************************ +included: /home/t0ast/Repos/DevOps-Core-S26/ansible/roles/monitoring/tasks/deploy.yml for vagrant + +TASK [monitoring : Skip monitoring deployment actions in check mode] *********** +skipping: [vagrant] + +TASK [monitoring : Log in to Docker Hub when credentials are available] ******** +ok: [vagrant] + +TASK [monitoring : Deploy monitoring stack with Docker Compose v2] ************* +changed: [vagrant] + +TASK [monitoring : Wait for exposed monitoring ports] ************************** +ok: [vagrant -> localhost] => (item=3100) +ok: [vagrant -> localhost] => (item=9080) +ok: [vagrant -> localhost] => (item=3000) +ok: [vagrant -> localhost] => (item=8000) +ok: [vagrant -> localhost] => (item=8001) + +TASK [monitoring : Verify Loki readiness endpoint] ***************************** +ok: [vagrant -> localhost] + +TASK [monitoring : Verify Promtail targets endpoint] *************************** +ok: [vagrant -> localhost] + +TASK [monitoring : Verify Grafana API health] ********************************** +ok: [vagrant -> localhost] + +TASK [monitoring : Verify Grafana requires authentication] ********************* +ok: [vagrant -> localhost] + +TASK [monitoring : Verify Python application health endpoint] ****************** +ok: [vagrant -> localhost] + +TASK [monitoring : Verify Go application health endpoint] ********************** +ok: [vagrant -> localhost] + +TASK [monitoring : Read external Go healthcheck container info] **************** +ok: [vagrant] + +TASK [monitoring : Assert external Go healthcheck is healthy] ****************** +[ERROR]: Task failed: Action failed: External Go healthcheck container is not healthy. +Origin: /home/t0ast/Repos/DevOps-Core-S26/ansible/roles/monitoring/tasks/deploy.yml:148:7 + +146 when: monitoring_go_external_healthcheck_enabled | bool +147 +148 - name: Assert external Go healthcheck is healthy + ^ column 7 + +fatal: [vagrant]: FAILED! => { + "assertion": "monitoring_go_healthcheck_container.exists | bool", + "changed": false, + "evaluated_to": false, + "msg": "External Go healthcheck container is not healthy." +} + +TASK [monitoring : Capture docker compose status after failed monitoring deployment] *** +ok: [vagrant] + +TASK [monitoring : Fail deployment with compose status context] **************** +[ERROR]: Task failed: Action failed: Monitoring deployment failed. Compose status: NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS +devops-monitoring-app-go-1 localt0aster/devops-app-go:latest "/devops-info-servic…" app-go 41 seconds ago Up 40 seconds 0.0.0.0:8001->8001/tcp, [::]:8001->8001/tcp +devops-monitoring-app-go-healthcheck-1 curlimages/curl:8.18.0 "/entrypoint.sh sh -…" app-go-healthcheck 41 seconds ago Up 40 seconds (healthy) +devops-monitoring-app-python-1 localt0aster/devops-app-py:latest "sh -c 'gunicorn --c…" app-python 41 seconds ago Up 40 seconds (healthy) 0.0.0.0:8000->8000/tcp, [::]:8000->8000/tcp +devops-monitoring-grafana-1 grafana/grafana:12.3.1 "/run.sh" grafana 41 seconds ago Up 20 seconds (healthy) 0.0.0.0:3000->3000/tcp, [::]:3000->3000/tcp +devops-monitoring-loki-1 grafana/loki:3.0.0 "/usr/bin/loki -conf…" loki 41 seconds ago Up 40 seconds (healthy) 0.0.0.0:3100->3100/tcp, [::]:3100->3100/tcp +devops-monitoring-promtail-1 grafana/promtail:3.0.0 "/usr/bin/promtail -…" promtail 41 seconds ago Up 20 seconds 0.0.0.0:9080->9080/tcp, [::]:9080->9080/tcp +Origin: /home/t0ast/Repos/DevOps-Core-S26/ansible/roles/monitoring/tasks/deploy.yml:170:7 + +168 failed_when: false +169 +170 - name: Fail deployment with compose status context + ^ column 7 + +fatal: [vagrant]: FAILED! => {"changed": false, "msg": "Monitoring deployment failed. Compose status: NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS\ndevops-monitoring-app-go-1 localt0aster/devops-app-go:latest \"/devops-info-servic…\" app-go 41 seconds ago Up 40 seconds 0.0.0.0:8001->8001/tcp, [::]:8001->8001/tcp\ndevops-monitoring-app-go-healthcheck-1 curlimages/curl:8.18.0 \"/entrypoint.sh sh -…\" app-go-healthcheck 41 seconds ago Up 40 seconds (healthy) \ndevops-monitoring-app-python-1 localt0aster/devops-app-py:latest \"sh -c 'gunicorn --c…\" app-python 41 seconds ago Up 40 seconds (healthy) 0.0.0.0:8000->8000/tcp, [::]:8000->8000/tcp\ndevops-monitoring-grafana-1 grafana/grafana:12.3.1 \"/run.sh\" grafana 41 seconds ago Up 20 seconds (healthy) 0.0.0.0:3000->3000/tcp, [::]:3000->3000/tcp\ndevops-monitoring-loki-1 grafana/loki:3.0.0 \"/usr/bin/loki -conf…\" loki 41 seconds ago Up 40 seconds (healthy) 0.0.0.0:3100->3100/tcp, [::]:3100->3100/tcp\ndevops-monitoring-promtail-1 grafana/promtail:3.0.0 \"/usr/bin/promtail -…\" promtail 41 seconds ago Up 20 seconds 0.0.0.0:9080->9080/tcp, [::]:9080->9080/tcp"} + +PLAY RECAP ********************************************************************* +vagrant : ok=21 changed=1 unreachable=0 failed=1 skipped=1 rescued=1 ignored=0 +``` + +
+ +
+Successful rerun after the fix + +```text +PLAY [Deploy monitoring stack] ************************************************* + +TASK [Gathering Facts] ********************************************************* +ok: [vagrant] + +TASK [Run monitoring role] ***************************************************** +included: monitoring for vagrant + +TASK [monitoring : Prepare monitoring stack files] ***************************** +included: /home/t0ast/Repos/DevOps-Core-S26/ansible/roles/monitoring/tasks/setup.yml for vagrant + +TASK [monitoring : Ensure monitoring directory structure exists] *************** +ok: [vagrant] => (item=/opt/devops-monitoring) +ok: [vagrant] => (item=/opt/devops-monitoring/loki) +ok: [vagrant] => (item=/opt/devops-monitoring/promtail) +ok: [vagrant] => (item=/opt/devops-monitoring/grafana) +ok: [vagrant] => (item=/opt/devops-monitoring/grafana/provisioning) +ok: [vagrant] => (item=/opt/devops-monitoring/grafana/provisioning/datasources) + +TASK [monitoring : Template monitoring environment file] *********************** +ok: [vagrant] + +TASK [monitoring : Template monitoring Docker Compose configuration] *********** +ok: [vagrant] + +TASK [monitoring : Template Loki configuration] ******************************** +ok: [vagrant] + +TASK [monitoring : Template Promtail configuration] **************************** +ok: [vagrant] + +TASK [monitoring : Template Grafana Loki datasource provisioning] ************** +ok: [vagrant] + +TASK [monitoring : Deploy monitoring stack] ************************************ +included: /home/t0ast/Repos/DevOps-Core-S26/ansible/roles/monitoring/tasks/deploy.yml for vagrant + +TASK [monitoring : Skip monitoring deployment actions in check mode] *********** +skipping: [vagrant] + +TASK [monitoring : Log in to Docker Hub when credentials are available] ******** +ok: [vagrant] + +TASK [monitoring : Deploy monitoring stack with Docker Compose v2] ************* +ok: [vagrant] + +TASK [monitoring : Wait for exposed monitoring ports] ************************** +ok: [vagrant -> localhost] => (item=3100) +ok: [vagrant -> localhost] => (item=9080) +ok: [vagrant -> localhost] => (item=3000) +ok: [vagrant -> localhost] => (item=8000) +ok: [vagrant -> localhost] => (item=8001) + +TASK [monitoring : Verify Loki readiness endpoint] ***************************** +ok: [vagrant -> localhost] + +TASK [monitoring : Verify Promtail targets endpoint] *************************** +ok: [vagrant -> localhost] + +TASK [monitoring : Verify Grafana API health] ********************************** +ok: [vagrant -> localhost] + +TASK [monitoring : Verify Grafana requires authentication] ********************* +ok: [vagrant -> localhost] + +TASK [monitoring : Verify Python application health endpoint] ****************** +ok: [vagrant -> localhost] + +TASK [monitoring : Verify Go application health endpoint] ********************** +ok: [vagrant -> localhost] + +TASK [monitoring : Read external Go healthcheck container info] **************** +ok: [vagrant] + +TASK [monitoring : Assert external Go healthcheck is healthy] ****************** +ok: [vagrant] => { + "changed": false, + "msg": "All assertions passed" +} + +PLAY RECAP ********************************************************************* +vagrant : ok=21 changed=0 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0 +``` + +
+ +
+Idempotent rerun after the fix + +```text +PLAY [Deploy monitoring stack] ************************************************* + +TASK [Gathering Facts] ********************************************************* +ok: [vagrant] + +TASK [Run monitoring role] ***************************************************** +included: monitoring for vagrant + +TASK [monitoring : Prepare monitoring stack files] ***************************** +included: /home/t0ast/Repos/DevOps-Core-S26/ansible/roles/monitoring/tasks/setup.yml for vagrant + +TASK [monitoring : Ensure monitoring directory structure exists] *************** +ok: [vagrant] => (item=/opt/devops-monitoring) +ok: [vagrant] => (item=/opt/devops-monitoring/loki) +ok: [vagrant] => (item=/opt/devops-monitoring/promtail) +ok: [vagrant] => (item=/opt/devops-monitoring/grafana) +ok: [vagrant] => (item=/opt/devops-monitoring/grafana/provisioning) +ok: [vagrant] => (item=/opt/devops-monitoring/grafana/provisioning/datasources) + +TASK [monitoring : Template monitoring environment file] *********************** +ok: [vagrant] + +TASK [monitoring : Template monitoring Docker Compose configuration] *********** +ok: [vagrant] + +TASK [monitoring : Template Loki configuration] ******************************** +ok: [vagrant] + +TASK [monitoring : Template Promtail configuration] **************************** +ok: [vagrant] + +TASK [monitoring : Template Grafana Loki datasource provisioning] ************** +ok: [vagrant] + +TASK [monitoring : Deploy monitoring stack] ************************************ +included: /home/t0ast/Repos/DevOps-Core-S26/ansible/roles/monitoring/tasks/deploy.yml for vagrant + +TASK [monitoring : Skip monitoring deployment actions in check mode] *********** +skipping: [vagrant] + +TASK [monitoring : Log in to Docker Hub when credentials are available] ******** +ok: [vagrant] + +TASK [monitoring : Deploy monitoring stack with Docker Compose v2] ************* +ok: [vagrant] + +TASK [monitoring : Wait for exposed monitoring ports] ************************** +ok: [vagrant -> localhost] => (item=3100) +ok: [vagrant -> localhost] => (item=9080) +ok: [vagrant -> localhost] => (item=3000) +ok: [vagrant -> localhost] => (item=8000) +ok: [vagrant -> localhost] => (item=8001) + +TASK [monitoring : Verify Loki readiness endpoint] ***************************** +ok: [vagrant -> localhost] + +TASK [monitoring : Verify Promtail targets endpoint] *************************** +ok: [vagrant -> localhost] + +TASK [monitoring : Verify Grafana API health] ********************************** +ok: [vagrant -> localhost] + +TASK [monitoring : Verify Grafana requires authentication] ********************* +ok: [vagrant -> localhost] + +TASK [monitoring : Verify Python application health endpoint] ****************** +ok: [vagrant -> localhost] + +TASK [monitoring : Verify Go application health endpoint] ********************** +ok: [vagrant -> localhost] + +TASK [monitoring : Read external Go healthcheck container info] **************** +ok: [vagrant] + +TASK [monitoring : Assert external Go healthcheck is healthy] ****************** +ok: [vagrant] => { + "changed": false, + "msg": "All assertions passed" +} + +PLAY RECAP ********************************************************************* +vagrant : ok=21 changed=0 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0 +``` + +
+ +## 9. Challenges + +### 1. Docker build networking under VPN + +Local Docker builds initially failed because build containers could not reach package indexes over the default bridge network. The practical workaround was `build.network: host`. In the final Compose file I switched to published images and kept that workaround commented for future use. + +### 2. Go logging parity + +The Go service originally used plain `log.Printf`, which was enough for console output but poor for LogQL field filtering. I replaced it with structured JSON access and error logging so both apps can be queried the same way in Loki. + +### 3. Empty error panel + +Normal demo traffic produced `INFO` and `WARNING` records but not `ERROR`. I intentionally did not add a trivial user-triggered error route, because that would make log spamming easy from the client side. For dashboard evidence I seeded one synthetic `ERROR` entry into the Python app log stream instead. That is not ideal in production, but it is a practical way to prove the panel and query work in the lab environment. + +### 4. Container crash behavior + +Crashing a Gunicorn worker with `SIGSEGV` produced only a Gunicorn `WARNING`, not an application `ERROR`. Killing the whole container process later was useful for demonstrating stop behavior, but it still did not produce the desired application-level error log for the dashboard. Docker then treated the service as a stopped container until it was started again. + +### 5. Grafana password persistence + +Disabling anonymous auth was immediate, but the admin password from Compose environment variables did not replace the existing password stored in Grafana's persistent SQLite database. Because the Grafana volume was already initialized, I had to reset the admin password once against the running instance to bring it in sync with `.env`. diff --git a/monitoring/docs/img/task2_apps.png b/monitoring/docs/img/task2_apps.png new file mode 100644 index 0000000000000000000000000000000000000000..7e12728522c2fb94b395abe7eb876328be37b08c GIT binary patch literal 127189 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 z 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
IC)kIKjBuE6R#vVa_}r~+pYY+34wLm>OM>9H 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 BUw8lj literal 0 HcmV?d00001 diff --git a/monitoring/docs/img/task2_warn.png b/monitoring/docs/img/task2_warn.png new file mode 100644 index 0000000000000000000000000000000000000000..ad51dca168aebde223ddb330d75d2d7d6174366c GIT binary patch literal 88877 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%0Dhs)IxEKaN{b%N-8{nU%X!c0;$kZ1dQ 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 ZhPIl57|r%W4*~x?l2Vk+6@T&ee*kCISIYnZ literal 0 HcmV?d00001 diff --git a/monitoring/docs/img/task3_panel.png b/monitoring/docs/img/task3_panel.png new file mode 100644 index 0000000000000000000000000000000000000000..e46e3e2667f67497d0760db45ae47608f8347a7f GIT binary patch literal 194491 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

1j^HlYq=IFcy1QocUiKGzz7y=%Y`Wl*RF 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ʲOI;cf{`INTLP5QJgf!MpBz;kNvwbz&cF=0*auSb3IAyKM#&bgu1F!bj+JhP ziZ^G7^fGdOnCWDAKZS`zY^vbEneC$`q;oF54m-DX_63SX1U%_jcpdPisX_c}$e#lK@~fu$KZQF==#Sd~OlO(8$TFk&MgYHP|0Qayfz;=B zA?2;7K?<9!9ueL$dA>8}ftmsvf(C6+vf$0s0c^^TOSbpx zgBQ}4W-r43W04rh3dISZSx9U5o*+b&B_ICL+J9Y_))ttsEZ=po=c}lW4?dZREHH-P zq|wQ*h6-~voY;}~4}~17nq}6*h{JpYvb)I0snq_jNaVdHp`%>-u&VLqqetmWi7ELv z(w}Ml1gzYEg9RnSATsOK`BsS^PO+wsoFqksp!)f-E$-*gQ&utGwWIHku|%8yh=(;8 zm011(KbV3)`2`vld&R*D{UcRJ+=nbG0Hmr|Aj8qbJVjw;Nv=(*x*t1YDGGws-7lO% z&(As?`5-R`KL15qQbiCFZa|u@eDK783ya`DM($?$C%KsC;y&IUUB?a{sWIjF;R_St zmJ6x7Q?GNRbOmWK^7y7yiT1@H~r zCrOs|@j@b`CCr*7nM1+nu8wK9K#n1jziQw_sLO^E9hxXsCJ;ONzrWe0JoOeSqpk=m z2EMG^^P^5j7D2%rWv`c8mIu%W^}(OFt9**NCxl~FBT#F#umuDM8cg6%epfwMP$$4N zmPgs+Xfqv=?-o)l69hr=$VH|2dWEGr8JLHg1rN{74|uSk;MahE@J1b*6c+l{-NOiJb!9S7P!$po{hK8n2H&%tl}%dDR2dXRW+g*Lmh^gl zsI#DJ{NV%_fmhkSD5wCuGerNwP%!vm^pjp^E2WkNyBHXu%`>b~(ekTfWS)EtTj8A6 zLKBw_Rr@R#!|0;}Mx(0#ix^QdrIsFe)C=Y3(Y`dTj2CWi&;XIKM}uIjZD>UANy&Ms zcVmz3ZX*a{G9fa)NY}X=SyI*$^am?&dCcbyh1hbzlU(=xfIY9TIRY(x-JD1aOq}8^ zFX%Z1Xdk5FzJHa{=NDCd=Zt9;qw;7-SFA8;f-Dv`>x&P{A`=`?m6BrK9x$duQSc#X z9@4lmpz8@_HU3-Q2o8oIZJw9DoRQ$ikACPqs>)fhguK^>+JKl~@($tR9YP0GpxnjU zTyn6%AQ~_rJ14Hk@5(zvj1lPwa6ZcI?TYR*1{;HObip`(yeq5yn)rF0Oo_72+gQ$a zi-4?JaDe`wmQ^Kwe4W9X^F2bD(4Ns(;F}#}_a|r%fYkHrjIR`a z+(!)BiTu~DIYDUB1W&Zznca|6(^Ia9tZ$k`4ybvSZ?0A=G|lSpYtC}PuV{iU$lE*G z->CMPT8-DsZFg0N@%&|H0e=rh4l~FfhkoMQmZQaz0jSYqSiZWu*U^`85LTApzhv zfJ6m^W>xTgbwnl2YCeA4cy*Zho8dt?bxJ_9{26I&v$ z(oY)BbS(6u3pGzDG~QreAptZQf0vB%rc^_(E!UU+D>V;TVeKUpa%=?g+?&u#_nte; zLz4$a5&+8cY*4n>!>v;QPgVZNu`n9-tLZuattMouS(s&#G)R<+*XMl!<*A=8Q;{7D zB|fiJeg`&W8qof@d@5k9UOKxCvZLfDr6Sko+l^d!T(?oYGfdL#oBoSk^}3UQ@v&PP zvt@x5B&=96)%*WheNb}{1_Er9Q%qp^T?xSO56T1I5$U##rjfsDFXoULJ*c_BSuD)# zFJ@vT!Gz~N>OO*RC0%(m%Rjxn)|of|5M*%#3L{JqCIsb~oFumY!=@t#?s}Rt{4FGw z8sSN*Xn#?f(fb5#VTCh~4cX}YCDnXz4>-yFk?Wt32nr35EmB^cgp-Q@_;+0yPQ&)> zc8t;HJ>VUXFCUQaqHv=5KVU9l{pbT_p^tr|Guedvj5s{s+_d+*^U+zr&gX)1QVe%H z3~4_VFof~K-G{G;??Tor*JZN@o|haU5715_2-o0mRLX$Lpiq9Hd_qJ25~OR^vU^DS zZ`oO%vUwyYFz|fT=%MPt5=%ZKdG&U97#(y1o)^G^LAgd2+~EG|wsJ+ZkB%sr{p72) zH=F0AKy%{qaQEup>7$IFQl#AHm5@82RRc*4y03{cUS|M$0PJ zOAy2L`K88ias_Tb_M~im(^+56FnmRVehs{T=}xurW~2AXHZIJ`jUVC8NmaT9qH#C6 z)@~rU7a^1(>-S*+*f+Yh{3AAx5JJY}=e2Iz76`)r^4A&r{IUeU?8I^G9`~V$ph-RG zhf;y4aUSHsg*kZ)SoCOE+tXEAa3mD1H&p z>Z5sU4id?s%^E9n@f&-6dsi{a?{Bh)H8|E-n>*hIJibg3O#%m0jhYA_Q0PnZ!k+k~ z0djg84pvLMVWO+)&i$LNo%LC|Wka0Q{d(veZwkYL7>3e4ESbU3Cb5IqaTPT2Bw88L zcbkr&?S+8xz}zkq?KSksvIyBNZ95%7<>K?O6*$RkZ@&uSn#Q&G#)IPp1#PzrO)YLFTt(82h6$%iBSdHx{&!AwS;aXn zLhyWjMwq?&t!Qs=+90}x|5Qe9vX)Coh+4Z`QsUr+gC-29T5rLle@`;WDUnuY-sx>I zez*i^FIPuEfjW~EbNlh7Mv9^LK-A&7uV!&Rgb1DgT7WXu<&G4u(FT3Z0JQ;pJ}R} z9ylrLQ|8q$ZGD}Oy5cq)EwhKyyh8B%#zzy#Am*PWKo@uJJ|K*%k9=OCu1&)?eM5UH zL>8t>Q|`Y`3FH&~`8N|9%$_)KVWEf$N=*dgUVV7~1--+pCwa=C_GSKt61#J~3PJJk zAEW2#o3O}o-$nWI`_v?Y|8c6Ajx7HdHPBZ=q*mY~gC45;hlAI=K9#bAT!_?@^8EN~ za*Jpic711fCKQw<5(-J4stQtaKG(U6D%M}0AP_lv{h;~Jy#Q80cd4G)F?mLhMiplu z=ci_u;|KqETq*tgYC*(hHvm6hT^NO?h5o((RCnH-)H9mh*@BRTLPgW0=6}mO@B+YU z-GD^R*+PwF;GIfERDDP8R#AM>eVfL6*Mt3!w#uy}@Tg3f^zo}SHICa)&{Ufeb~G<1 z8>Dkmrn_(it}T$_6}~(CyOSV;8s@|%fF^3Fo%Gq+I~(8J9=O(f^mlZgrj)6~0fg6+ zHEsA~8yOU_00}$+=$v~kp1ySyzPTb-pcy8}a9HT0Knz3X94P~-5jZfA zbyfEkDBv3{i*)*jklpmwme0lgMTD$Ct@gVQ&-wLUpFd9?37<2hetJcd+S3>M>I177 zYN(9ZlY39tzCk`vk@{`$#w`+2@0RG9PMx1#lByM$&pqZ0&Y|N?2oxp`np$2N8xj!i zE6;PDqL!MfwSF-shMBSy-V}SVReyUUeolykF^>U>`D2bo1?jX~d$(!3omn68{C=A| zXL-p4Q|;-2nTq{#KhywXiHr|{KyHoC*SaQ^6l)Mfw{ad;3ma}6gpVc0r6p#@%1t{A zc-)u}m0iuy-(^77hCn(SYM#x`-=ep4Wr=Qnw&-8W zNmaSQk!t_8lA%mTh3lF9P&g6!No(#@inZ;PMa@i^)QC$Bk&p z(d7ePQ!mZX(dNz$bFZ!7QziPAPqoU-Z#P547iA4eIM}?Zbf*0iSn_{b1lyJK&Q*<|-KzhWM|ll4QTjBh=DBr>-ocMNkiRi4)1!k;DTxv5LqHaBM_ z@l%Enqpwn8P`2Acd(KKrvvhb@7a760p7#gb=_;N;;^z$Ku`Jp4Z(n?kABn9Fm}YP$ zs#TN9xr_=Z&M}p0ZpxLf$fBVY0;n*4H25uCG?~@pl}#J^Vh*vvj@f%Bxmn`zdsQCJowM0Hi5n90+Gqahl<=-_VmV0`z`N`e_Ji=KgQmm&n zgbFm6qMEsM);%3$*Zyn(<14-pw8f&cE0*0n}%5ano;pUIUP%(o4VCFQDoSA29C?_lWDc!b5+Bgtg5mHcR+a{ zJ-)(iT!x*Qv)g4aVbR4@7*wEMayhL_{nSUT=pz0BQ~+_^d)L?1kIMienW%eL2MMzN>pp=7Cz8Qn5zq%>4T*l8up_d+z8z&o) z6=t$kc~CHM93m_y?`2$p4$k@f90?7aBhV6ZoY%2PQuZtmW+=KTJ*iTpFW`15#j!X= z!b^5>6M?SSs|k~)6+!7Z+&8CqtQY4V*-uS$@aQ{jhLW1iXO&Fse>zpMyu_xt`;!SV z4~pwEOb$QVm9K@A8lFwGavn^SM_JVkjL`^)oqGmMz>At$;Yxn8n^{8`0Lu9&*Ov2E z+ue!2m~J-j3azFxOpr4&IND|F=PAjwACoLHoIT^YaQ7>m@ifS^z3T=d<2N&2{VXQsR~$P*a&P6yex&aepRs^4^er4iLFv;E3k?1e{LTL zf_2s;pxMzv98BFwF%jt#(rv}AR7Ooma%_5Vny8ZQl$UotbL5zJ`g#o;Hr8kFH%!tM z&1Qau%7HWSk;OvNJD!;MF*W@dE!scmm%2i?w%3S3#6y+Bw=!m@j_A$2@5&Qnt@_ni z&6^@6B3Yiz+Y^QCvNahFoTNPsFp-$g@Z5sG=15B{h&6$VK(m9zoY^-Cx%*)f!ec`v zMgVL)MY?iB46anB;pQUeX8~jUcL9pyyJ|TW69@71`*&z z?MS*|Trfw(C*ztXz&8(_R}h5N!G~GmO5upFo_DU42)@-ZlOimK_~29BsJr?Cfz*G# zQWW@?cH|ZRA$~{0zVc!4?f=g~eVWFAuR$Q=_D5a;?I%(5eXIqX{AWekeHCdr_CPUp zlJhqZ#(lvbD%J|1J#t~6X@~=6zI^4LkOSe&&?MQ(3;SMYpa^YhYzP1!^g5noM4`_^vatDOQlecDbgQu_-8-lGBAf| z{n4&;=mC2>!Ufsly#d^y=njIwAZLm4lD=!{rk5->r840BPW7J z&{(boaeERbMnfC34Y9ug=8dm=4WUbEpg?&)9HF4ll7o)`U-$&S|B#=$ZX+{@OaOjz z`g?3xg%mtZq?L^has7T}H84-e%*}V^NE%}Cycp`jX`OMglbBKQ6e=$3Au2_0T|2=H zzQ_MjT&S#XQfN|i1)9e(kJGTkgqe$2s{VZRGX%!b*#6El1V>b6zyKDLJJdyAVXVTX zTG_{wmT3>BoniCmATw~ylnkOQ)WI&3XE`R~!lp`G9Ev7hK>b`wxmQ6v-z?QSllvkE z*Ul07xhNpo;Dx9#Letkk$4=A;-DwNPFzd*g-Es3G6Ous)5qQV)_|6hVX7O{Iei>OjmMaMX7 zQ{)F$iRut|tjquNN16HP{#^-Ski6MVqo@OgASlXXR^l4|!l|+}8bo1R_n<3owOjJ* zJKF#Z2T|8E&1*}I=eG4r;@gG2)P5 z>$-~Z*CKde5ZQo%ui|U7F;F0{+7*Mf$(Bi~Lf+7A7tV)%2$k$G$#A*R&?PA@um$y&^VkEDuh+j{3Y8z%cxkdhpfKa%!)&m zxAcVLvENsY&C17XgT3Qb2%lFk$fy-r%1 zF+xth!kx+(37t9rH`)g#k)3S5MGp-6r1pgyeE`3rA*D9SW`%7L_bfU&2|aj0^jkqP znX#cI#nQP$!$fszl1gT)+UO8&xpH;M-oZ)aiUDc1|LXk65F`m%NtP`yxoJyuvkrYy z3Pl0L9yBB{6{yE8{NFK>j}GCNz5|17bZV+EDpBw~62Gf6rjIGS@l6@9kwSu?{B%$N zBY6Ogh|@T!zMwv|)y!0%x_Bz>Q2GWklG%oyiZhs^n#1QT#S20CRr=@Pe(dkKgGsrn zist271z_Spfo+R`euZRBG7=KfA%`#ixNBb#!*`D39}`aRMbIAI06aFB}!^6o18=wnLVN=O_O zW2ecY8SV|cd)Ng=NDL^U0rE5NaB+>9is!!x3lJNkS5Kgz@s$lebNp4Y+Ikq-zDbWuaF&IqxPjPR~Sa3_)_Z;8h(?e{e7ws46o#gbx=-0Xx5 zh(P=m9cnudsC>(+rh*7GjurP8Ro(9P$TBC=*XjA@eq+8L`7r@8y zdkF{#OvQVsg`g#@#e+65(`(^L&=Hp0Qj&cjG{}CF`x}Uz0z~jNOfV>ure1PQ*}H_K zCw)Eg{8Blg1Z&INs_k4~61%xl`P&w)ecP5GWvcoep}p*E`1FVj?C?B>ADoHiaddPv zcK<*$wVG{F=5U|Fgtv6K_=- zO_fqx0W-&ztYrwk$84%PBV`QAjGdIZM8)(CZIA0hD?d(=Nm)saps)=cz{Jy2RSODMyMyUk32v?3T2_ z9CkK{C*GBJ*V&I17X~0}gUEnS21p_v2*@ByFmb_wZ4}U2W7H`M_;xj8;mCqtnfs=; z^1}s-Y%p&~z0!I#*If@@)Ejm8WK2YSJC8x9<7aKUTSswt2hUqosx21A^Vk~UP3F4% zc_pxMHfXsF460-@psP^g(IYbpUh&M}mP3|M+ouWS3VBAO%|3J$mv%X;S!U+@Cz7|p zDa^=dN5I4@*}%kuCJqqw9QoV4nNK)ur`cmo6ok>V1$S~Vz;W6)o&XBQCj(VIP7Edl zk9+2ZW!s{B1#PCHZ)hCk)@#W0DmV=C+CvuPNgj!b@@{}GWN27N@?>Z^LS=JsXlS`~ zA>;yjW(cEr%nG-QLp*)0^=L+|Z(2e{jK4`iA_&DYZ58C+aoSHvg&g5e@4w2j6X!@# zr7GFK>O9$U;GNupIf}R7np5B(N!cw+;90ND;$xyP+2AFsH{}~B!&i*} z8i+vKWA`iH(H41|!2pu=-X8g_J9>U5$8mL^G6#AlO}NG#txFC1R_M#;GoLJQduhfoZf z$Pz3h$b3yElwHj-S3+HpEkEB@T&1rVSF~`e)l~TtEb)8C#wKQ){$puL&%PCM6~x8d zb5!;ujtK`%ZkgMlYM}i#-@4D)mCa%rbG1wZAi7=K!xgewydqfs7~X$tf+tb!E&PrQb=Rt~AL^ z@+M@5nPd%`w1I;${u~?(0wkIY9kGU-8UfDW=5r(-!?l%ns*}-TO6-Fsv&%Hnc-MiD z+=KcD5`GpfQP^1D_mKdUy3w*i_F=azV7Oj|l?dsb01$@WIr3hOXShd-28DCJRF$(b)p>GDVRSo zgKdvCKjOBtH6&qU3(;a_xm~qJsn$7FLh6Wo;s_HvoX8^Zm^B-mU+-hivWVlbFY&1i z%w|9mkOnCQR5pj9_ALsG(9TF$4Qyy)(hjb~yaK-UjrJ<4O{E0{*gGrVYRs_egr;uF z(njnB%N@07rf&rC2E_KtF>!F{4}OF??i6l43wPz5P$T|`w3AWLeaX|wbvEiw4MC&y zGuMo-tl_9F;h})$nu5-@fV7;P92eIuw`z>{s4L+0WCjx_R>l@2C$;q8+Ew4c_UX$} z=-mV1rI}DWIq=FuFN2w{1mlrIgU~_P_3rf^UC8Ux4Rl*IDbqc>r; zCHCg=Dq?#V>C@t=eLXyvF)0RXE4J@8U>rC!!DO7XQW%{{F%|GQNZnCpF~)_@EA5%D z#JpUD39IMCC3&|lZdj_Bnu1zXRaKn=K@kD{eSN{8M^rMjJY`qHkQ1|^^Y9S^_Upm$ zlJ=8Ty~35W#qxFc<@AEn(c#^|sHa?EM_sn&SrnpTZ@CQ(R8uedACttT zRGKYH_xDVEi*Q{yp=c#nV(21=mp&IdJe6WaVctVD-BOd!8zq@~Ha_M^#Iy5B@#fQN zn8om0)O{PM_960m{kZt#a%5fu^9CI4zq?`RYl!{Aqn=utjeqzra^wOYl5v>3F|wOg6r{xJCI z(+JSgJk}UQc%&`V&g++w>)w#9-4TX&sq*DXh5G5PS};Y<`k5R5QNUgUFJ1iQd5(E^ z8Z@VTj+|qt16e!8KPgR=zT~W{?r{SH&mAF@%s=}hh)$@p@eKgr-^%KO^d z7aR1ay_p=ws&1((0a>j~p5rvb8U9NSI?d zcFi`unqWXl^%Z9dzkAppY%MU_gjm-g%7Q}K7d^L}UC!HxL1Wh=PRIEu-<5p_$+A7N z7z(}aJoiAM(9~1|2{T9F;$SKxDrc2mo7qU19x*Y(sW$hV6c8S_4aAIET9Sb-niXD2 zW3;-B;0+##`P+9QU?V8R+EU&3Y{hKjx9>6-EJCg&5O+TY7o52YYGCdVZm+9a0DSv@ z*%t0qRvYP^y39RZh>fVGO@M7Q+Z ziKZ-D-}r*4+#Wxkd#zHAYL0&A7_|I+YkYrGoUuzzig(nsifL)H)IH$&#ma=$a*pF$ z*e7T`5KaHT8+C_k0o)er45&}ca>izuHTx8g}7Ao78 z(i&29EWWhV4YSoeie=~4y3Au5k|cT7#an8Dw1d03X;u#Za2`z2*_q608pvzYw93@U zB21D{dy)+w-oE#~_7bBdhSA0Onfcfg2&jukZXxa1pS1{)Y#hQ2A~d4{0=h0Pg<)w* zM2HJ73-iM?^B5J+JL4kUPe+#bob#MC+zvwEommQWrO~|BIhsWk!+hnLnKav{ezmPM z)CuwXQB2t~4RU>7({O_Fc5SR#s* z-E`{!y3JByeL{#vl zeCbrEc+Gj|5B2gSd#5zXxbWkP#&eq)q}xW9XNToy(OS#n)8)_O;^Lrk3G+YLw8E8Y z*A7SZ0#!zfjpfWMFT*doOJQ``ig{Uah@}8X6nsaZeDf&A=E92FV5?@|dOmAC#CH2O z({p$y=ivYwn_XM+59L$a-14Qii)~CsQ6nSayyoYN3;otxgj1m^&K+(2bn#v8Zj1Yz z2jA*#w$_&C3s)D8_5Q65e;UYlbP+%(0K^ z9rG3%%b9LfZ|Azq&*d$(riU*#U`w`6!#ep7I;uDN=!)Kr24Cz}PVH`>9K19#GOB@p z+Fl3^k?M9kC+acXIOy+cqw6}Y?ucgR27OLUK3n&i8S*H$WlG1L z#M_1DlVdJBC?t+uORS<(@EXiT^gMUHp**dKc6Te|c&D@0sx9d9V&3$*15~bb+zY;y zu$P896~45zr0zU9s8V4os%d{jx91b+$_PBcsng8Fq)mwAG(sYQkKAF(&KYbjdZp{> zi^J*T=wp|uv!&^7E!gQfn^oV!giHHZm6CU&U0nMHryE8!p)?`sLx^Hi8={assJR`{ zj((c%ejzyZ9;VheG!#8O^64;TGaEBAQBQ&sd&R<1==e}<$8tj8jy~LJqrt7vHme;PJ zbg4z`c#!z?>C=TkSS|mXO!+op#xrg6+WByb)>i7c@Y>ULOpD8JQO~V(131r4cuoiQ zs*W$Ww;aD5kW}wW$uY7c;y!39IlD@@es#Hm8j{?K&^#<^bDXOERXxR22%FF>n!^Z4KU8i(qw!ON+g;;kX3Xr2=?R z8Gtym;z+rxRCD$vo|9?F6McO@s@pY5DFCZfoP}G?a@afwblsTl2h~;Q z8r!YFgvFhZlh5-~k|2RpP|^yzgH2`l>$8t&u$o0R&G!3oZkvT5;b9k$BSOa4t8AD$ zqKvBOMOlseQZ_hEB|*Z>2tSoVtd&!Wf>1F)(VCZcVPHRM@VdKM(`IuJc$l2^0#@^a z=d@-F$`SvQ`KC85L=IC!*f6SAgrbCrU7wt9u>o;NE=Q@&CyH4_tp|dd7b29@5z^7Q zUGA&zt|uIKj1tSGOLPh|oyiC5%iGx4kDDoieIFyg5+<}ByPr(PJ5FCDY~eXsTD51<(&;RbcT?%a`aer5dG6UPdu07n$TNWU> zNWW+$feTH+h8zrG7q@NB<4PCWvfaYa35P5WWiIx=G+7@goy8 zoT3DT1lDst=}Rlgf$g!Q&IV14Y>1+h!uaj`+41ZW9;5tobLWNHn!U}jS&CY2L6F?w zORkYYw!qQ_%w0g>mbV$55DQ~g+tj>Pw(m1-01o!SyYG)1vqR&1%Fi3cR%sh0 z%uqh(n~+|e%-{~&IzH?;*9fOqiS?^JoCs+UEquS5gfMMgz5+lV$n5%id*eBaj>Qno z2e3(eQ%UTK>s~9h(-Kwd#;EgQ$Efbm4_;Go(cmwBxcVSB4Y5rax?J|-3%fk#e}b?b z;QpcL(My}9RU@M&e+`>fhuSC$Eo&>O%U`HdC4)bV-b6C9$fZkmgNr$tIB)ZU05u>t zY1Rj&{7GlGSObc!`ps@p7 z`gl%DtO~`}&Tg?O##}^PT%6HG@0iXjWGnw@fsrT65;4!J)7=2V z7K1I|6c(=g+ZODIg5yKs+ue`q?)B`(#>ODasL4!s1A$I7_~Pd{{5c|@TC;HM=eFJ* zu8o-wWMDO<&L zn)(?#`*KkNOt)rdTWkH)*uS@d+n~6vI#bAN zPZ13X;Tdl=?N9p(f)B_u+PfX?x|_{5d5jEx`m%Ym20wsn?HM1q*H^f4!%?d`j_ zEeL`}T%|pi&G2XdM0(FkQXAxx-;v`-Nv!*2M{}Y5X0*#Cp;jxY*Q4J$jBIrau$%ls%;(+gLlbx1iD>R zSIr*cE%?DbL8ldmAwTt@M^MgTGDK!HRCiUFb~#9rGCbX* zX0@nA>Fe2js z6f{3d7&ot_#N_WI($sqYQ>_Sr^%Ih*1OW_A9xq}iLDg~9{dO(Qa3FeDZzN8_wh-p{WgBBEpxb( zZP2RhuNeg;{WKLncw0~q+%aCdW8YEubT9U&=gF3A-{@e>gwvQPk8@mfihSfRmGh$> za`!dtXlOXAjw{cXh3=0HdCpoDPkegU*}2BINDr6Bmj~i)+;x%Scl)APd}9#Fe!Kg0 z?eT4Bp+=k&PJbM4xc^FxJY90tVk-`|ZduiH_KJ5kk@9jH33U%)*FJR7{T(>;ETM97 zA!F*~4ytm^E}n>uF7IqdJEn>iHSOqxYxCL0V<%H+(KxpiiUs?Ly@}NHp)8F!$JId- z_)C*1&;7QKDe~LXz6YqND&2T9^=y22D>{E@a>N-~I#RL~tqt$Dlfrp^?66^iDr8uW z@&RS*{l&~v=In?5Y;bMF^=R2@O0Ary5>+${ak{IW%}|~57f;#A|B;^7*Km}#|NJNu zWDcr$CZs{wuk+KMghjPn4+V~+C4c+2Y=J+j*hhRMtXxKSuYQ&QeNfAY&Bj^j`a7-O{^2NE zd~t>_28C87&ST{#*_z77G=KjF;b^0dS)+Hfy_l~*Gbgl|lH1MWbMPqkjlk_>20wfHHKHR&6F%{D5(!{sNHsJbR`9nAdOP>;HX8pAT|>R1@&q|6f8= z1FT`=qu|kNm*uMlZ`}8&v)yNmk74z4bloUD$Qhkk-><4Z z(&xAKU_jj)3xEA`tKXXEI+SipFHhFCsTRNZ;&-6BtIQ|a?L*aD^P^^5$ssp*_`Q!9 zy`v$V7g+Ub<)Z0h_Kh5CWf4<25H$yxkgA{#KzqNzFSyjY4;WYi;LNV`uai+9w?9wir{P z_nJc697I)d@QyFDw2E__E-ih;NmWKf*wL%MpJm{(wAN-&S`T z2<0tOp_mX~OC$Fle`{t<8J-%i8*hk()~I-9klRcF*b1tRZjY{Xz87*c zTrKm-uYF;gw$p>DJ`2jVOVz8Z9xMInLTlZ$JkYSR=~b~k)jeI!(kx6GGCGVgF+Dmh zK3D#x@Hw7NXl^$j0BO_3A8p>TSX6G*_y1J7(E0xS)S?1S#|PLA=3`cKS^<(T_KJd= z#ordM9)n7irN^CZ^`R#lPr5ukElDk<)(`fpT%Zx?s5)MY1YlnlkXYZ!rpXsGWBI5) z@FUWbM?R9Hg$zo${c#7ys{K9Ag%TsBRxgLel*id7Gq0L=K3n9r12Ez4>7nP%p%5zw zDC7&xh4x9-j*bou=!l^d7(~?zl?zZbB195UXr}PSFyVGr=?}PE$NKBFK&rtA!0w2S6t}MGq8E*iqj|PqaT( zbOJyMgzv$E}x`~119k%Q0 z=W}W(B;}rD>qbMrOE=f7)Q&=bV_oW)wNA0W?@+k@;ubobuK%Gw^9rJ#CEpYozSC97 z6%wK#>foV}pD)ULe#SONZqM#+Xtq%ShkEGd-??wUtK2+~LU$v2j8GM^aZi%pi1UGVnQH#iq`)gQ&a=2Y%yT$kZ9jo<2B3?5qPGOE|VX6o^+qf%;Wf)~rq0>yg)ox>t%A~H-B;imBkgtmU>aB)Xfq4DZx z(i>Haop8Q)tmj~x13)~x?Y?e&R!0S+*Z4f%=|**R;qLr)H4qc8{@m5`zyB|1`(kQw znK0V;_;{>wTLh{M5bP4kr@4Q?9GTzc=87-2^j-V(v))0BxWiEN??LA?Vb&)iadbl4 z0bl>{EM}>3;Ye+JyN|!7Vc*OW-EWU`o`_)0JyHuyk^?XcS-IjEU5>0+EAJYI&FHt% z7`e-IEpsHXH%xr*@^&4Mca50#;N^OrS|Q>5UskyJ^ln6&mu|W{?W)-4y$*g3V2*RoIF-d^bDAIz7tyxrmf9k7b1{exkfM@ez}BZi@;NoLf0ncllRNockB+ z3CvBiadOknBed?bs$UD5cqS$$B@PD+_>`kq5+f1ddBgnSqClmtZv14F;F+k4i_6SN zzNsJ_NMB?*7EmFwZj$P}K91h^t+Q^1_BijPn7-Hi?;Px{>6OAZx%>BDhN%!mMMWWgo;#gqj|u35n;Y2tsb;BPJwQ&O zAxg^JF6BnHwzne?s_C;Aq@?BrPQHHq3igcn7coRxNFVIpyNDrv4U<0XHagY7fx?(gx1{sY z3HM?@G*_?@kbT*DHrU#F6VYYHa;n-zFfcCi`gLcA){x!w^rR%V<_&P3;W0h^5E1d_ z4c^WA+Qg4c->7xoDeT?}FIsf6n*X&hJM$F_4urhQ@HdGb4B&BUmcQS%qefk;F72x5)Fw<6f#| zddqfEdUBieyO^bEe*0zu#?Y?@TMYkR>7=9zM;@Pfd!Y)E%9)J~l(C??rez%}2F&=_I0=;OO_ed^|i+PYWb8HE(8Rg=72n&<>o}YlqXREN+L(Z|3OY7FrC* zblfbwLP!|$eY3g5VUYn#V_E#esiD4_OyVPI0Rbgm6`4Kn+tJ%G+&nzKRaIhO49;y< zr%IDU&C{2Zi=HIFE-I?9>tOPP0dYxQVkh=n@5XMlic9Jg^^28ZA}h^eIAEOc^=r(z z&Iv8QP8&77IPlAxQfcnVcc*#*p+v@?eYG)t$=)()D7`?mcy)I2bSzCPl``XLF5DV| z*YgQRhF?EKk#ge6O1>B4=sN9n_Dz4&F!bJD4Q$+R7M42F0krhSx3-3Gdtw zkhj=GR8MZPs9_S^e3`Z+$EKA>isN_TfI)JN1A9 zIHUyiBgbf?c0nENVZ5vF+B!Nm=P$Ng!p5$HaCjdU=9{DA_Mko-CzKtV#|-B&;_zTf z$1lPG-A5Hq{`I$%6vMsI@HE{@%yI3^#0T>k&qtFnJZ=g!PI{hGb8RN>(o3g2k(3ls zOxOw|Mn_z`Hk&LXok9s=mt9vUwFO)1v`!_1w$8-#FLjKZoPq9w`wo`l6__n8ExnNl z#KvT$-zeW|O=BZoq50rT$q$TpuFFP*;mN&+<2gZ_o6Rm~CpX43VI$!1k2KvQX%nCN z_~rs)_m>~Zlit2C8cwB?8-=Bu%-3<&CiBt3SZH%|Q!>1@Gfk@)ZDr8PCn&OW=2La< zuW(h(Ltg7ZQTN8hh0>i=ZqJp6{kcP=Ua9X$0*Dxe1PzYsNv!_3V5v!mlB7&5++y6{0u zA6v=_BCq%LB5x($V-*$K-wzNRde}bTmYe!+Lb+H`6h81HqgRW=Z>2~DOs;7bS_Zv; zw3pwYyFV;VpHd)JYyrk=(`TpUn_FgYTEpXJmX#?WKAe%vkueeWwzkq99%m#$;Oa~r zxjMJ3VjP`wKo2`bcQef;Y&^^_B9lL7=BDTR$QL^km40{?AUSbNwvCjhVqcFH{Fic(~+lg|$4Y)~$bK zaEs5P|5aRE<)%YDrWh9=pOosei@m*{+Ni}mT&N%eIbtoXE-p4`!S`Vf`&Qfcwd@hY zK%u zlt^ScVcO$HjE>KRl7;5+au0+3jp!L+8>ZpqO&b<%3wU8{ZvKYG_nutP)oV9{VQt9= zIW{@OJn)6>hzY^FWrhg`aN5;&M4|PPS4gOWMhjQKqv8G~Tms+dXy$S439zQ|1JgNq z0+pYQ@{7v#<;0ejmNN4~rKPzZaKRs;E;tbhNl;0NdVjhOm7AOWIJ4nC=a*PVaj)^~ z()VOg_8}1wgQ#7BL${2&;kmnBpvyHhPfzq0>%D}Olmj2)rLEz6e;<0j&oIU)rYLl^fY&|qS`B>i;UZ7M(PCt9hFUB* z-3NS`mMw8xzjiOg<>^g)iPERKwzkwU0v3KaM8TVMw=bNfD$U-1cGj!y>gqaNWkeXm zXW@5qvTzy#YgJ1Kt2CLUL z>GA4F{xi$rf}8AG1#dEgge|QsH&1@^#0q=gL_;%8nUT(Y2(?pZXHKu7i2Kk|Mh;@0&JAhsxRm${r#qw@}yj1cCQzj_utKqDSRIn7gF=ZU(mgi3j1yA zNLdVcALXn< zzBiX|qM4dL&C)z2ix=}`$^Lf!9t<(+sKg_PGu0lSzlr-j!-z_x!RHFZ5n?t|IXq_q zM*K}x!k6E2M$B<8A;UlG+aM8sx0IN|T0Y6Av0is2<#wZvkL-?|dw{DYtcBlt-S?l^ z3N^7zn9U1;aC_dg&rCTc$5R9kQFTl%?Dx!1eIIqpH2LQU@=E4H-L-o6<9&tuc*+K2 z&epY@LEg=~=~Oe_GoH3DUeqOHBaNnBib`%fk4L>t(P>MyE@l7iHMTx8(;9f*oi2V3@$Cj0MBCTNLJI|_lVVJwdujV2V`R+$iF+< zQVRD!2c7P|f?UQYKmdks)Lct6VA@KDN5j$!QN(>5X4Y$1+iM(@EaT^~HDGD>&#@#Q z6r=t*G~A6wK!BwBbStPpJ=;o{|33H;{{1;~Xmw2e_m{u_UCM602*>CAw;$yjwf~Pj zlE}&K61KKZ4%Lz|ahEd-r%R5CYu!#ZF;2I zzg)Z%&L}dKUV%Dw|L@PP)69RJ`18+0#uo|yJ$CK?`Vm!z7ZxA`(be~?_g0dp^!(bt(em$ymb_OasVS|x!S(NPxqtt`_(G%) zgW*3>`_Juf4QPL8hOPX&{y#njcJ#>m#H+#M${=&gi*!i1U-av1E?v^i7VIj1=0u)B%5Af=$- zF*tiw3VA^+6%65<~CKw%~-I zr52;Xmkp(C$e9@X5E;peHr*yT&(>G!=XLJasJou=_oGk0a z%ZqX6Q~bb$@o0C&-$#D&>h)bYO`VMELuV@`rKLtAoUD1O0$v>6@LL5T!Z z6U{~IVEZ!YX!iW==5E?MCGj&HeEjh5=QX+~dD~ABHBFAfP(H)K4gxl3PfKiP*vgz& zLkK31A8E2*!pE-LC1AuBU+s-FCmZ|XW#l2?{4(vK@lJ%}aD`*#W`0=}KorjsbvYu9 z^v`LQ`qPEM+5W@(E1`X+o_SWs-y}UZGk0Y%rgqehPEp_G9-gPPcloOrezTWgR#o3I zfCrA6``8fhCDw^^;SEldQH=iO&Z^Pn12&?{M}_RotiF`yJ?R zeUPJz9z@L19604&n^=F0cs`VC{x#VP>+jxB>?d{lz}CUJ;di(|vYPaKlhy|WKMzl{ zERT47*iWvkvCZOwviI%nm%#=O9I$brEc)5XB64`F$CBO^`P-0jCo7BXnF&j1BFk5S z)wn8O+tq!?!j`92YH9kfF?J%q{7_Mg-4qRceJBWU(j_XzbJC)seTZJ)D;8i4hO9ot z&avJQblql}oi*x7(qQ%2Ul#DYc8t2EZu?8V2Mk>`>%szCT^sA)3koDZ4^ni0_cCga z62bsu*d!MPRGXz_;{6t`+1iOISypydPoC6M7uSIrSt=zd6O%Vrgst1@z{mAs=mjeM zsh1N7pTX?WnK2u$hH<1=b9g3+pSr?jJl5&TmcH&%73bHlFV=Q+=&0J*AbseAy!<~X zV;m;zOM$^vY-U-KO~Tpce$Lxa@i;U;NgB71{$y;Go=j6c?NYa^jGm#jZTWYag5!N2 zyi-&!^2lR)63O4)6xBnhZ*0cSPF%5aEF@g6zg0K?v%S6M!&j^iVV{GFvd89{k={*_ zdfsewKfx(d(F#vJX>9^H2wiv92bJ2*r^-^4_h`o}I;uKLw_ z|B$l+%fvEN(QbX3kap-4_mK|@?Xr!qKxr|^+ULMg}p>=ct$lwFOfFNJe} zesFRU4e@<7!AkDFE5|4Fnz#!s>Q+Z@LQTBh5O-+JtqFM_9w$fx{0Nrym&^yUf|M3c zl;k!eRlRpvPQ6y2tiu)-TA<#Y=t9f@&?fFSG%$w%m@ZanMp>RwS`O7BW_ z)46BzX7fA)jo$6}#acH8N2m4S#xdtraE?Rh?+or88g>?wirA9wpOvdbrS#{^QUMJ5 z*5u{daOsVmYQ0x2gyJ=RKKYVa9L>^I3z=M|gE_!(_MGa&i4$ z9>$dy%_76eP?ql5gy4kgC{tcUfdX0s-o2}UgyN6O#Ws$>>N!H<>P4G=_d_W@65H8MZ&%jo3y07aDE1^jN zmtMOdG2O;H+G~4suZ>hBOW^kHz)<=Q-EXIU(lRFBY<?#?v$hZomhxpY(Q~$*tZo zW!hgCMG!Jpgt|GB;p8hi{)unRst(Qh?d@Sq^>cAfy%Mfh!N@%5#>j)TE(t()oer0{{Ar&PWPdk+8+9(x^((0%@RG+C)- z6HFz55pwfrx_2HI@gPUsZNzH|teW8?6P)*XJ)g`8MYo^2Si%$$#ZvS3dVmf@7$;J(Pj= z_Jio@32%MQ2+mVn!shBwuvNW?ussS+7#&IA5kI*I0KTAys_VODH*uzo(@6GnjR5v{ z->P)tBA0C@lRqALaPExjYFB4ue>|f2TggolYY5$bCOULt!;$o31EOC`gW0rPMn>j= zd4F4L>-8!Mz0GqqOUpGb`$P5qY!xcdCkF%u)_pL-`fhV>{cC<6?WbOq^GuTK_rk(@ z;Zw}ohT)5~G0cXm$tts1BuYSA_4}TjwJ}%j2 z$P&5pIbgJK6%7YN@pnQ4ys!*6%RprXxBX%HX2wPcIGu_BeD%2~OA7jX#Qfz!5BiH2Ru{tg&7b|3WTZoR?Q0qxLxuE{3usT#F=RZnd|RhX?tB z$2K40i_Vzh^PwU_=)hjYsz?%jMP^@{76 zI#thVP#>y7WY7M7Qk)>u@(Pm0+~le7(s15quEW@f_%~?2?$Fsk<;7)XXD0$pqK_oQ zCn83EeqtU|B^f!nD^RV_WjB@Wc^jNIRReg$&Jr5>lzkxGi#Y0m|9;$u&!2-rJ`V-9 z7F%kC#)}?-ucWo)t-F!@2wuHo0FNGedNWXBh&2GKGr-^@KYQB#kac$VhImhJ3cMMZ zJl=tln55NuyyDH&nR=jU*T}N_e&eignUePcC8aJG|Lwbvx~0}eD|KE>WE{1n_c4NlYR~iG8m#**N?VJq^CeE} z*WM6N`M;wmt7-4QE?}dBs>_&dbuESt(ytGku{b&Hr!6eJggb#dWLbOo>OL+JAlxq7 zbmYxSlvi63)4=RR3C?&zZE*Ek;h);K7|o%2X)7)LdZt}t{_$qn zE@~%}p!a_OIHN4M3ZmdEeI>BW6f+pn z3jeqgs#`QgC2D^mn1$46V5&M@0rB~>7PTll9vISI+rz4@eHjoMDg|j@awNV|c(W^h zJxP$r!2uUIfLET!2bWr&O8owfPd@4oH>tL%DX05mFH1N%c~6moEV;0k++o~{QmW@W zXJy^}#hEJF-YW6&V<~~FPYcz?kzY6?jk>>FUFxpl0nF_x840dl_1ti&MbM_q4I-U* zDAG<0%o>OGOesZEJ00*bJK9`dTA#zcFy(@OP>) z7dLl3c+FlVqIes_XKn;tq=BX7@=XL@ZBpSOU>~V)$04 zk8MbxE+-#zw!DWSCG}#XpF;e!%@jsNJVCKm zz@swKd1LKT1=<-g%r0cF4*zhZ&C1F`)w8@=Q>1<80ynx6f(VQ9q3rtf$@K8FOV0rM zJG4`O{hqq{sIwVqgLLVE+d*g~T}D%96W@z|)cKs%PftI>PVnTGe^D_D2&e3hN%j`9 zDlQ=Ko#fXy3aEvkt~H{6+B5(b$MvxGx-*Q)0FWzR8n>7z6W!jnpFtvVJ<&bcbZ=9I zF)GTqNR#4I9+4kfwp7`t}|%xL<;Jl&a_{;^IQZS79+%$=o;dOZ^6rC}?Pl-%kz_f+qCJ zsG%YO5*i0D`9e+M>QgR{rRPzfwWgt4W4exG;8P}vL5m_TM_Vx~-7C>8EXYn+G&a-- z2io(Je*Idwz}cxnWD_L2glo=L+Nu>GafhI=;`_GE+J3I$0?;UrK>9bd$Z@% zFjt6~GxuhiYRgrNp;HV{`3IAW;q!d+e63lyVt5e0KD>kE0I(b#sTBQkc$ieX>Kb*$ z{*I7C5454=LT*=-dz7Z+5CoiT&S}RA=ROo$U}U`gJ~~{yPl0}V*7c$`n@D-l17lOf zm38i%Hpg#mcB}n4q0nN2v+j()YY=d0o`}}h6Wdb}(=%V|@-2gA;ro97{>Us(?#07T ziteeauvb0nz688$j#Gr`U8}JdK4C`2Y)7tD?=SvoJBS~3B05`I8bifTUTN}KNHK)X z*r{LgIyXvRA|L37YHc~uDf`ZFfw3q63jv9~vNi4PsTIk`hPE z)olCqQTod_c*!RRET-3l_OPdEd}R?=s{J_*(5)u*NMeqh9C`Ny=9f!#;%1N3tjvxm z5Ys_j)l&7CA$F}(B#EKEGYbpvW~5~6`|5G0JkL|Eq^|CqelF4biOhD9*n?7CT|LR6+1d~D zV=Q?bmtE`gkvcKs2`3#m}Z$^6)wqf~rCQoq%exIdaN_r5$J3 zS)ag5uL={jkcJ$@8!O$5uL8wUWOXOtS`A1`P)HJ^A|*OvczD>bKfq4Vd6G)}MDS_A zj;JHK_;~?2?VFHBDpqfzRy1l+Q6h)xV{KBl3YXs^XX<$Z;F~W5eK3XSRc>zOq)KNs$bQK(n)!u=QlT53(6v?A z-y{CSV*o~3Nk-d*#VkNHK^N@{JZixM=?Ocuc}kyjv-HE2AXgy&$hC^BeLh?8?JiGH ziF+LIn6$?x*)4ayf^Gv$>yw>?bO*Aig@unLvE!RUVlMHBs639J`D`OjXo3tcKvwB6 zu@S9!k17>hHdh9I*lsoA2l9R3yLYes%Of}QIjp`cj}}86y_snA`d5V(>&FvEq7qF z`E#cHimXO)v8RbU#%faScszuWxIGWYL8n0~AaX4?yzE3wBa2}UO+%pf?*d6r-;1*8|I_t_rn$FT4rR2t2*-gAN;IQ!9s z!~W$kLEA^aOLKLqgB4bt6BV<|NX5;Pxm4P^YaW&A<@kPOLQ7Ye!n!_j#sXm_3uUh~ zvAUuFE2~NgBifZyZ)H&4+zTP~Z%D;Xk`Ct>ioPR5G1QWdbNlw~tyAY96w8^?=Jg6l z5Y$TlJ;m7+9F3&8m2^mNfi~}`p?yL9Dab|qK^?@VyKTgs@4d(MtlL)PZLkkSiy0qc z;^?uJAxvoMTUmvGWAt=G3oR7U(g2=vBgbT-gpSb-3a=;tOKR|39StJ-UU)0V@G(*m zxX`4xN<1jwX<>m_y=;wfxlLNPP`vls)YF`jO&Uol-@NlL8~IQXkzz$Z#1ua#>}4s0 zyNi(6^m^XQfpvD=i)MUEE;Dggp^z zcJ?uT9B#xF(!(o}99UlzR-KaU5rVc$dOZlshYx{$6$>>{*ooAB_`nSZUZAJu+|S2B zz1krB{Rtm$76J-szcZfO*BA|arCz;8qYsCV_(q$2Ihes+vIW=wWf)7w?Cd5l_<|2?}|gpHX;- zpIe~Tk>T9zX2;MDU~puKx?|OO{E%hIgCg6TtI*5gK~|50j!<)PmAgcjgU){3H8EiT zh1qql!4y1RonsXS1zG6q_%otgbRONW)Vtf+$#FQf8)|p3!M-+DEvtF@;K2`@pe5nZw75caC#{gD=yGDM;JO zy?-9v8NfJ$*p4(*>-mQ4YocO}G&oEm{4_klx1JO2 z?JRZu4c8MxrIOWLP6SnV^PxyW)X3(G5r&gIGdB-h>`JH|LJGdYzu^a%xB(;@fMa|i z8Cs4PXa+cDsontXic8i)rSB{Bo`U`!{n! z=!3kapmMjKsCtQuwrD%QB4hAP6;yt(P5OPLMcY~M_QNIV#1YRt)e==c^CTxHM@%7JJrMUVnS=I- z-YoDaScZU~k&fZgx;vnCY`P`nDpTiIB6BZNLqb`F6$elQri4(?@j}Pyp+~3o?phDl z`PwAM+xE!laOGbT74|iv-iSlvu`gdt6tuo*^bxCCoI#g8BT1g(p|0uT69nXbQY*{&v08%f83jy=z{UK}H7TZ2fB`21|~ zaeMrp&|uEwE7_N!w#WO9hY4GKchFSp%NaBa&9M&5<88BkU9_+;z9ppH;VGr_kw)OD z$NA%m;Xc*#}3R4H)P`Ml$#D-DFOwDye!#?Dxg&GnA&A%X9tYZ`Yz zB3SxpuzE`3GG(&1X7LxA`r})Cd?`P@_Kge8M=;eg?-(urNZ{4A03uBaGgRWm!|NxC zM56TtB~`n|hAH_UX=!O~&+0S^EJug|q4Zlx+1~!NI1k;HE%Ho9d19kdxCfX;Uh`jH z_k%F#2dIdKkgNxvDg0?=38rhM=1Im1)T(u9Jp?`ZK|xpZCM2f%yUKfB8m;%=s>TKf z@qz60ok}MJhz(hs`FH&^t*(r<)jJ$}x3uKlmX!3xT~}hSY|>r$edaik`xlf94Eua) zKZhx8d_P?g07;FnitBDDtd&duAS1)w)o8Lf=slz*heah?=t2PJfPTkmX^_v`>1&|2 zZpmBKDUnEy8)@=utKZzjqaQM)x9G(vZQfcy@_AF!C2xLVMI@)PVmZW1-2^$8~yrCYR{ll{)HY8-eir+wexd31wh4%N%C zQBfQTUfLn~#VMbF>H&so=8v z>pA5A)6g>-zBBxVN&=+8XG`0Mkri-?KQnIMAjPD~JrGF%xo!$0MeQJdc5%DlO zdE8eRB&VCkc%Mn~C9|`#P~Ew5&xc1$*K<$2Fx0Z1zjJjUNs{!#i8@`r9CCbfWyNuK zJ=gbwgxqtkGu>1F0vyB@y=mO*Bo{gjPLe-7A4%dv@u47jF@U07z1S0^h7f~slybRNq;k^T2CrfUoe^3YNs-oL-XneOV^n!F*`&>%gRoV!580E9jI zVn)uPrb% z9zrU`AEH5n@Qz%RZnxBD+XnVr9H>F$`#-4~$1OuBp8q@KUQsjL%s z2M>ky`iBCA@Nza37xD6LC`#ficc3~rG~^Enal9nDI&uL<0$!g#T|D!32b4VRX)(Zx)Sge*nR5H3lbiElP61?0|kecmhkZCsKGqdYRUkLs6*&? zck9Y2DS6KysBrW1H;v~m*26aFP!;u-ku$=SjXC$LjW>m%VbY`ea(?T{vK+PBjLgf- z_~a)fSomkSK=&OUwIR6;8wA%T%cTm&Q~E*sVRza@1Vs&b&+*dj9Yw9tea~E#&x7lL z+wmU8-Qie^W=jF=C8@&>U5}0@^NAgE!5!cHeB5|(Z-#LPkcM9+req0ZUIK=T^ya7b zsWjL8L0b^X{2&syc({^rtr1FMLDwIfm2#0)s*&mdIzNorMC-(gWiIG_750@7AcXe} zrMa15hrDQSl?bQT)>yKECu#k0=wfGBNq0o6bL5%O)S<7h4>UV&g4Ft$qa?JHIP18& zK*KC}iBjd+^&BpY3Hg1jZ*;xxLIuKu=fhv@5;a!wZXO~e601Li6ylY=*uX#M@k**J zQTvMskGfEJy1TkspL5E{ir-z=-20NsNHXEOJ8w@)dh?d3&hM1SNY^TFqL_`Re|1WY zC}EaOEoBYhI(A3FoG2`It^9!Hm%S(q)!dqE41R*(5-67FV_?UTo`)hij%y76QK#f` zPqsi^eLW6d$?~<#xBmVlFc*>1ct_ZKhRwqxroMwue8$4kGFYtgh$P@~r)^Mhu*A8S zuYrjP$EVfRRij!0dAJk17kZ%06#um_pJ;?NZ|}kA+34H7$QgTAQ4#;mWlCliXXk_0 zN^{@Lu{Mr(R|rlo@OW9c3`tj(;k|xoA}T8Cu{GjMDsCNk1syRn6N;9mSM(_C0scGS z4huK)f$N-pS^pk12J(@dm*!C{A4oteWF@^sg zK2;EqH2UjhYJwimstYu2dk+LN)OJwJm)~tqPtVI#{Fo?S<_b0C+Q5DZFbQ7(O$F9g zQB}-k+7`r4GvlQ^N%jiB37X-IyP|9Nnt)V;tQ2SP%^ z-K9Y?m@~M9i%Zn1=LhAa+ly6S)Kljt%JyHSzh$=m(SfsPQ>!`w zDT9+aceFUNpD(p#B>xP>`%H<=isc&z@gI8rz6nUt1qARR27rhst#Y%n66WRgykA|e zt*MdF*uRzcTtDqZLxy8WN>elD`E=!z?6R~q)f5TUmhK`X>${K;3K+WZEmLFQH5>lI zZE}X>(JmwRp_eDgh`W!u1D{n>0~T7d7r=Tp`G$eH1O&j z>*%29h$(7-K3Arw^iy>;Cv2vyZX3N&H@o!nb`%e_cWZQk5R3BumB+E8lG zv<}EeRqN+GKeq)0y8Uzc6%<;vov9>!|A7@f;IKfnFO8=Q!v(>f2cUOpq*B0os?-mT z$hwe=z`RU~Q>y*WYD^%o_1}f(Hc+LLAtG8_eYsTotaW|Odz1ixkENc<;4m;dxR>N14_(K+ZHD=4W=(1O)weMO_7^UURk!3y2!Mgnx=@~=u=y|z{6 zVVnm=#|YZ*Qg2_!LCyLA1#&n)l#rZw2bwwPc7ll6P+F-dXa9=c+y21+%D`3RIzLXZ z`?ZAj%)}%~Ewc!y=-2uAK}=2~feBmd0=VA|M_3MjQ%F5{fP>2R&dy5Yci0q3#h{3a z_IMw8Z;YQ}vnQ(y^=A#u%}E;hPi!5s z-x#xc5wq8)x7nd{#5Y6d)t!r!C@CqKMGdNKZoUF+1d8a}ig9AhZrKbsZro7+J%r=I zyUN3+vn|{iCyd8xLH5FO3InA;HictI+CU$X2VgUhqy%jdISq~SBq$~M6ZWy%(bk*d z?D75pdR~zAc7+Rh_tXuK8+B`7--Ya^oE?J&e6OtjbiL$ac|Qo4QTGhhf^w+dfr2&p=`!c*J9UkM?fPz$JY? zUV?p7!1`7NCSreWV(-D}#pkRQTa6iN--i=8+zrYGu2gF&<)zWIz(k`BN>GrN+oO89H4%fN3sp78Z$iioZ^Fa*Mhn+p zrz#PCPpt9Uw|UUV(1BtLfFakkG&CB1uMALZ{no8(jejUymg_h$D}0TrBi7eg{wcg| z9~U>j42qopxJ{lpl*4w&%{yA=NsF3+5K8d!1)}^G1H(-PJ-VVH8+Ce3<>cf)$$CKd zryuhbA|mD$2L*+P+%_AMfZ5LgS--oyqxjN=nwFMOtC%^#C@|lA52;>Zi$M(VJ!s-+ zI5`O@MxEbORiT}oSVS`ow)WnfDBEoqaX15^6yX3&;fW(&xS!8fJecB810vT^4P<3( zvFAZgwD6wWFRU?ZmwBLtF;s-E=uUzL;tk;F1y+4%B%B!3bgHGI?QJ4c)i??VtSCJr z%Z*dvXVc9$(wD^BE)=6r1@fYO7!*X0T4KMCun^9aCNu4fuY(fCs7BZqHRuR9Z_QCi z=FG}UAdH8k%m_LxT&E5*IPC68Q_s5va9G}Kv7YVvk+E5tVxCM(d%MK*=UlsZyD*n2 zJ~m?v%gA6qm4^!yhA&nJ$sRGmI0flGa?1CcLQIgM4L~8F6ntqQC7WmwN%_7F@5+(j z#T~ChK$Pc`k=(o%qZc5DW}L>NFs|2!F1xG3SAg)iXRgVDlI!k~ofES!rvI=Xz}a1! zB$2`l@wtFAUg3(DIdt|G)G3nfRNiNS4XJNID?$r8NdNx+>re&bkn!gbvlC{AEG;n} zy6@RU9o0S*6nb)3Tl+E!Pdvt7i+D2&8)-mLkY8M!sG^)nTsrW!!VeYNQPB5zrMs-v zXQEUn5)hx-?%=P9KYX02O{@~0*3sJ9V5;ZwI`3=qSB<_WAaj;+IW%I^-qlIGL5k9A z60@BU`(lPjprm=JPM!^n4F)K|Y?VWP=TH(X+-J{>^?!c3O4{vx30TybRcG>5{u6q- zMpXz5AsDjj0Z|l6)`WtUH)}ml3Z7F!&S4JpBm(R>irWDP1ZP2S@W{R)_0PLHO@O#H9lzd-Fcp-yypEEyW;6*e)dQK zQJDRnysfRRkwmYfDec2tcaDxMYQ)u2`!c_cPACON=i7=3k&}{5t%vcvct-aWd|uYN zp~Q*R2qO| zdv>A?678er^th`xjWX_Y@3>{R@ycVT8MDV1Fe`YjBX`MyQMVcc2Ca=o=lE3fiwM#x9l;jCcOP+&cv zsEs{OvQVIa@b~vO*k|nHwqBEdv7R(OwhwtjJ>QF7lCEtXAIJ|(%s0bj3a4v&L{>;F zi7lj!%_21%Mxu7)l)k+?p2Ir8a&@R+xGF_(>U@(3lYsIq{<`p2wYDOdBW`T!Sl#T} zuu2ltNkHn!-2dC?raeE8<*lnoPyf!vT59T&)O#zG$LB3IYLKXhvMM7;KGAqZR}G{= zT#I43+-__707k!mQcbLuAvhOGWbxhdw;{QZ6NtQ_i+}5g93-QvIG|xrxDoO*jj?xS z$Z)PKuEc8&hxk-PPg5y)2%DuI|XqVW#xs@c$Z8+PiaxCohv< zm@nfIyU!Z>N%lWxr8G1w63E5~xjkRrP}E_Lwkm4XJg&fpCq2mU49*UIf5t1Nc{0eF zzR#TbUvo%>3STGRcX#VUd1uhD$^E^sV=6OfNx{}O?KOy2W?;uLBf467VSim(+L+*Y zU*Ic9vtbx8yPe(}HDK`%?vP?BQY5h#GK)X~;)IZu+H#KL$qNlzR8 zebuANwIaGdFNk5hh&Vc;FO#BEPJiD9e)5y?;Oj`o$Ve+Bq@j7DiNf`sPQB|jEPU~n zK2OU305yBnJ3D0lE9zzMtwO+Jd;o=n`I)rWl`U13B7hgs-eSSF0d8boLpxIa$Y#?E z<)Xd2@N5x*X`}YWM^4yP=)@4cM=S4Nx9UG2eRyoF_6^hskMZ^YF~~C?Y>&xh`rz8t zaG8hy%!U1ZKF^5I?WMM8n3rM+`gdyTj|QK`^oIjN$}_qEM!Z@P|6{7BH9D4DB0*k) z@M`$||NYfAVB|*i-oM1&pUb2Azo>i5xGMkcTNGOa3_vLXk#6Y*mF{lo5-I5hMFf#9 zX^@ugPNk#;q*J=PVZoWpy?^_^&pG$q{oEJ#4f=t#p7pHfTXT*%#+W^ZOC4Ve80pEM zrWC*XZ$(Xt4F!+r6+z_XJIMa855YS^-dF1Xbzg?hLL?>qK7FG*mc?-@tgsDv^dM6G z-`b`H)PL)uOo3%ZN>5`Cb$Bl%Ve9+%2lDcvBh~JF=dx$wP1ixzdlLiyy$oSBNH}i- zf2Gjki~_bVY7BDZnJqucHG{7EG=+H;gj5X}mrj&4sD}=B;Zt6Lg6f}7!7?oXyf&I? zgEUwBj1o|gAQ6n%nbephkhENjV$cckxrQ?3x+PfpdgzYXP@a&O*fU7P|G*3WjP4n} zs&Np;N2;-u^owoZ-MQJX@H7S4K^tlHf#T~)CwxQb`W1lgc)&nztFDd6Oez3B+^wi3 z-;b|##5J%E&7r87sOB4$Ldod=YpXej*rM?Vw!cqVHO*rQR(3k$#6v}Dt%?bEi&I$e3Y zv`H_4%_uxMhCzOX4&MDKn1;C@Jr122dA0th;wWhUzUF;mD$$@X?Lb2JJmc3JQ&ezqj&K`J?Fjbg3)!-uF$zL>iv|b9?tQ z+Bahf-%)yaWbaaXK>Nk+j2w>E4jRIPRrVA$rhC9E%hZ84y}TWo{gkxJ5JMNfQmWzg z!oOb*e(b#O&+J8cF7{JX`DDDJdKiycEvMrE>Mz%nbACUepzsm+!Z5oV>3>Rsd>Z$& zXrA85?dsn5|9Jmp+LbVrM}L0{KltU;)NoOThS+P}&qSz!%iyjLs9OQt3?%x4$d!jQfdj0ybVyXzCvU6Unz4QJu$%_~7vu)nh zI`6S8ER9NpajHN`&Da>9uB%&l;a|^?npt89p4_KW36cMv6Y#K=&Au?ZEmy#i`}SbW zNWwKDS!Ux@Dv_HAC9pMK94ljQ-j8wbQCI8m(Sx8MbzHtx&s?nvudiR9?=H|j54Nn^ z;dY63B-z^c_>3H1p;b5(zIVL**N2H=HvThMLNwd^+}oI_v>6Tg~}VNb=*e2H=OK$ z#^&z;owot^K#$rC9vUU*?qQOm@{<9FL{>GkyVTps-MSiFywo~CpahM>QP z$t~Vr_pet+^O`<#p4`1sXm;fAh(0kDC)7m*omjZsoC}xh%_on@|J>@kPoHq<$OWIk z674q`sEcA$^|RD+(KCw+)pqAzQOz+|tN1{x%D`;VN>*+$)d{RwwZdgpM4_kDn++X+ zOqR#bBz@4=Bm?owOvkISv|LO7EObVlCeu{eRxx>QVjA}(2Ebl{coTXR6zSwo8j}<= zgK3SpZ07a*&W*YfIKn|B((Er2pJyRbZGYnR`C*Q36ccHEu={9{EgJAQhVQkswtm^v za#c*XVFSL4)Alc4>A2ynLy|Al<2Sx3RB;0hk4)B*_l$ zFZKYJ^)2VhK&Hv=Z|itod#Nm22Zv;XGs_5StstqGb?2Q~E+CH?ZJa*z_VH;Q|Ez}} z2&$s-UxhCe;}c%pzH@iJ@jajUXnE-JG8N)&_*i4eQ{m48(Cy_;4Gy_hwcRnFJLs8s zkd8P^Osl3YcW@X)+77j>9T~kM)5+`WgGXvSaR51yxF7d;?tG|Yi!0eS21~hF z?zqqWX45&>o#mYCEcU<)hkmryp0HDu&JQPx-Sh{##22cTK!RahE|+Kz`_I@vbw2e? zUwrbHR2i%)b!jnP-(Xo2Zj0eO5$%cR5>NH%hNoKTQ8ruO%ja`2#{RfrhI5m~1^561eZM=BsQD!e|(Z5NB!|<`Uyz z8k*=}!L3l|VgUo?baqG|#gJsuJ@$~-eGz9XA%x%EMWe!8_TWv~TkCcaH8m<6Mnuah zo8*q`snA2T3@v|~`JciCLh(LfLboBK<+)(?QhN zWqPlh${?1+A|#Y{a;o(BDL_+pD4R2Q^*#|%kV?+DhaTA+PE!wJ{&`X7Y17QY_1Vo|N95<)*mo_a>lyWq}cLb#MCcKMY9k1nL zngv8EbKg89epy!?xV=;5JAT&ZQxu<|70qWr0?TY}#G3K^T4E@z36Tb?RbY+lgL*=rIy(Kn?6cZIx$5C9m@>^1csBdCC4hj!Pqg5qO z+-FYH7>tFLEz_XZS8qWHV%#P;ct=6z42B}7BqDhKtgw{<&2W+rY~|$+J5Mk9)|rjd zY%__j-@1iZ!)g>SYal5aCbpI3V(8fY;tQS3t2!5X zWg;vr!GtjkwK5kxd3n@^+&}B)k^wIV6)XYb%}MYnSZ<8LT)3sTA0 zT~9DP5eYmGJwLg#{qyKbmCd3b+VxlQB`JNcIqgqz9XBUb23K@+0J-n|^d}WYrmb9n zL(j}iG-2$3T0RB4seZM$Gm0@nO%Ne}kX;td>485-;a1@G$l&a#XpF1M;?_1IddJBr zVlm)I{4O!qyVMV)VCs_|AFPEk!_FkZbafcs@rTgEqdRl9Eh^JQt@3 zx|WbX)z$cjG|q6&>YrIe z?_Q4Fl9=671c=CH$;RME8u2#2>z#K%AK8VkQED~r2NW*aRK++}OPP!F8_KEA*)6m? z=fz7_rXBB_)XLHnWtb25eGi?gyIE-3$*rt!4Xk;o3uks|d=3t78wP&b96R)7j_brp zu5O5p`%jiNhK^I+LyI-M1hOB;7bq5nc6Doa5st3q}RZtZ`ft_Z)XEM$uwE95-ejr!P zk>xF^HCO~Uko&fj6gtR*R8N@&>z7B9=z@X*E;ea9BJ)C?fXp&wjr4G1x?2aQH)nNr z;5942{JuPnR=eF5f|1^c_kym+_Crr&IV@Tr;*WF^MD#7vuc_~j(+rw0m3tDWCXk$1 zfTIbKL?lhqkOhHy^*KlS`LeZa#szO&b=ey2a6qw9hvG=x?S`I&p6@UYBUqGtF}r(= z*=mXf!aDo-?|>0ZTE9{dKqiw{KN%9S&yl16k(9*dxZ+sBs$^a-L}C!y^(TI!VnLzn zGPoT)gwTPgcx+pp47j2WC^IVq^L!x~_l9YvgMu$F)u2WJ&T`?HEqrg^zJ)(#t_xJg zfv%SN9)>~YRsy@hQ!tb7%QoW4Wl^)8ULrCZVp!^5Xo%Q|!9)|^(s_Tr866h~egzoH zRrQs(Ui|U)HS-JjEDsIA=lC#yLt%XIxjTM`zddW94OZu~o*s47+fJ=Llj9?0nn!Pk`}+KhB!`M^ zhuJ}U@qQIiq_~f`XuIm=brp|g)f44+u6$H1+o}zC`Yd+ECA-MlaB_3b?#=L<^k#)) zLc}Crr2nwE+OTQqyZiH~G}sw4W3K{bDXeTw<(b}u5=}&b*RcE~m9ApBW{rybkESy7 zkxG0P7M67uBMMeJ?=$|RZHRVXjtwzvtBiD&h2=! z%61{yvETxmO70U5qjsUu_)S3DlE>d4fgQ-}>2enPHyn-7yCJjpoYP|>yjzpwn@9*W zzUnV>R|WQ&Kj@cxlWy70%vgekSriuXwNs3A)9^OBf;T<$@bh$FaRF(A#Ph<- zP|T_ulpUkR7OAVXfg6ms?rlge$xKpfWj|)rshg>2*{gKgd7Qv=lmZDU=(>TMNWRE; zPCjLwP+QNaqQ61h`D+JDfZwD4DYbY)Nyffj5nv%Lz{$Z}Kgt{ToLgU)s^bpCBzxE0 z)dd?B{}Q9qTr7P}_FeR8o^w`@0FP*iO7{2_7E0^=5g?g&ALL+UE0^3IEv{yEUnEOi z`XXW=Q&XPce180ZQf4)y6GC1#@<&f{Bvldx?g0c9kB-NzYib%fqm2Ttto}$)ra-45 z<<;n&)4@tklWTTMbswv^pbUP(qAmEUAB!_z#7M-M=+!HR_#ULDuN&y$( zTU$-llU!tkj|sRFkM)F{m-`c%t`UFLw)``C=9;{`T$yAKnJ3B|1lBouu&~nqrz9r zX-x9u8H#Lyp!rmB(9fS@%DL1>M@h3T1piV1@T^#XFbsSjZRcpK4d?hHdi<&QZlePKpWDOBRRyLyWIpbw#Dgqcs}Vhn9{ z3ch@4I`K`tb_LOsPBk=gF{(EH%zd>0%uoB~{O@M3U>vkqkV=(xs{!x4E1KIE(m9B_ zUpP5kkEB&5cRh^H=KPh%#BF-cN+fV-G?!79R#KdzJt-oUv`af3fd4tTm+!7CQQ8Xx zg;Ks!p!=C4^;TI$uaw^``Dlq_W?0&rfojq^m;D7e4uA?B+ZDs2SYSyCAcqlT!OnXk z355ukW=9CRVm~%?e{UW0Vb9}vW-!JJDURg!p6(M%8nLaC%+V?{g1a#+VC+Zv>Q(XX zqua>i42ODmG z$R~pc_nLq7d&QJc4m51(x)BTL_f8S=4!Y`U6ll*G=3S|M)6J}sr=FoB6|~M3Nk+6h zblwSBZr(Wivha_=92~!ZfaW^62jo}cCpNq+e^0<ECb=d*ZEkKRa|*fhcBlUax8r(Hf)<5#gNLw`RKTtrH{>28b9~YGuCF@>sbaB|~Oz*@Ab9<)=EBI)0T6}w(pNwqY zef*((hm`4u<{rd|P?<>T_x5%?P)E|Je0v$VTBcs(5lJ&zWU!5r>L~ zmMXQf`#Wp$9R`7Fj(%IfDe(=o%Due^>v(R$iXob1B4ZBA-vQ*Fbn_=@lP4xWL7RG< zl4*(mo5e&%-_%rCtd?3KTtC-JHaDr(eaSd%DZbw823k0q8T*%lV?s(wlWK>}mO_$g zxzg9D<%p_K0Y~#>;P$z3>Ed3wauMG!lUM7w9&H`5OVxRC&DH629Th%*AkWOoX2Hhb zv`buKBI=qC1e$yf8>2mlGspI%f+xT&5;3s+UVT8z1>xVt71@q*qL$;WdW10z{uP~-fW!&QS;j~0khBa>3k)CIX5rwCx}vBLLbO7)ok z9fJis+wS;m6(<+hK)RxAYtV^bK|N8LiS^;p2NRM}ml?`cc>YFMCAC(b~YL50(n#Q78nb?T28yo9PMoUW=aKtX65T$(QN8m71GEQR&!c+yzG;*_dbGG$>vj^xw)Q1w>TGub?bLHr(V37|&+nbo7=(}0#a_||Vw?E6v zLPz;^&KFOkKlsjxoQjCHk>7*1DTSTU4^)RABjY1TMgY+(XpXg^r%`Jp3~ZfPUS3bb zT^q+>8k#0^*i3IZgDf6GFqT6+lzL*G_xorYBC|amajr;UyKl{{hov z6@kdC)J8>S^q=lw;XUBFs#X9oTeHbli5LjZ+xW%$bHtiISVfyCdtbRqt(1YNE)*@9Q6S-PqsaiT1eWnugr( zOw06mo!%0oNuo{Fu_TIBZ4ax*mVdj}2(hJ-BFa^}wSNEo6_#g)PC7<+>ghE(VDEXQ z{J0Uo&r0_*3W0N04ZMeiwns^H@f87ylV`gP)~Qw2bNCk*z2D^P%4x2=DwDu~Bn`5+ z+wTC(ueM)lftc#pxr39uXK$IrSUO2GN`_Cp)G0{e?tT2zAZx5vntN!yi2~gzC!H(5 zi+BLpz4_H4ubOwqwW~SFQ*M@s-{tvtFJZAL2KQp3w3d#j0+i_>yq;;#HKJM~o=tH; zmMt_K4SVYo0Oy`vu>VBzp`mrMj*4T7@(n9K1_Xig{R{pbVz*$HBl!oOmzmjRjs`|Q zL$n*HMvD!tQ>;@TA(ICJWp7Ke08r2No?}t)JxxskYip}Yo5XbXl zgivh|k^bbVa^*t1BxuP`oPW>(wxMfx+Ho8oAMbpyn*M#o$w2f55EUuK(!S6uYUBMm z0hG`K|1#lC-LK!QdgrW0r@aPkbxMlP6cmz=O!Bn{4+u{a`SwUX>%BV66vv)q*-j6! zlX}t(LhqUMCvEOu#ND}|9 zyV!6K9}-oqu$*p&#i_xzX0yHR@#vDD_#G51v9Ph5Ywk}T%s^sQ>w4q^Y3|##p=p;j zJ5B4=eN>M#_aJ7Mv&QdyxoXv+++_q5VkpFX9^R9#c4zK8{mw(V6EAmC$d@Mza+no5 zJNhLm7|JBsm9H{$xf7F3T@;}c3jFz_u@HOx+eOkC=2{a9(q8 z^mRyZo;`{NXyG8|%D`#=e6#V-5TaYRZh_f&Bht3L*H9L4>KIOso1`Ll6^zluKil6V zNCA)aq9UVqVl+Va6-3ZthsWg@I3&hym;|9bqk~jWam3VV!Ez zmY<3)D2i+u>8C0P!ZZ-sMZI#c=sLb+HCp*EQLm|guq<`2VNZB#-~B#mdJcPX+B0`8 zk_;*mu%{@44& z!TON4S(*>I?>}bd$;LE?8z{0F#3Vm4Gm5-BY(9#0E}5jA;9a+6E9?9f+pMj}0+Lk4 zd~;#gB6%eMAARHL|A;yW@TNrVYC}hx$2<-~4OHsPhCdsF4Ja`mJm~o`JxlZr@ZP(h z2p*=$=3pr5ql=r@ps=&E&)au`vvTLL{U$nZ-Q8ll6RWNZdzvbng$z9eg+y+u!I$eB zkI!as?apG3`Bysz(j}uGH#qNchf`bzw>0!pK6w_B1Wms>BC}}^+7X15Z7_;Vwugoe zn^PhS63Q{#1K1zVuywd|nj6f&4!#kO>XC4^kRTwl-}LpaHJF_zj^XiqWYU|s=%0vK z*=u>OECm>N0R9Q7hiuX_#|t`-MCPE>wxC}r>I7pIYbl?#N}U*xI5>!ZvUefS3gfWy zSY(V(FiaZHGH~QBUF(7bB${c@#Q2h18Q|#O>*Ik{?n^$|(gvAqb+$`i6dpZz@Z$M9 z0mwrmi(&QH01Ciig~;3YcW{V_2#p~kGP*KJRiRp-t?)$Wh4OTz^IElGAbYLT&eZ{9 zDLLuMJf;DV<-dFcmiaV8WoFjys!%rV)!|(ND1VSOAvo#ys(S=7RrCYV zBlk@v{bO7S>?64r3e`7dwl?EE&i|43+*8NN%9dKnRsK)Z0+4+sB zd0I}tjM}t_U_4Emzql~aD)^f$A&Z@aSIlF&tlr*%)op&BBZ{)rv(WnPLXaw?;XbVj zLtlXm6HZhvP;!%A-k5Apl_FrIc|q#k+N*I(Ry1nK#2Zq zYDWy3eW58DEjFeE5XSeW$6?)>W0qV!Gni;)%WHbbqE~1wNDLO0mLfA(`!!YhkviNG z6Nbj#Ehg0hEx>@O8P4rh@Tis3-ZD`HC1q5QNB^t%lU2)pT;q~*hN!Gu7O`6yV&f5v z>=-<8Z@&uLaF%u+c$?|P^V>eX&OnGEOxPntQVXxoq+C zgMmKm=U<0M99~5IbO9h~W1J(WBbe}L-e3C~m10IbGq>UXPhzTEjvK4)Nv`OG`2^1C zl0FpW!F~d|cRh%5OSd-b#$&iFh(0tt?m0o50rbL16wY)DT`@z$wA~ZPzNH)LKOoCfqQTBKOZk@At22xZv!f-M z*?sw$GQ@M;al;UCekd`KC6FFj8B$+wxwuwSWv_YkF{l~%6C#;+wYZ>q2MA$)1f_}4 zeB0_c78a4^ak86Xgo{=aWUyUbv-LQUlWeyvEl<>H-k8;X1pYtS;a4?QbB+H$UF71spJ2B}@Ete+6!_z~kGG zUv+{F7pqw*0z!i{gY7XaIB?sRtkzKd67fCMa$3B^E=XOKFWey?jLINW@l+~Knl_M0 z;u4RfVf*!(6?GLWl^BO8-)Jdc0PlQ36`N`%@yW`y8Tn%LCf}g>^BY!3C^}m*SAg4P z{~1eW@6uX9>#rIslR=GDaq$g@q026xv3#%%M`l`3?6+y&dxz;dc6NPl>HPaU55Z_= z3%A<5WjJ~ZazAXW*oU0hUVQDvxdvV&bWmCl6Cg4F96VS-z){G!@v zYDOuDTK?Nt9;~+B=Q$X2zgOlU8ttBI3;w23Mu9=l9B3I}WSLm#r{Cb5F96_35wYfa zFAIyL(@s!Atn3c|Vz80__6}40<2x9Gd|k-k1z>fB1NWYgwA5Nt?J-=(l@SlEfa+ONN=b+ch<#B1J zL-Y3*kWKYNXthK-yAY<>q`$$YeiZ=jaf%QQ!pP{o#c%ly6(HQ5L0n#mFUDg5eyACq z?iakDVB$eYsvP-&fh(+~&kt17E2`vGTJJclw6PvOOqd~Y20#wrxlkqpigfdZ)%20k zmb#lt1H?CP+z6u%=L76n_Luf(aaDaVs$Arn|L4!MpO#*L{e=*~zLkz!GR2;48QkuR z*R7`OGhT;cieNPY?W6<$%W1K(J^8a|n=I)f1Z0ad-|JYd#$r>1{jHZarHhU1TUy9z z0TGejZnW>6N?^6<4=XmJ!Iefi+Tytlm@5(vb7Q)0hxim2h><^9jCIb7o5wB{gE#Xo z)LUJjUu61%srjp9?s<`2sK-N;7dv6W5N`C<=%{8Z<@<=XGqaliiU8E6SbqT%4i=m( zEmSs(ey=MCpItaVpz8&a$%hQ?3Q0&01O?P=&gwl==l79Ce?Z4^Uy<_hBQurNzF=r; zfLuUOPiuoh1r}mfQ2*#|mT;8$`sapAmLMnmB)t?k_~tuee7W|F$;3v;TIFp}lvXYX4ocCTgCh&NSA45+ey^c~;R7^#`1JO`<`NzDq zQE-D{j5_ayJR5x6)*XDjEmS*F(SbjUirE7g#ku{?aYq>y zC+BSxoTXd};yL0}E7|o4NwcGk%QQpJe(Z^9&)WvWwErqpyF4W|LegQFL0_r z2?^Ye1>YhpJf1~LWVSBQYzT}FK%u>^d~n%0+#pD=g@wA4G7E`TrjF3Xc{TN?gJE4Z z@`t5EJ=TTv8% zv~*&3exbg%&S}fr%^7X`^niBis}uo9g;Q;h-Oz5rZW%!*j}Jhgl6^XF z$IRBHRLpL9geZWq=54ENot5sQh<8&`sUFeM6VulEz|?6$=C0*Vi5?G)+noxX)`l?f z*~~>+0~{ct(4ej;FVB#B;Rv-k1%S@32?EuEMgRDoL{#=5sm9B@ED1M|r48*`xk_QdC56Uxg?7#f2;q2t-1UVw`xp z5Slw|jeZ9ps<2q1?b0J!D2kzOq})BcukRb-xFeL1(9Vwsa0h$E&6}ru#Vn_ftRmw1 z>8z&CN5+h$m{0a$umGe%?mvK=eohhoTw>m$k9Z~wOQIcbC-HG4jS8tF1IJ=dk`e1D zZXDI!+uKV&L%oNeDxNAR>RXtbuMC^q&#aRri#GiZC4UVIToRYzgJxvC&e3X`{8(RT zJxWHK_nu1RQdf+>^<|vY^BEQoe1X=PT-4T6(!iK}onf-UE3M(NNajaOjOkQT94c|` zYgYWOF4m5daj1yF_P4l1J%?H9cVWV|pkW8w4Fn`mKA;22LC$CCj<)5$(H!#VSQ#y$ zglUBt*!s#Iqxcy|TYtyrU%%v@7#$rE{}?%t_{-c%OZ;?%sym5~3p9VeP%`|9BN4m_HA+H8363A#5Ps!pmbVSDTh0f9 zLRrx>u^UdtIpL(&G8uZUB%2cZwtG+Ofzu?ku|M`;jH(diU<1G>JVN*m-v z^c1FvQl5e!bqTOhp@8J=?fte@6Y-9tYMjqy{n<)?dZuQScJ}U}1&@J&L1&g?wJAgR zT!FudGvf4N0=J!Fne>TGB-OgMlKsSWfqQ9oS;gS%q->w4si`?osmG#S=h6Z@aK!FC za9S6h^XZ0}t)x5!{45ZUSK16Z&Hfx%d$PE=Xt$ATnF{=11EWZpgDO}`VosY49*9_8 z=Lzt&i+fXw{JwdbWw&NJlqYwVw=N@a7=gg%@ZtIz35P{L<~y)vqBVjNYy_=l=yAz) zsW_(4cEvXGV;n$%J~s3)Ij?dWO->MORSZ_jqb(pZj(^qjmGy8Lz*6<8tK*}O%{l7= z55khSQ_R4IM0sAGn-9V-S$lpTUo)s^`c#Re=9&Up*Gcz9rFyuitD6m;)iiZj9 zypaJYDmwbi_8<4tL7IoOO5f>awV~b?r<-x}SsqlV*vaMz(>N%(uU>H~yRh{s;{Q0)QtUj338LQ#Bf;9ulI1ajVN%J!TitCzuJRBac_ea%E1JmY zCVY>rw#VOHJ&^n`a98{CjHV=`*9d}Sp|)nZ3Yly0Q1?3HE7=wmFynB+u?fg4{xD7W z>X#dVEwe8eX3<@}pp+{Y(;jXNl0?f=4SMCAp&2;QY!*85J|{r>Kj#_Sab6|4z03U* zYUo)&VuZs?cZ>g^=@6nV+lyKbfJn)hnV)`t-37=s6m%qjV|DC2D+MXmUEi*|zX2SB zKMdt+=6}BBgjjqCc5;8_v*rxTd!-OAfq-g~uMHJkwKH3)b32KL8oHj9Rqtet<6B@d zdepT712Js=HKRL+)uisP#y{A!D)BQjx&RhFFG?W?jYK*#LXQqvW%xGj4fc>W>(QCt zL*F@WO=Upc1s?uK-+Nng?uVrwVqu`HmT0>>dE0|1z(Rxotn*W|j}G};0^>Zd6+->} zjZ#53hfZ)hybs`BxgvdKIMa z1lozI5K>Q>Ndee^q$_ghc(xUk;MlDGwr1wxRLE3u2gs>;NMJ5Q-2)iRH4c~J03XJj zt?Bn9@_dMld zalNgk9^&v~7%FBV7!_ui=RpM&5-L-}NYhfvn za1ZN0^{PA`Uo4$*Zl6q9gwoP!lPEtltouL_7&iwPr({%*fu3IbCg1p6U2o;Rm2t(n zc*%~wIni&*ISh5K7++uinVqP$zXk;>@GJQ_M;RP>J=pV|zz|+89w@ruGawlLboIs^ zdEj3F*hQV135Dmyg-#q+v;I4hlC%t37id6Ndd#ya3=D#k(;Oy{;SogTs>77L`QioY za0NmxW8b|Mm)nE?k>Y6~uuOm{SllOHS_EyjoqbmsTIPfts zB%>(#T{Nc04rr+~Gk8mkyV?f!o+RrfD-~$?)2YYf3hcNV<-LMMM-dd~lbVVJ8iu}F zXWBuBA3sWSr@z*SiscGqYoy;~U{D8`?TZZ&h3K2|5^4)apn9whSvJnRAf?hQzY4(5 zpODe_zyY~hozAUK$XklEYyXuas)Ho80;&LAlTwTW$6l9d3_3_xJ-Pxl*pQfkMHbsr zUO2zVxVdAsYA%&paQ8^uYwDYO>PnraEwiD3$6~R|*sk%WF&ZrAZ6L%vJva#i+-Ar5 zEpY{}bC!G^yGgGz?V4mJfIxz{HUBOmLB5%M7M3+=5=suBuioe06f@b)Z(;LD3spE~ zQ>1ea!LuL^v=Zu7F4WMmnZzXM)#;yjPHXJ0uH}g$9y}J~`TAb>MaJWg;NZOG8;czW zIZyytf*9zTz7P|ecGukTdCtJI_7k|&eO3fX_Y*iJ7MF`iZywnK#qj#A8_;A%v)XR82g1~NPUi^Vr^rdi z5t!|Sov@nz_PV=KeP0k=HUE|2%I>t&&TbWE$#Ml3ujfuYJaGWOrIBnNh_2O*bh`)A zcwG;@L9n5_{q;emapwyl>^IOSwgH!CU$E-pNcrluYj16A77M37b*o8!VE}CF%iRs` zy`$-2jB<4afYDKqyh963$Nrp;U%x&fZ+}3PzfiN)kZf`^1-tM=K)irY2?TcU>!i=5 zMj0A^o6eaI=c7S)lT0V3dtP4G)N3qnK!VJ6@@k*kA-Zt;8Gx$Djvvqqvt?inP&h>5 zjNZ9bL+@ODuNE>6-^M?h1a1dd&^>*P-SuX4zVi=HEkaBW<`XHX0sg>+TzPs4n3turn zhT2j>=Z!?}aGxL$Eqv~7)cmS7rG;Y^^7vx?K}@f?Jl})}==#80JfuO?()YTn z%Kq#oi?QrtYoM7#e2JurQN&xoJ0o}1tfp#JFdKC%1*+YbDE4rA77P5_8}6OqZp2TN zqum>3c3D>~H5>ooFR}diM(K@^5GR!5rO(O}vJ}#9w)jUXZThPe zXeH`O9L;O{BbmEQHoxUu4%Q_JbHZ9i+dsZ* z{LRPceaykUpms@ldU#nJvG1N`(ZlGEdVAaC!fVvqR1k|SkzYvfC`BrX+c#O~K(;XB zyiLDjhoO0?E5ZPgv^*|dg~LI9IGw8+To2JibkF1%73tEz=ik-Z(3EE8Y&+Sb=mqhd zm0D;eos9bJJ5m>2q?f{=rV>BH{i~gl?N18~ko4bBWc4ItUzt<5-koiBqW7W$v(dE3 zT_LVC)ViM^`Qjt4iePHbCW>KSdi(=FsF^1%FTVz#9$;Quo7to8P*+wOri=YadAuX# z<}OC!y^>~iX_c*(%$%cQo+4UNf2vHJ=45>jFoC8IM+1>}NG|aDD?IT>wQOxxc3W7Z z&L93Ak))}Enn&?<##!ezfA-X+@M%C$gqkF5buv*+Ib!P;MOc?6a*{^)q-D7Vq?{K`Q*BjCtGx;&k>y!<39 zb$Teb<|=ooO%N3%OBieG&SbtbR)4#pusN1JU2?-k~}O z#G0X%dfA@$aeR9b!-eF$6VByBn_U0iQ0g_x_UXc;p`}`e;moHNhDbfz-)BxHJ@&Km z^5vOfx&NP*wFvU}muMS%$uL}hHF0f~y;bf~Cj{(O{QhkJs%HMJc_4r6Sf{g|(84EA z3;&P6>py=D6%qR%ksPuL`u8vWxBp9w_|Gqe@JWyYtpB{|U;h&${XaET$ZME-|GTLA z-!Fd}81g@=um4;q?ZJPk1pj&YC)St$k2kBfjN>NJBg1ei{4!15rq=)R4%bkNr{CkP z*@l-v_B&P&?k^YUko|L&+k8l+<^}TU!h4V}zy9AZ|IaOa>h=Gtoc!mT{`>v^Uww)H zzdiB4lfn%hyn>-JeC<9_J_OoQjQ`uiYWDrNppV}VGO^HMdSa9s2P+de9bFz|nKW<9 z8+LyA5Sr?5p4eGbw^0>?@%CjDUjZv*;>kc*tCnur!~Lka5oR5tRP5EPCmC^;muKHoQt_s zMEoL)1Wg~Dv&g@ZkR(H`qP_T`Bm~=K9#r;gtY7s$7|*wFAX)Rsvm4F8+L4PsNm>`U=Yoa0#fQuJcPN$ARPkj-JC_svp^A~ixSwS zQNz@}e&d$SOe0ab`M8*!U4%!aI8@L=pSG9|XOIHc6vm*%eV)j#2M=<6v?d&C56b3$ zezYu))YEQm3KtfaHiKLg%qW2yu7#?P!IW;1A)6ow2TgV{JFdL>Y{GPNvL;mrQ4pqdMliehCAg}A&Uj~Q&v|yK zv+`0}4`?lq1^%Ret^rK}xR;PTqk67vxgO6}cJCUMd@Z&w-#waw3X3UU=#dBQnhZ`p zlkYqoq>zq&(T9K&|C|@V9a?3Ut+MQ7sKpqrMpxKd1ht(>r9ND4)@h7O-l(aRY;|5AZ1%N4!_I$}Q z574g2{GK0Pd2xp+ePpjb&O=&+)G{pCzcFw7U7iDZ4j6D#I_C2ViTK!F6xil!)L}zb zyEBz;&|yCUmF)679%xoZ8ehzb1>xpScp~uBDPBy!v9gjK?x~|v&Bt`W+t_wJjV9zN zFTR{1QU;^#a274@gEXla8^h8vmg>oSRSp=(#Zew*@_q*!K51zUClLx}mtoabj*Lpt zcms<}o_`qECo8bTJQ`vnexIWMX9*s=x&6PFxbg2x=i9CHv)J#N7uPJ#7cO1#`f!zc zLEh(&U;{Z&v4*VF(wl)m&SVODgUW@upP|vF&?KBKh&oNTXGl;l~d9g=ARih*R_o;J1TJj!u;KouGYJA*g=9A)B&QQhljofG??ddGY-oKC)N~?W=z4P1@S=XwsFZSIQFhHQ z_%E%GSD;x`J_^Q6M@m?MDUkar(y1R!%8I~bDHn2r;rUyAMF9sJ;s@bAJyrWFdF>(J z@ijGToI)>&AoT06QoILp{tIXv0b0?Jk+opS||NKEM5QpqTjvOZ(=%X7=C@>aJ zBp*@cYuA0F3HI{?!S_v=dja3Rd80Cd=nM!IAmq?!plOL^GZo%qyg9RWCfD#;pu+0= z821Mcrk2lNzKVs;di!{z07r-rQlwOz8~C;u5WrBf&L=1s{|)!S6%qv+7|cLAF2U7! zKrkF}$-`6g?9F`ee6Q*|(fWHoBUxl$J(-z}e;6pz1lwt)?NWI*!^Hu4S-FA4co}TN zU@Hh8{YlHUT+b{#6n}6{F56Ju$1|_~BF2XB=CN_JBa-zUo*87lKJvh3u}gaG3n7(8 z+V#{{w{$XH77+fgxmRcI#+sYJ-nA5|}(bu@~@V;KYgS6)Dsx4B(D zHG-sl-XRradD!%?;;q`yRS!mqZ8n%cA}RI%rSu6OFQ6bViC>kJaD#vYW3gfsT4@%0%`` zp#wsqo|q*O@bV(}He(}JSwM5zlN!Fh!Ty=iZ5G38%8od@I}0j3@}Y$-_9;2{wDrCYNE@>vx4 zvabh=!GY!ROcd8Z#I2#Yirl5(mK@X36zO8DMpyt}p$^!k`791dPR!Qltjg{nYy27A z_vQVE`WYx>r%xPNI|6v{9_Zy0mCk%qJim9B7?IpR%z#8BDH=AlIq1CDaV8D4aJ$uC z7y=EH=mbo1T)o42I_=Fn1E!<37&$78ikP>+gOGxT+3SzaJvkBVJW#ly&Smsv3lpdm z`1!LnN0b9w1&IN|+Cob9$cIM7qsS!g8o0YkoVEi}GElF`qOQvRFf9!cDfCe#=aoNg zL}l|oT!1hM%jf+|xzz4zxw9>NP_3NVB3QLO8QO@e#G#QIWnKVHxrXvB@SM5^$!PC6 zVn0WLOf`REe~Tj;e3Sm#NK6%KDmOTrO;lk?rZO#6eC$NJEdX8SCX!|eyNMzrCirN4 z5;5ojW(x2Zq4sqJBm&T_qzTZ0%ibyXn?ly5R~}zBy}zSIrLeC5BDaX6@O@ny!y&HZ zdS7&NG;U2%n`M9>MosHT%@dXNI8@Px1j1qYsPv?m^j6*B&dmE$JumLEH9Z51rb^V*$l+^X ztr(b3#K)$8SfgFTOk2LT%f7SN5TTy5WwALv&7S|JGk5D>3OR^}KLxjmhN6@g7vFsH z?3n>!F<8TP4D3*Q${-^p)!;-Z$`F~EnE`+_TH{Fxy{+U$5Mx*tsh&D#$jVnI!e4$Zhcli7dcAR-Q2@2t<8ADkZG zc_$=X`~F>a1h`#14)rUy%ZrRg``M6$Hi1ixZ#$=H)TiKm1{asbJ7_9EfmVr0)%L3; z&=wHtvB^8J0fo@(^D>b*Q^t&f+)b7^)5RX=@%rA3XYV~ZO6qgO)|-IZ0Dpf2kj{f> zH1dtI);51Gk-OnfkI7XwGIn;K0|H(qX67HvQ4hg~`}kx!-C*epeu1oPI)t^QrTU;l z!f*Ei=K<(>qdYN5K-=E?^PAY1!)p;Yx7ya%=|6v}LR*lRDWM8q5}`2R6a3h_;Zm!^ zQ(oK^WZf6-61@#hh|@9=XR)6H90DuEh&7dhD?2+oPWkHj^7XJA#9QIG&=yBab&MqLqqS#bT&rqb)IfphK15KachPZ zw+09#i4t6)?`}8r;EQIly7}?WqYTFa4{SzlFW3%?oI70{Hl{KzP^_S-!LQ_mTbq`F z@Ic76+YN#q@8}N*tg(rN#Ky+*Cn~5Qed)R(=K|ev)h6|yk(J|fVF2l&57%^7%?xmW2XK`8gBv5R$|FT+lzBk zUS5|!n?oV%j~;=+;rko@9Vo=eVNfJ~3teKB zlFk`x@)Sv#%F|FW#ml2AAznRIT%_srj|Zqq_!e!TtFeBeH+sxO$aygy;UFM?cnvi$K+- z_a>HnunwgWG{x$$VK8d*W=br)8H+2b=)Cr=*A*-Bb37Nl^CO~+9lR%dhpGPgWhp@uwjJJcyqY6( z)r?bVg)Dt#2A!&J)?3jbA&s--ds&*9{Pu6EiryR)b1bZG;bZ4k@iv81u1;fNg$E~f zRXP|&)Q{v#y6lJyR~=aK?(e{-d~5@h+_nDBzkl-Xd+4SZq*U#n4l z1(#{!!)x`KGKKDKkHE?H^>_x$;o;r${k_|Pi1bXSBFx|4wEZo{IUXF7g-ATi>2KJ& zpPOf{wsOLeoGgnJfaf!msh=J_4KyfF$#a3q^4#3qN53p&k`29vU+|(kH9}8$u)2+y zP5AoaLk6D4HK)N!%>mW-D@p zwkmH6h0(8Rws`d`0^TsgL!kjl!It$RV{GK+X+Jer6qPW*=-EL^?*KiX?aSf;s_JZu z{}LGm1x-SidWkVKro@CsKpL!AmWx}-xw z>F#bt5v038y1S%7x~01tq`S{p&yN55?z7MDoG<5-im(>zzUMvX7}vN$ltRa|RFchcQ5O@h{S)4i|Al5ifa-*bl%+N*BAei zMlnxaVOr=?ogbY1ap<;h0vqtNG_UX6Nqe$(d0P)`aTG?M{fSt@&4kbf?M)mD=|ogE z6W)&OhQ!8tk&&@Fq`Y_R=hQ>@{wUHBcKKON#hc|FxkCUkFW*874Q#}NUIwXRVa*LZ zU?NPHXq9eCp&oWr!|xb>3k4qpaD|26{Wq(2R{I*Q(-rb%C;VV>FlY^9Elsk%49Azj z86SVH0xQxc@|U1nv`Fn*@xlSFj_zpS_NmhtF&FyXmcGJQ zHIB~Ru(<*)%~OW0I8O~Pk*;hbiEcW@X3ORK@n&VUiRw_=HYd^rm*Wk@)UO}_=XmRU zZdC~@0HoFGUEX&?T&36X9Nn%pRR2L@MN)hoN%;y% zB*`|1F17Fhx2Ebs|RS-=Kp2xRC>9pC2 zi(W@v@tAb!2OnnH_$zESZrAxh;~R8BwM7{F2p^ zEU<5|gq-`Hi?7AV=Glq~LIF2{?T(W=eTjN(Zb>OHoHNEa7!;nO-#72fYlu6Nm&uvy z;&1;5=QtX6!$PB8TRy({`Arx11`om6KdR9iW{+7~T3VpwTl&?!59&8q+@OB@_Txvr zoYB=A%k;g8wz!FKF#4EtTL0qs7JEI2UQkew>n=RLP@a;%JfHw)n(-Ls)p5Fvk#6TF zr{5WPrJBxnkcac$f7P0M0rnl9P`NW$+h3yv+%76DT{zu0j~mz}^ScNC5F5f%tB{e` z`J(r>>3)mD@2u_dTorV1?@fB{+SpRLvz@WRJX~0E;^&qmf*3X-ue*KY6$i z5v512v!@=6lYy&Xwd*Cm(>E^T$)DkRbBTi)%UQ;~cU%g&b6=kxbZ5MDS&1!+Ww&I6 z>E6<4DSbIm#!=$+dPs=+Bos{^OMdKac}93qRGX*{VwAN37n#;)hQKMbnb;g4C>S82Gcn#&@g}K ztRo0B0V)M>1A_us#Ae?a8S+zjo5vnd> zyXo27?>orC)ahAT%7Q~1zciazqqJO2ajs%sm_-jh*WY=f#C8nk>Dn7{n z3g*#N$td!a3upmbP7{|YL$-kX-uxj+Xs6(Cl^Plo6(wC>Mt}rI8WLI+#>D6%nOJxZ ztjiZ}wS0h|dAEKF$W%%F+jUK^N3|=8P0iu5=G@g;I*$uJ9)5e%?Lz{sB$*%*A=*^x z7xSdat-jj7Ml&y1m0j|0nZt$lb0Tf4Hc}LXQ>Sv(hs_|)DPi8FiZ<$r;-L$wVgv^Q zlHm>SQXIa43XK#$j9S}c*m%KhzIy2L^1M?0e>f-#&%m~0Yfasf-KMw(YPd)6UGy8r znfN-CVc(&N7#&?4euZk2E-2IbFhgiz6OiUB7t|15w>LL#40_A+Z={jZ^2C26sqLe6 zr2>-HBAC_s9gcu0{8*U_6F+KzT*p0Z>bHrX{ktOBqm0Ljf@t1b{@Oc;!UO^q5^NlI z@9x?=Y^Ov04WYyjkHond%O!Iip}>7NJen;%g#u|4h{E*f=DGovRKjj52xT)lyg(|J z)+ddJb?^o1;&(OCKEX&B58MRrrpsVatvA7XM20k^*pS+FmgjG3Ow~*Y-C7Iu67dP6 zT(9iHFj8Mas#csUpK>a*IvD*3t~q?*;v9C%d`(8Du(0eSVAc5fL#?eVfwt0~ zP**eP9=uhr^VjJkZr==JF;aNuAm>#E8*HjSt-&TvJ@A$x6(BrU>DRK`AW2NMdzEWB z9=j&99|5Z@2das&WeAJU@_AFOzx-oisBeb$@rIU^i_;|iXMS3QiO9M(vz8McZm{Y8 z$(M~}bxC6Epig#N@IBFLch1Q*0s2OoNHX@Q(t9S|$yYTGFtxjbj~Z`-h)}ybTHtgl zkX3klGQiilxrsunEo>l|GAwHs00y|C1qa&#qH#d4-fwJUK$LYoYVRFR_eg13i~!|% z51}zVo__1M7!j4bQuWKj#%Ch^Mg-f9sIUK6JrpKdvf25~1s7!h8=84>%@Blk*PMY}nnds8@Q8$R>RKe7(Pae_8IAE683SM%7+O1-zgFy^nDFe@CV<&GzyC z#r?#n1LM%Qsn%C``@|vPpqbvCu0tLyN~2@g@(s*x_=4CD+^46LKRIENA{*=KdWv_&y3brR*@k}h;`{XrBhWb-Lz1K1}&IyX- z0V>-53U#7T`Sb;cX{bzI@2_Snu+oliam64SZ~YT>e|30?3al|wyPSXYPHd6qmQ~qq zGD2EYvX;{WU*W|zX)rG+N_jsr9r<3VIx{sMdm?bd+}7t05*Ce2EU_T^!WsIZg+rSW zvBzy^u?4|yut;Nq$^dz%H~i3-km)N0re5K}_E)e(l*yElhr0147uVBdEGDao(NRW+ zUufbI#RbOA30$sE|Jt4JaURQph;e#jK);JXXORpB<9W)VmOfFp1yV zu-~q7wL?gTfQO8qTt>v(KV=IVMTOzX_mI3m8rMnhw9H4ui-B;4i9O)%0S-!NPo@lM zCp}=Qx!eu#u)KEIi`=W~sT(3WoN1j_kE@r-H?n;k5nXy}wZ`}O@#74&Y$71q07Hv; zN$ikOdwlUF8Re5?S6s1AH@-rANzfP1tdOigMvDy2_G}{b+^PkI8P_*)ZB9@<r>-E}OfgIN1V-=vjXdg;waG+ZIrQs+Irlh&Vf+v(Gxb{MH;Ms7u^cvhB8(~I zBqkx#`fDZC`J?gSqe@fB!wd5)BP`Ibb) z1^scm_v%J0&wEVrR4d$jrOf~{iJO07K((fNPjRFYvD~>Z916?IkY^M9H$3yCPj+{s zNAjE4HdqL1qQ0|;2x`uJqppDyJ6_-X(!oF_TUeKgfYSoO z{@u*Fr*@3ta&92`IK? z*0=*L>aK2Qq`SofUKY^Twwg&1`}@&&!eTjn3v-~*Q>Bv!REa@p#r}S@FA;N2THh~B}L;YX0_nxvX4I`vj0*|j8u*mKZj zCU_cT3h#p0g432|t26gUikeT(H?}@_eV4IY=5l;m5A!~Amk^}9B^4ZZev0&uF8kq? zwZ(fC!IU*0HKT1ONF5GdyPMs15diL31`yn!CqkUPu)wp$iCrLfGEH0}KAg6F6KezD zYzilnmKG7W>_tYX-@#_g2cB01#tG(D2ssftk%8eIkTiI@aem*^kkbb7U1pja`u+RQ zA?{n*gM}3Etx49hSZ*g3C)vt#6vS4tyL-1orAGwrHTd52MLJrhuFT*kzd-g|d%({Z zA50ZN3SfrVkUG#pU1Z6Xl2zY3J9B-jJ{l|x$@-34PtO*#s;(2-F>iFVhW4n1g2I-DSkTVyQEz>Sl^D@QQOLZA<;gm3#NW%oG zlFoweCCR54HX{K5Fn?axCqUr?_G?72KO1xn1}Zb+pYy!M^Zp1eP$-40DOBgPaFwr+> zP%&6+*AfG^b}Lwj65oqAHDQ)E%!y3Op?vF(8)WeKTa}onRBBhu>iZ-B%pjyGEj?Rr;04yLy zE|YQ4&Mbvt!slPZ!yxI*>*6bSn688a=>%{RZ(o2vTyHuWDl#Z-C~SHMxJdxJ)62^~ zGjt?(AwEfgvGtcgsn06~@fykKqj59DLjtpeXHcpOJe74z zpKF$FMszSgM7Uc49%uzFYJUEW_4Tc|1li`)s<(J^Gkd;cQ}p=Y^g0~sVo5xP*O$p9 zRw~KB{MgIK608h!nWyaQ-9gFINY>j&EQI4WAS19;t+fo=*)azZoAi2m>bvJcfM7Cn z6n@8{L)N$Lj|aJvmsiAKj`DqYUO+g}{CwM`Hgb4(33zxrTmh$q~VvE)wG6Z87A;ICOEc9SG3(BBv8p z7R)K;eJr2sa))tAuw`)OdVG$5wGpQPFG=^lyw&QE(R6B9ydD?N$d*j^z$`X=uF-W? zev#@*iBZD|QxI=e2_$(OF!p)|@U3Vo55k3mG&XjZeLgo7um5%>;LQxqqXFPh0W(26 z1LFZAisY{QSz2%9`uT~+>H2hqC*Y30g|Zz?0&TOT`PLkW3ol)Ot(^h@B$${4CT`;r zUHO8gV&hE3M|{m0NrXQ+IjHm~PN<@ z!H=688s0qR2t8BL7N%xN$@?l`d*;d=h*>Kn+g%dKCZ!JjQCMH$+S=HHk-9*&=;4RA z{l+hQe+|lJq__S?JXxoE%dJDDw4i^OYw$S7@6-cR2MD^l2#Yj>^XQNAD_9s5N(BXi z-0n9{hjgAlZzs7yz^eaQROc6n9V*NjPNO&ECh`7OC`i^G;o}jk-8*&X*dj=e?0fc~ z&l9)9o)=?k-Mern5zQo-kI|&}rKQ)USIn&3u4xa{@_Dpj%YF`(IgFcL=|IDFa`H3@ zy4|?Dvu{5vKH!(}Gan|R`8#d^fzRW zNi)9sC~csEAIcgQm!?vNma9;t@HWhD*bT;iqC6nxncZD*$6`Ux&Xy|FlzjcfZkU#J z)H|d#1IWVuUqdi!K?(|Huw()>hj+^1m`B(qgR(Fn5}Kip>x*Mx{q$16WQToT!kO>J zmg)N135J7#ZAv_F?0^1z4VDdA(&~Wi0nCxs*B+Sy+jV3L?(X~k3M`G#>>t+5Kz85X zm%?0~%C3_^ot24%68z3%ve?}P)r|~AfR7KDFB50UXNrKc zgFQA;OS2D7=%$EzYfZ}_v%_U|`Or`@IaCDNr{7b7rp516JRdlM{2hzJGh2)>wX3P= zRzMH8m#^=j5)K|??Mx#NYI`&b0ibC8ueN{p+`RAe=P7Sq{0n9hn7_bF_pVJA#t2S; z^v@%>CzZuN=669lLMR2Q1H;%AsDqhJCO-qwWq-DTJM}^>GFms$U?Duznl@K@8a7Gl zE}Ea#%5L**old;a-{%oUn+#TH*})@`wOfM*;ystGI{V$vzrGTJF;z^9z7YVhGs^s*S4 zG@}tMcJzO70a`wlR2v!h=79B*R;x3#jVbbC-H~fD#jL=vP6m_@Y0;vs6MVl}dRhUm z|Ll?QgORmma8OR|X!#=o9hwQrkZXaVrlECp1g)CCv%`LRMi@Jsd;Q59&>1q~H`cyV z{FIULYAc1w@W}_Dy}{1W*PM)c*W26PA)R}VHP`7|*9WK>SNzo+&X^-TP>=P^h53k&vSVw`>8J*a`-hdTB8rh5|6f5RJ;rq|k61O88yyt|#_TzQb(t zr)U(T4u#xrX^NW}F!=s6W@UcpxcBN5F-~i$YOyu>2L^OL0rR=-$sT~V5Ka?t690Z> zHk`v^#CfFv1Q;;*7>%?w>l8i;$uLGA~VDNR#dNtfdmF1JT{R+aT2 z8)q^)<3g14e3~x~rwBkn+PrO*ZluVPVX6WvFp|NB2!PjvlPnUbA4;;dM}emSCMIOE zWZjzEwQ*pWIJ>U$4UR{!NEc4tszxcs<+Y`}zf99S;RHjmM?VL1B>Iw?$7+O%i!VWn z70bRLHo+R_<>M4*$gHcce}3`+Et@s4O%l3>8|3*Lxj{U&&U#u~`3 zSpGSAltZ11AY1k(d@Ht{qWr6-N5kG8SEI}{00@gP2!+XYyeE3}-s>Id%H*1osh2%51mtlFLO>O(A+z`ze#igwL~=8r%} zpUQxq{`~xq+vYQ{Mf)MU{N5AFE-0Q}DRg;*_SFh{5U`(1*;R1?^|kWe%8gorT}&%o zy7`k`5+&t{S@rzq$jA>)R%RA6zYv2DgMZw0f3>pFa<}p?7_zqqlitsxwJ9ts(mm_) z1|*rId3t6#YpCCZ6`+gof$ zlmV}<()_AjFevXT)90XD$DPALfk299+>V*x32$6keGWpJOu0lx0UvC=l{}M{ z*mLC_E?&C>-oW6}@-kJ@ahkMDuZ2A#zEKDRaVH#)*QM5ibr6=pfbD}#MWnkBvZy8X ztJim|n5;Z8h`eFg#@ERAO1=7)jZqa$oc~(;4b228%(rQxUA!|5u%R9N2FwX(fBOOW zsDjR%V3%n6aeLNXtefM@mlXAxBQ?Co=LazNucq^CDzMb)gz`?HCRsluw$3~}Ffbj4 zz-SsX3yvd3fJe`@Ce#k)85V#tW_DF6^sCQGO3Wze&wy7f#U3b_G#aR6C_Dw$L|5u% zU$#91G^b-ppYmGVvSPZA7>q-O=|(5zbWl>pvZ3$}#tpjNO70OOu1QJB8Jj8rlNBa- zyt^xM8)s?Fe^(K(U5}O+pvQ68YPFP{BKSj2oSXoHEsU3T{uxh>7iISb`jHI*SElq- zm^82dQd0#GyH> zjzY2Q2Eurzp!ZF@Cs!&Ag%MR!^)O$4G2r@*Hb>0$n~! zPB~5Dl$&1+eHBssBOGs_kp(gk-nEnKYiwG+xN*~1j!mCy?!*2^|ECgxPL1Tni$md6 zC~a{G2*7Yu!S8K8E$c9=@7bK9KhgdiOcust{DTl_Ie2hpml25jUEkpuP3FB$OgM`^Q=hzh-Q%m`sJIO5k=_ zZO0RnrIEcABnz;$N8BvD(*@8dt%||W6R1r5)8}J_3mRGSxrx%pfHpZ_FT8`C3u)Je)aU) zbx5-5e(5g2vZ`W90XzCHUwCwY&SX4V(lTq+H?i`pudojSW+6h6<1rrI*N9_eg`6`c z`IQl3w;te(VIYWZI{S3qJ^?Gk-2@07AQi>qi0$>=1tjqPl>(d7Or=6b_M(+V17Uiw z3HaF9GK3$uVW3=~j{(W8kn$J`Pa7sa{^ynGCFAiD!74+~iD$W1*QYDJ2s zCdsuIf!vU<>boRxun_joPyrTR|F~LIK=k&BvfoVMgetgpzv=~|H9FLrE%T&SvVPQJ z?T8&l4FG=VXGH)!(;vGK11biLOMIVXhf^Aj>AwA|{wDCnguxgtQ?Z<3R6Gt{d@)c_xJIbO4mtSq8XrBP!`r?5TS^Gw zCk#xTf`8TXLz2;FSOtESiHXmhk1szULc_DgOaRtK_#9$WpQ(|E+(%FY*chr%VV3kv z=qMIG#SS3XIWx0Sh8)v&6}EW6NUjm1c{I6J+p^VWY;yh7k5-rpoW&f;B#8LGVW*`Kt5iu0!;0 z1M@YVpu+G`)QH$ktXFafXMxRmJ3w(*lU+~3zys#t5w(_4V@)=Q^NZ{o7~@2+O*{vm zM1xSiq2A0B>|^YRPA3pgJim5Z;nlU*W;lLh~}Ya47}{IEsst`4&fc^wC+>8j-e;mN`Ny4JQ(GU|}m z7!tVG`f?u-sl7MqS_dZTgY_Y!`VkkF^xu*cFw=xs96!+C>|JJj1SyMZRR=jqxye>Q zQt{%o$hh!7uG&G!kw`*G5L~r0k@FO(e}DNra-ucx`XdwN;fuG#Kb(#)goTBF_y|3) zT#;1I7W2CP42hemU@sG>IKIJu?>QQI;pM(ujf#Xq?kKEGmlC#`kRo{cAMFM^nWa%Z z;k$4XHoi7n?0oNjAE(#NvVA6Cs=`VSkgH_Tu*I=(UqAW5yv>%eVuSpZY?(~l!$w?~ zDQF!;Zu71!=Km84^15yjVn8`aZbb%T_V_XlTST&r^=6-B)%S-{v}WCj1v| z;+wxc2cjYvZZ*1_c_ztZ+Mh9dVbhF*g*|W%H;~#E0waKQFrVNyQVdbtfalyOv(iT5j2uOWL69w=BEeNyA(F8zYA zG*-zsLwNrEnx%({PEBWG3Zd;0(W*S{{?$=m-XPvrTpB2B6P zrt+M}{BJVR|NG0H_+n+o1<=Mz6jB6>IfXz4CguJgqEWA2uY_Kbc@6SF8a;(g3HY^n z{%54*-yejBDL;9hzCEj-79rNY`=9q^H_F?`zwu=Z;+5xRU;c-Hb)E?m2QxrK0drFm zE<^&-f2v*+@N8}bMSwzCuiOHqy_1}*%Le> z|EX`~VcIP$x($YJ&RPHM=l%`{O~?u$t5k$03PHQ#cEWIUnNoHt_B=Eyw^-|U0CVJ~ zaEYq1QYQk~!}{`$+(MKS@*z?g22AeI^}I{>CxGfK%_yJ@>Kh})Ap{`?+F~7uTDNx~ z{yj}S%?Efj90cLFDo~TYnEz@kzh1?LFdE0AT@=>Td|`KKT5MWF zjzg=Pb19RhSdM(N4o|Smcr239=4q?{`Kt*yc@Sw!&@w+)q!o+jzP|u<9Mm|UGcq!; zocg*)MSu;>)eDkb9@Nh@TM9h3W)*L<<**MbdGW{^z4s- zYpXS~wF#tB!$BIQAN1Un#|YdUPlVp=!#%%Z-i<1)-K3wD9yt3oP!;R6! zxR0X_x^1q=-(O>=3LW#n$?XSZE6|*OxV$X|`1KDp7Foocow$zJ15QOwTT`9g;0h$D z6uzXUhAC`nW2XDgEw*bh8%%x%cw%5WXJ@~zGw`EJ*bKUND!6Zf01h(5vZTYcp+1L8 zDswvZHZ@5vpccl&7)Sx8Cic7Y6-8a zb)anrDj!iOr80sT4z4*KEJhK~?CSVAdJfYl7omYq4GihAl*J_+PIi#1j<-I5HZ^nJ zN^k@JY)YnxzWl>((vp(0O1k01OHb91;Poq3o9ZL7n*Q%Vnv|$MrPCQ+5!|s|m!<_P7auuNFePV_o&Q`6*TsCD{%U!r2Nws(u?K_AY@4*%~&y^m)?NzDuL0;3GAC5ruDqZg5i#de`<#Q#PBZP9nOQuFf^V)Uq@1xTxF; zBIqL*$ekfNLE(Fib}UFd)ME#2dUQH<{iCATf%hRUz269NR2Wfah5}3XQ=`Wy#gL&%b+H`&;Z&vLR2w6Hg>ZBI`p@1tK~Y7^V00= zo8Uqd3;HK2_04nH+Xui^rkd#Y=|!@&#W*>g5@BmdrMqpQkq(ex=NF3s;57kv^f|Ov z<~Es)DR-Hom<9IDO!cR{F?AnbQTuW`**?T1;6Jr|f_u_U54DwY1tq&KzRXDAc3Q5` zaeiS@$uO+~uBC*i^2oz8%_>?mOtUMosKe9g%W>I@4|s4g>Ds!nRw)qnQT^ zf^%^kF2PXkrr30{=FI%O{VqW1tjNX*LAC<8n4&!z#2>pOkEK+~4P)kRnR}f1WxQ{V zJH4;BzbNtye5(dVr<2Aa7Tbd2%x=3jL(wjJ+UO3^ev>y>KwJ)+^>;;mN(pf z5b*IQ+$b>E$H(rv^np{GVXrlDJua;Q7JIQGxd&u(wZq6f)Ma!mtCNXO!`Ln6wZqjf zJPvEqH`dl?HeX%M1|ZMx1({$4cB;53q}` z9jxm^+1FC2{!f$68i7z7@&;@(&Rl{Y%%oA`yb2_zQJ=0 z?fM9N7Du}x_j%Anizl($SvbJS1~1(Qe0tN;(v;pSTLD{*fGyoLCba+in@Y6RYZ^Kd z^_|TfvpeYbQ9djz+gz|Zkikjb0y~RWfMP2v|9YAJwCBms5j2864ZP+G+bK~vdRiiK z$LA|J{<*%xWq^Ky&t`~-_k(FtM$Om{qhMP#DsGaY(lwy8{_8Aoia9?zm^T#E8MgaJ zahnkTGtyqXD6_<;8THwp3I;Wy746d#oW+hjw*rX1Ufq*^>7JW2NP-7aGb58e8dg?8 z2M(Ska99O1RNx~5T%=`UBJttFGw?;wKKG{q7zU|*;8+q&CjmP>h1J*9-L(scCs@i> znD53G@$#?poh9VkGw8`tk^sFiPdbmLg5*^=45(lOl$G#_0wye?jgDf}_)GJ}Hy4aT zyK7oM4iVAU>;pp!RI#G3F#$vaDwtA@EsCqF9n#^Q?6WPuwc+BL7CC<;SjOpITGExr z#!{0p{(Y6DQwCF6gedp07GXdxnXubDV1)-DZs-W9gwa^K1{+7o_GdUn9zUM1uwUZ> zg~jt7@8y|l^{Ly=W0l+}dpL_j*>~XQmhyGnR%6TPY2v9^E&7jff#rkH^^A_OKYV)e z1reg6m0pQC1-Z~VVj~C8gaFQxj9S2XV5z3b4CLF|h1!!+&;A!`I-36tFwn%{`_ z7kIpZts+B8{J#Z_NOt9d2!z%ZG3TQd|p=Zg%G=osv^=U(X+IjNmUlf4=^OVzn;O z5(qCaU_dPLR~q2I1yk4**UJ`B&5l4;q^XswHsWuAk%2#A6_G&R1+nPW2HA_fF;g#4 zh5Q|<+BMuEm<=AIzW~1qWkdoY50qzMRgNhdL$IfQWb1%rqsl6s*%mb*voP8753W57 zGi{?+R67htLgrQbPhG(h4vx9{j()`CoL+Al?cNh=@ojZTKd!z7@uXV&;fH_5Ya}j_ zr-5^s$j|uzIF~Rj6PXQZeab%HoaQ!6CGzYYc^-$&s^}EQArR`GQ&We+4JiT{InbFP zxbaSROz91TjuDNBnNO?46~>3w`ZHfOn`7xab$fuh1SPUZi$e?+9V+^ohtSFvOpCwn ztn?y?#XSkUe&2-X5Jb*vedHs2d$K^z7H0b=o;FiNfKcO%&wl0@IC5hAAw^1kN(rEFxb`~R$L#77*$a0cVz;XT4V zxdYoL4D|qsRV5)K6`{JFdO`bxN8vs;^%p=aMfq@GhJupK6@idLh0^S!0Og-4gZ3{F zUPw##ak<4$V!&d!g~FSdVnrd-BF?|Adr+0CZJeX|+kFluyguAccB|q@1aK^8oBqwe zPr)(cNk6wWS!*8h6@}QT47n1s8I*EI^fr@_nA!9OXv{tgESGk8Fp8j6)Lqm4)0b?1 zstv!MIPX52gtxEfh=pKeM}qL3U2LB3zk^C{N7wr2hYm_rkaH^&^IL!S4+fBp5oW4g z-Nm3VroEBCl_uBD2wfo(6Vtxjz+9PeAND>QSP4smn(IaLpjY}#R$gtd-bd30fB+$O zGpSXP@a_Y*G~HvK|7cvMD)@vE8fX=AMsh3q#OGCEUlL{PEe`lbs+whY6B_Qxx zR%2EEVQOVKJ?;*;#WdRSqBYE1(}L_A1Z+%*8Bcr-XXprche+rB!GVRWww7W7WHnHD z&w;shj@pVhKu4g-NYp&-Ks$XM%J}b$fHGn_4MQ?xA+&36FE1SGGc8)g9NlCf2<%Xp zw3UccF^6;2`8^+;BhSc^kHTbhSU~~)8xI)vu4fKkTCVzKtCjA8Gir0$X3QPu$HJi7 zLp%(_3ami4i-Bo8j63iYBgUyOoq}2l6|)t%VatSlkKi&+WA+rAtA^T4~O-=mD86{Lw(;XPSUO)!c!syjc#piYgC=SLM6hYQZ)$+mQyB&404agYagNXtwnI! z2CN*EXBpP?dfn0J;6n()O#QwK_`@VJn`J7SC%rdzkhcFJ4)Fsse_1fHtR^9C?Zucfs#F9`${_As#M=;T3s$n^Im+1$tS3^{1?av+e!GRI~y91-D!!q&24hOd5a3z z+rMtCBls~W67aW3yV~YluyQ4ql{`K8_3K5DM)1NMDLGq+&J*LxzdyCJaA^kpqRNEH z51&=%uj@nv5pX#te{Z}mxdjZmbr4*D*$^Qh^P~Yg9*cUl4fcUh$D3yl8mDrR!K1CY zcN?SmJ4YYn|M|+3<*1bhdwe^3g!NPyHp{VcH@1j;)!FeF11qsG%Fe~ROn2_zhdc}u zke&n0od|Sk^%;FLX)1Qse_cP1pNH0{D$ViH6|z z{Xa_^AH#av;SO`OHh~3z%sh zHBkbeY`MY1X}lT#zsMZ_%KM)(N9O+*nWKLHcq;Ii6A1qdS)>{+;U8SB698!f#QH3V zP@a4p9~PoX*w=E^t5g@5BBL_XM~4r8C^bS^mL?Z;LylVSfvX(R#hYh%Yl9P#_31sT6{ttonHW@9M3S zX|!-(10kdMOb_bDc5SEhyWz4~4TI>6vq2p7a(N);>KERa4 zRId?LACQVDUXkpp4&y{RfAHrc_)X(aRN1Tvlo{)y5e*APeKyN9kO<;62*n;L6fMpWQJd zX}a_HD~PGF?fA?i=4n%f-~Zt=5X<~P^YullaN&GE_N!E^SJ4k&-lEug{PN3}JJ=)V ztwrSQG2LVYd_KRw`vh_@gK1M|6Dk6f+51m$sesnFAIBnx!Jw_zx=>` z8-3l$V)>5&=|IDT9x=E*J%73Q$#7eZkbuDGGKty>6i5;q{wKu81G?IY-Cz3jnQwhd zxov9mI3)Pa{RhosV*-fO!2KIomQ><$)>s-Y4Co0S=c6Z`Dw94DKlsmkoH=bUl3Ou) zEy)7Gmk1P)tUsUT(^9pKjghLkrwbmchIU@nL4?uXHDH?W@nF*Hwxc9AD%f-NmWdjbOAwu za74T7=J=C)Ke1oF>Si3}Pimy*}a#56BHWy7VuJe6Gl(~_3Fo>xx|NQ z|A`!kXytjZ&=T;@waT{4_F#Q1K>$+b@ao8=PK!;uvGE;P6>fk@kE2YnAYq#LIbWE! z)A2On*%47&!bG|G;rJ8CVDzhrhDN|Noc8^ldJsSYszO4k;=}`8={;%bUR*By*AN!g zKatLfBXo&TtUVSWYC8+3sdCLc8|++Rv`Ef7zmaYK4AyP~&AZ688=F!-qiZ(NB}_b5 zHN2wae5n#!4&_-fWqkTs;xc+r+=z}v@Xp*Cjp^D zeCl6nT+~53V@~rfP$GtPZ`I>{ zBI{2@IIs21eAk9kaZF9W-o1CPYxwZ8lS4xUNeKZlzF2wLME21jx5g7EKkejJI}$dZ zcCQhG_0Ot^7nB^713LXhFTjkOoww^$Y9iIH5u` zQ;PXqQkJ)-?6~er1`2P61)kq@J>lR4Z_#z_Wq4is^QRJ|RDSIvX{AB{tI0~zcDmhH z*x;O!lPh~OoLus(Z#0`-S9kd(Ir-dXam3ct*=*oUkeASS*Q6ji0Vb}!;#fifv}j67 zN(H+kHXZv&lRqu|Fv%}>jaS1=KkK(ba?+=Appii&YBHpEiz1!uE(nFv$j1LuP=Vxs zO1u<#Exlw>VW~W)J?rFakChkQRQ<$UHtJpfsnxjxB5%GM-)8ji*cRwzZ95;6cZ^q4 zZ@E*2=6?ahXz-7c=N`t@n7Mf-pbT7zMn%l@ARs+RiOHOIc68hm?!MQDgM*V@!T?JU zrJ%UDai|oDN|8>db9)?3%WM`Rg?)+Hf)r@RDMLIU0YYg>rcTnCuln&{MMXu7dqky6 z;0Wij04CUrF>4wNe-` z!{@%3yE&FR&c$z_SW{4_2(6P?^XT%wgzV=uiR63ZygRS=#PeTpTs+ zD&2^XXQREv-HTi6s>bQ>Zd>hoLjT3t;Hcujc(pm#Jw~;{QKWQoJF$`HV3RwLQr-}; zJ;=z&*zYYeq>6=0`}uhu*|97htjWgms5T+mOSyZrcIzA0Gj{f|)z>kE<3CJ^KNC%^ zd>~u#^F*(HrTPXn2Y!7Cs@>)byVafaSa zkks4{M}J95I#8=d4hGJWmX?h8C7o(9{n$T%Fzd{5MYV-8tpmZ8;BM}Fc8CuN_c*X` z{W6OwVe5|^XU$HK&^!4p-P9yl+*5BzY!LO2XP=$DtWIKN^EwPZhW*hW3eM}{+lDq* zqh()t%S;qpzl~MYx+$;xGo#7s@xtT60#_QoTV}aUFAJD^=LyUB?gX_^aaZC{t@rGF zBtc}^fVtI3eh;hS$PL7VrAUYCm0ZT1o}RqOn5dxOV4jJV-~CCSK8<_dQ^ZjmS`4Hx z(I}g&*eonAT{wzEx}@BitjIl^$o=pfiHGR8B8!WLlan)^+v$6GFAs!02sPeTH=d|P zfdm3BF3JK^m-V<4l>1mO*x9`~Z>xi85CMoa9zZOM{IbDsmqr)G{5G0F1IPyM@YLKUE}4?}*55E1_UIjK7Om@>;F_uiOYO^0tiXh!qtT z-B-?|36ov9rNU`6-oj;%hy8?rz-Okg(SX=6l%kVtLn$(bX>LFSi$cbiu8t^we1OF! zc-VaBO$@q;egE+2{%6}?+>{*OO(s~gJ6s+(>`(uglgn3^y^G|=dL;%UkPJgRs#&t+ z7Bm#=H_^V+$+TW^JoT7FkMa(-{naKSxvh{%c%C-4%U*$$Ugwmv=R4GGH^-^BtX6vH zEq-Z_m#qcTPO#+uJW=xaWb|7iGW|Aw@dT^Pnfjd1S~kQ$eMwH32&b6)`b!V0%%`m^=iVC(Dz1}*zxuZ4UZ zMQap~R&O?E?*?7P`Low|t`}V4o+?soOlDF+-j?*$@LFFLiL`VOo`3P!(2rVjf$vx_ znA!Ft%7=(FqN($TPxp`#JjOp{K9BNC9W%&w>q3R#XS+XlKrk+f^R$PSKbzk8>JmqV z*-QdL4COklH|o@#ou9&1=JAO5Dxg1=J9M_M@{kG;q%@NajKNH`2fuIcrHh|`W-rEm zOc)nk5j9i>?}hm0*;&-AC%662PWS$d$wF0Azq{ZH$VX>N8He(vF?jyNY2w%w%OYW; zrsGAi@>0u$X|Jf|sC=&SvTjkK;2|=^u`o`5vR-&+o42hoeEN@Ir^VQ&pW0p2UGz*N zfw7@iGg|X?I0;C2e-22#JQS?yN1nYnCCrf9CA?yHk-0lqodHi-B&!a#g+<}hL(VVP z7QC0Sa_vRWog@nO*(VDtcvPidFUms0(y8ZO>N*LIy3&%N& zQ;`XBMp^N`3WQPb?;oF7ktX34kWl++8_zCC(OqM9|W^MB>f_6DcNkMB2(ps%*q*yjeFOx7nd7RQERo?gN$YgF5qJj2ni^b zryT<8Lx)YO3m+Jnk3U>LFRFB`$xZz@Bi%wUc7L=7qj%c9V zujDq{eK6!*=|eR`8UacCKEugCP0ogV9cEgb3ak6eTtOs%7I~7~copgbMk}J!v#8OrIu7H`{g+lYd&V zxdS)2(Cm8V)?{s}O6K!)ZJR$%W8)=TeeD0$ z;K3KM7H5VEJnh}{O?30)8#g6P-xs(OtbcF7Ij{Ib>oJqla(>kB9oVwEJ z*dy<5IlT0tx2^q$cNsf5gMyP)bwwCTdtW9My0@Z`X0RY5kXXiouQZ191Hpc)&+ae9 z+Su2A-k4+ze;PlXNr(?;YOw_eKgPZ4dj@xwVoBW(Z98*Gy*kD9QL3oHG11_R$53b) z-FxtP3JU6dH5Y%y{e((^@6b-Tz?P2zEDERM-8`S}On1ZGF}F5PQCE`!QhR!|uiMTu zh<~(#{%lsEzMDDVOE9VE{=ph%Qor^D(s-F8<|e6F`15(`pN2)uJUssV-&|f>kD|I? zT~4Pvji@8g01!p*o$P{m>rj4NFGY#Ljv3$2@Nu^FT9Lc$sX-j9gGYF$zK)0Znh=@= zsk!X4#X^~Gc%JBZ-q2-GD=|j^QGZ<#JU$wyoXWuz|*R#6oav+jC(Q;usZ9t1GT0%cwangQ1*(bVG95O)>@W|CSk7Sro3 zX?O{6|ND;c-TLFe0I<>}#)X(jSFjNFB@x0Xa@v-Zk8@4)^@p&`kh*w(uzSX=#qGRY z5u?&=863fXJ?oP6BAF506n~GgN{F(FvW|M^$>n>zyWyBc(5WN6To*4Guf@UV#CE|%P;ki0lucta1F~?)*r$f0z4x=n% z*R+=$%(x!tVpFJ6PpzXt1F-<6A(9NBOvM+oYP2wJ1# zaF*2Etz~vJ?ZkD{5?N14+411RUWMvNP8j3AW@j(9-i`jevU0h8;T!kQ@aG|C?>xKuN#u zPZSgsuzR)x!fJP9VL`!%mU1gR9&5Si;aR7)Zz+q~(X4&6t#%;#(Qt9q1D+D~X!q~q-<73ImIySuth=JzvUl%r~J(|miHuzp9qs0GWM zMtBO6-s)KJ(Wk18UO+nu4;IA|ydsE##Wtf4GawZyfJn&v=nr11I{9-3WHGS?CmCIV zndzIL9={2V+RFBn8zcu}*l#Dl^_GDc5#hg+1MTvW0UFFc67bC7-F`E3sidqt0MNL+ z1Gwb>U(EewRFv)d28@G+h=2(q0wN$H-3>}g3rHhKgLF#Hpol1`bR*INA}u)}-Q6kO z-T9v5^Z4xj+k5}l`hR#oynb@6VP@{R;-;ei>-Eu0K|>E}B`~e-9pC0Un2^0TJ7aP8(fsLW1ekZnqnrX^kv;WY1SySGT^V z!!%=Ps49Sx3_y~q<~1jkzvSfPqyPtQ_I0gzA%jarH)XpX8o@@^RdWrS|Iepl#(?LPDalO>p~8aL27~@UQq;1({E-M^e&~Up^V> ziTNF=+WSo|sJk<)I@F!+$xoNCC7C~|KTFE*|JfucR8=EA>+xXz^0|tdCPK`vL7`qj zjq&3{5MywUoc0Qg;W#dmMTHCK<>crW)66FN4jRsg);YKVvf|Gj4y6 zh5zP(dS3X~Xn|%mVPW za6eSW`8=0j{D?c1B{9XH;2yLX{^9TALrWi7NIqBT78G{7)MlFnfUtMoH)*eulFGLH zPJm(|Mydr_sL4TXi7r5E{i1#?E}Ao4UxOGX@ZI+TD9CEImHsH;aGtZ_S$gR5+&}`^ zudBbN3JUec-FKC?Pfo;v)^-hJ=yXt$qV2vbpT)hN^qzZkOXT(oY!zjW*fWgL3F_~< zf@ik{SG=I@14UwpZjHC?bR!jd*#pdHZ+1%pkCf-La|UyEb~fGff{y`pZmp$7g4STZ zy}`@XnP-gy75T;?Sy~g_Sec6#%Him7NkL4wpd}4(4JZJ#VM|^06h>f`$MO5UeH&eb zW4(M3^2{mab{8t5D!ytIn0bm{L}*~kXaXf;=ke(F^D+m|5f_K{0vW7J1a_0aI}ApQ ziVKt*|`5d}9 zMVAo?V)QS&QZSM0itkr7)K9@DCynEZh{KB1v?m0p|SBW{Hj;KceCy*kC%R zL98Jba7PZdinro#<%{jqO8KHDmUHDAV!hvAoP|v&&+?D~8g?$*9Wp2#Ctz;?K@`&p z@;W;I;@kO4Pf=PFKYw<+*v+0(tQFAPLJF$MqoMm#GnU(TxhUTw+g`*9f>e{Cpv`|C|ys05;;qa#?Bae7FLn^cafr?Qe+PrayM)AcZ5 zkOF>>q^>SY6GAI7k2T3$LE##(RrHUzmcyO)>K_AKn7Sd$4p71SfK>#8R<|Jz06#e= z15n{6ms~jeK)d`J23VCU^hDXnc3Se9Y|KhNH`LNM>)YjcUKsV&bzibM`b0Ri;5O6D z+9wb2XY!3-MLro|A%&*H(`Ee{+lJZC_3J0+hI<)gVq+E$33ZlSseV(uZDc1lFTcP^ z@4F|xrY!m7t>(t|Me>|q`L}p%?xl;&!lyNBb9upXY4iwH3COp8OYu!GpN_ug>9fE& zyY|cDb4PoL5prpHx#*^qkEah}9EO<(GBPitJ^`o;(g{z`r1KpeX#;ozR|yCj_u9l* zjVqq2=fA|Kp}Dg*(4>t#ehe2!$-GUQtBE?!FIlAx0na&r;Zhc3*e?bPwQpa}fO1_b zW^kKp&ZT1faCqY|>#dh(2LSd5TMKe9U4iHTIIK9OCZ`2D@V9`Fl1_+|Q+V=gxTq^b zHUF)607Wo|PuS5D01r!VvnM@vWBl^v9=Ge%T~pkpw6KWr@k40ru2Klx_R*;PiB^i~ z&z~t+?f*I!3|{HiZy#KN+k9uyAZ8x$(d!NcMW6!W1kpWPzflA_f)T?X&);r&SSpJE zlDvZ-nFH1khg@fdsZlZnS%Ay6H54y~t&x!oXRCr|&xbSHUK%Ohj)$BMw5|R3HTgxR zTYr23o&wFF#WIRB+?DQNZ-tseAe40E0IfCplAyP?Gf)Sb?cmSht$_wOKW%&x+ze->lVjrqtj3 z)b_ggNckKeHHDg|YNlQK^-CvX=(~4I6z3dgiw&8+-4b|Heyj_inCs2Qmnn_ZgS785 zmsb&}7Y@Zqk?AT~*zV#3HjcscDPPa7?Tltg%W9W6c%J!o-f8VFds9Pj-=)i?P5tX+ z%%8_z+;(BFYHp5B@9SjbxA09vrR3SbVj>L>onngH<1mIYCf`*SlvUI8R-6Rur+y02nrGiGiSN!e{1CSk}yHyGoAX1n~g4D4eiu)^>IV9`2r1E8P+YXXDuAf@D_?MT70=#IfERj4TC< zE>YixWRf(fChQ0bEE}3R#}J~sD{dwbUjsCh37t9NUUSu!RSl$4KI`_uiRe`K-{{n> z6da7gSaofhl4;`iW1Z1aKGzxVGfQ~Xm|m^9DpdNCZJ$Kb)*|%61BDFLV(c73B~&c+ zb%Eo^ld~o1J9;h=mk1deCp>9!F9>W!bSkIjTlB;R2;8b_|8;MViOG^&x4)&z z59@T{iMH=@vZhZ|=Z+GGam5ut7ll_5&z}*kTE2#0}jiPD4*lZ|(Bz2GE?oYx&xzYkdkE(WmHW={PWIvymJD zp&rsB-4qkx<_gT!vI8Zd_k?%#O0Ec%I_aC8zJgisPiSYyevJR6u-n@eJ;z5rW%G6e zRYLt{JL>)EQ{BJ|QUiY#gQ6IFh^Kco3Qi=UxZ2m*kvr%SD!pNG9;X8}b|`&d!vhX4 zM`d+;qu+%tcGdSYyuD&cN;Gsz0#iJ0*j$g%VjmC_Y4s-zahH^NIWn(fzc5MbfcU@n z(q$a!by-@u(J%w}SySYW2)V*23WD9a;WXmiGpj64gM@H1cUj(h>-dbd60{yP5+(OVF+C|E0Ts^8iz5XsLF7_Pdft7CEel`}Byc(dTs3G<5m z3Yp>wZj@4%3|d9>N4bUmU-i&Ea(NF=5$m^C2G-PzhKQ zRFoM1`MS5nllCVt-uy&=4aS-O{>g70YbYsAzBBbP-V}P@{Pzg-Uw<)iGw9<-AqJ^q z1@gD`(dYgngOFT{dGPWJwKM7$b$GC$@%}$YRjPaK8oQ<41uHKxYgf*P3Mlycv;XVR zq^JB^F$8RT0)ub(A+oRB!$KeF|M{$mo7dwmh7uekS^Ae$8lD^G?1O7Mh4H_>GKfu8 zy|jp^0^^q))mhc|VZQ{+URBo&D50Lb=M4RGoy_l{Uac2=94mHI;=7F7fsTZP@0;)o z`M73igmG4c?-QRWxz@W=ySb0ZQlCOkpWJkKtHxuv#Q(hY3L^ym5ZJ8_;;8h!;d8uF z&4|jZ1h@#nih(w;v}{L5;5PS|s@&o{p*X((*Ei4yeoS;q*u}W;-jR-|La6lesmZ^7 ztD_>j*?7&|C$d}!WCgb$;q9;adyY%9V25HeF~zK;A&w=E1_pWz${p&_6fG`ZXYJ3-F$v1eqf($nTEdk3x>sgA3c-nB{kb zqGTwYaDCMau>hjlvWgOT-hQ75`otEDUPiav`fKe%rFY;H|6JIq?>{|#6e{xX3J4rN zn;sQ7gdh!enA`$POEW#&8aK0tjbfw!EljN*Vj#b2qgFm3^+>#KA?zZ#&6{EMf3E7( zcbLCm{2;rL_z*>Qo5G8gkaxSng*r`gs+o;u3c&RuLpO|N3Q(@6`|%`Jb{~p zX)`2wkadOo@tKOhUcE>zf+r;*p#v=~#4LV##cQ7cmUwU@`+ze##9&=Y8u^SV9DaN( z1Ve!?KJ~vI#o!EWoXtWCir!Wp&*1_~@$VY%!(>9;|5;45&Oo;cRD{kj?(iA;Q$z(3R!*>9@TU_@YgZW3&<1iv2#lOGVedvUwa>0n|cDv2GR-+Wr>_~c~`ha{&gDu^;eW5*V>(LT0YQ-y0K)oB?V|a`Cq4d zLR-fujM&z8IZ||e-MYHAb|L?t`|Ir$9&GGls?THo8LGUC`b*{p*v4>^|FuT0XN8}% z+>!hdc5Xb2WJndtl`;Zuqor^;uxw+R6eLO0{;L;3AH%x(6W3TwGo5e8r<^gF_BnKz z^dfjp=4UGMU-l*e*$wnpZJ&2t=2g;r8BQpb!B*GYjKm*exaK>po|}O$o1JBdWclfK+!lj6amwg zX?u|!^icjoug>)6IVCLc&xLQ4VgS6>nJ*>hO=t^j$#=-sX#J7m5MUX!TSlg-voCh$ ziff}^gF;uLUHmF|>Yr z>*u)M4NUBffvf|Q6syZrOZuun?@fHnmTJVO7=*qAYIK^E*p+15kaxr3?mMZszvwEbAauccA2rxzwnO#7GHnI-* zO*V7i1HO*H0DphG5G-N%pM?=R z?pC~6y~~P7j21ty6d_yUFQbHvvN>U%*6hk!MVo(QKJ1EMvZkA5j8;0~n09*1D?3*1 zCWY!x^#%S`4(sSql+D7ify2m(e8HVuLxvZ>NfiOQ9L@FxSnT= zR4y9z|D0NM|GZbJWu4K@2?H1UGZo;s`)e{g&Q@>^63R|8v}0s7HR-I^ts(FR;!LE$ zs0$Hv`b@SA1=fHV6O)r4e7Xd@zDXaIj4t>4!RX`G<#NN2kPvp(}G3 zf?>YIYS>N9#a*=4lw}%H0O-!1VdL%%fLmUlb%Dn7Nf{6B-chc^{F%dKKE_9&=-hkJ zZwy1XI_Nzp;IcS!mA_`Gwhk|5eeFRTKo7En&w4nwj;}&i`zPRy%)0Mt zq1B7-C##B|KND{fHY?||C*faC0~74))YA9v-8-}DaR{UuqSa?#e_~aM0sZdh0(;u) zj4z@-%q}x$CMI+T%8aN#NJxO`RrqRoL{*qJ@+auyI{9p!2i!`**pm#gCdhWXYej^O zqriwm_BPK9@ZJGp1h+Ll6ZLYQjsBr7h*pGT7p;8^E5l>U_bW%&3CU89zD-Vc#RZY_ zJ11UZFmz~+h3ZgnB6ci2~g#pY8en#Zn+>n~~5# z2HQu5FilirC46CI>IKd6+jpJ{F#d|+wMQd~t}Hsf3w*yO6x=lmE%a{(vu+>hH5S$O z^n|3&J>ak$O?`;fdA?A_No$0=IXKG2*KhfqzESBu=XCdBQ>(p;@_#%5c0?6=hhm!@ zb}nUuoIytUjuo;f)%S!mhnsrEzD>e&lY~RhN|eeR{iCy|)a+_EpJu)3yN97!u6f?f z+&p5l>N2GKrvH9AqDLux)-jq;^eLlpE7sZ8*^S7>`@z+VDS+KTv_fmQWqCD>5ikHe zeaCoTIvxhWW{0-9fh64k+X8r;(0FDb&*?0HyiMQ9$rI26Nv-q0><{bNPYpZ4i{t^vMuod(VpcuK4E_44wdgLD`_t7E$rdP?kec%n>dDM_ZE z2!pP3=SPgT`tgG&U4dm4&N1x*8Z30;QiyM+7XQInCg&wAsCv(QcWSyoaI(h=sXL8q zQOqR)tKHeOqCPjO>RzD`A@a4gJ4?PnAm~VR$=b=uGQ+EvJ*9o^{ex>-Gg!^)EQ_F_ z3{jQcL#3}mAV3OZNDr7sn-ais2gHM)r$6Gp;-QB$)ipI&?_5jN4xxuZuU>!q)ujU$ zUcoHQ<{9l*sSBK^u>z__hK8+yamwgQkjixPz>iiFWi6UT1*4)%FyVJt8oUtB5gOS^ zP|=frmxhK0kS|H1rpr#2<4nwIRWhVKF8x76c z%8%0O>hi(Y$iJ&f&u&tC=4)skBsR+diZ6m z!eTyDDH?7is0$Op*Pc?K?d!&dnIx2AGzy6iY$@c zgAC1Gwz0W}cAKC6n#6Ze89578Kl){yTze@ zj)CF4;~rD^GH<~~AKo%$F^o)U!z^DMYHO(NY~Jgcw3phVKXkeZdI0IYEmI75h^o@% zSwYlX6M$owMjCVza9#k^Yu2wXe13cSA)z}>F%BS4Y{&9*dXP4Yeep+HBZs84v_4p~ zNyqSc4CXJum?G-DS>q-LP$l>FxS$Lm0b&`LwO+qY+ya%y)?Cly?LBmWbdc-*M(&G_ zJ4)Zj_pk+l>iwiEIWu_N2&g&Fiwmh}Xe2_8Z;+6P+S#!s>bo(y?X8hRMB-goCzM9h zzG=6BMprd=#Rzz%&!%;B2HmM|wVjv))CU7m^!=?=zTU?UqOsS8E$TEuv&mb)HrS~{ za(D+%=}-SSV@{waBGSKEF6o9UT3+I|>leo!Jp;pVTTpMqP%1t6wS!aFwUs0;#80_- zTSd|=h$WMRf%U%L(2Skh>j-Apzu07Zvt}cHF^4$}*pG0f@QyNS@yM-eovn{+dp${g z6wZkxsPQH+TKlX6mhhqC0i@Xmi&;y<+bKJ^d`3Dtk73Gg0^9ul#`NT4t1Di3PPzNL z+Db%;p`oFWTt%2A)&h+x<-L30X8&q!XvPo9VeFwk%Eh? zaGHVvWR6Zl0F&9kLDa&J9=|XOG2D1`lx(_sP@NoUHemd+aRQH5M?IjpI1j&?3v|6W z$OH10RUT8lI9ajZQi7lYx53Y%hAdElqSq#>ABU0$jI?~B62G$2T_U&3MfLturn|Y zCguAPAeKOm6u^oVaLc%zYcI`x8gBCq^TE^47)GteS)5>)C?zE1T1-q)kvA*jg2(Ea z4d!UgwZy`8qfyQy-xy0Kzm_)(cmS~sJ->j6XD)7@b*3$Hz&=1&O95#0*Meltu~Xu| z8O7wI7YHp&33Q_GT)ml2PRC|y`#>oC%d=0E3hr}vic#bHTOG8^`M0>6oAWyMnnMkG zI!33zmE;Qe_p@E6+Szdm-#m6TGq=q(T9qX|hb3RGDf;g6$rWPaAv-Av2jj8xL$lKz z9n3In7ij5xPo2}#+kcn~o8uwTX1g)lWydTm2;x&%*h&%*&sgC8UH-98iUZ*sIQ((d zb<|I@EY5;=?3b5VgZyHs2$rCV3YVh-le5Z2HXUFHTYhRmN`~a|c6X0j+8vc@A}|N! zo*cP)BIRUO?z*3*IZpzx`!{Jvhxy^4$7kPJf$=QJG5nAAH@o2N;DTM5dWt(az-nLN zFx=k;!^B28DMWQ^uRlnnm`rERi1`r-If`(7jwvMp3KmSTvyZbfxu)8{?6J(sp1xvM z+gFia+fXv>p%gG)K!adNdQR}ObG|yzpDqDgA8iM;w)T_(9y5=FSTuKkp|J0}jvi=w z*0#56e|Els7MInm{vw(>KKo73X>A-4sq$u~Wk}xye>{ItB?ppik998*J`{ps3^~3B zCXgzV9hqMt#tzc8q_~hLY;Z|o$dh%>J@=sWb4z52^YSH_d2Up$$^W=XCj#$+>AKol zSG4qQm~2ymnG>AcPMO3r;0EqJ%6|y_7cIEg;M2XY-ObO*fga42YwA^^TgfYHE2}B- zGAbHBiKtA2C%OvP_)cRWNL<&{NF0X8mzM+;Za9%@$7ad;?qkXeIgUpAIwx$#1f=^}BL2)8EE@bpGMO!gB4{Hp; z8Igb(9REZU&_~3fkLCvU?=9XQEOb*r4L;D*bAj?5&Ik+t%vK1EqW_ummvTV;8Xfa| zZph_If;a*gq9FqZb(Rq0MgRkcDz7T>%{85ipn{?eh~d&`i{Ya zi|EKcVuw?*1m7zFW_>e9`L@J`79*e0TIEIFTdcM?aI?Gv4aJp>HB1<(8?}u-2b0`) zQf*-^^f2%plZ_D-5#i!>H~~DH4VRd0rs;!X1k*YajBB-=NS00gCaNWnrEWVN$@VVy zT@P*oQRIH%bBj>An5?DeJk~!cPdHa7dh}R{5A9eMkR-yWxbATg==ahhEFv0~!r2Wj zcm2MH1;&I~>47o`^d{q;ul%t7D*Bm#-_I9!)5pr+)FrcGk30DuPMUf(19^hUyINt`O^r-%Hr%77STw>4_3c>-yl$s8w>yV*B};aQV3Jy3^N$sz@h* z@$>lX=ht$yt^a^i3;HdEn$+pidn0tet&a$pzHp0Gs*k@ zr|5Hr+;+&yuV`geUxaEPb^YcfbmMJa7V&HZz5@ZBf9cMqi2%=eE~3|peJUSh3vU?mhm z{iQ8?Al-1OzkCuOq5eJa^|9C5_Eg&s*Zni(-K@xL%eB#rW%RHSq@DNgdp9UjKMeA$lRLmikx)*Cm&c<8j-CXYG_9f*Vp6iS=;pQz_1H&+n zruBuKH}J@J$_VwPYDqP$`NEQ&NE4U7gVQ4M|GEM*@tyvbqdV|XpOz>;FON9MuWSn^ z(yKIBTK&TXKrc%AbDJ5IdUes|d^=9JI1z6*hVpas6I9wxAOK0OVUORbG0xt!puIjf z`x?eKmA;@z_5~(`LBg*~T~LX)L(z}c)j=Eexx?6asRt(5uX61MgfMoN$7EDhZ^?HI zZdSs)9im8U#~)V}Id2D!3XBwSExZb+YC-_7W_kTPY`)4_dwzh2C*fd_@!7eP@aC@` z0?Q*qJJ(b4=0jFTV{Ix$+Asr#<=EJ7=an$)Gko1XTAwc7IyeSF3uq!9ZI5x&Coo_B z46;5nRc*j_;TVb8%x36#xReA!NVc7qt-XRAH1=q)27)y}wm09U;f83N8?3BRD`B*d zT{r8$#aZ~XIri}R{Q;CAEIv_(k6-VRZuDkdkS3PO?d+|sy^V#1)f&xT15@aRFitWO zUOR)qU^QQo(@#0-^*$`DtVY#ddf>!GfLw0o>talw{75rf2=fr>qnCV&)GgyBmic{m zF~E*M@wo>^|IjQIIXPzEnezjACKLgrUW$bdXQ9#*IXS|Uj{D?H60B@EOQzV$j)#W_ zNVozpEq9g<(Un{|` zI{G?FLkGt6k;%ZtWDN`tt`4^*W76&ZNQX7Zq5%F7poWxRMiCGaHi3#a(Ijak;X7PB zhvQ?y-rnA+hM+K@^nK|t=CbY#0J3fkK*ONbfV~Km7F2gOcpnB>c7JDn{rXkNG4>+F z&U<>ECq_O`$-_jmyg8|Iua!D#WpFReg(Vr3S~ z6FT?_IWTaXX^naeB1q$&FPWXa9UU~!1$nu-X}6V?mBmIA3WggWx>+4Hg0VU4u_=g} z>#N$I-go1Vakf|N+x#QMe6ce;Z#I@4;%raMWZ(Jf!kD7EauG}Uz+DCgJlb^4#hRJRavoCGIq0E90t;QAXNjsHja#V^xZD29%*7-~!T2>VkAIq`4U+m>7d}h17DSipBawJ^erScm2e2$?c&ps%chJ3>jxM zJ{!W!+`+{S`z8+|L!$q404GKGyg?x$)58+;dUq8wO)7gq-(ac9JL3qUMF1Y*6(Bvh z1~(4a7i^_t;KKOt7x3`eECKDa!mQ8Si`b#VcqYBKXg0K@LWMy@MkM^~I@rzrD zZ14klZ%@INmbKjZa2C7>2ZZg+P+Bh3vN~YLh`vUMp;8dVHm>id1ch8y0rA-3+;Ap4 z2=WXzSBVDzM?+tN*s_vT?Y1BwMFtm`7&xHu8qiHh7sf8n38wOz_A&qp+`zILXBAUI4Zwj@!X2d5f)v*5AVF ze=Ka_S!Vn214g@sYNdK3?|+Z)|$UOt}8l1Bw$7f!Qlqmk<&2Dm;uJ}eLsz- z1-@7yRH_^pxM|DE+PN~HtY>V}QSoS5#53K8_Vw$uN+rd?a1Et|2 zTaE2PjmOJcUSt7>no6;uF)<`ywp0VI257WO=PYA^`Pdu4jY&ywsul`t%N~J~5pY_n zNzP`uL0TzfnR;brWn0@Bkt5~ND92ACK6HuVQKL_y9yIq)4#s*R9k zOEGB7Y2YE4nUUVJy9T1a$)>Ej^iWG_+&j1NHeTk&VUx8owPzZ5mpGjSMPFrxaG$ns}%Gu`vDv^N}Vv)Xv7a$$+y&aE2IDY4`ff7&2aT zv-er1x`%0B7c#W@cg=3MbvOp%=?i$bgnAzK3~U@Sx|_6_F5NM#Z@N8%OX6ZVXn%-o z0NL;vi!p^|Q~X3?FSPh2r&Z;jId_`mP1z~y;QQjC?*1}Q1PQkuIwzg2*x%%Rnl`}; zs*S|Tq&v9@W<>bOG7+LM`2wErFXV6l?Ab6q5={?H8zAGEnVBzn@@lr|c zXb=!Y0DC07W_A%^K>GhvL`m}hhlo-x_uN#ZJ#BrEcp0Vs;52^KPa%lGCWGyK{viFu z`&-6*itFPeSiVg*70E}}W&pfQppLenBcVW!ly_UeNq}RxpOsuh#O+&Lm&`>$5aN8^5hQzOo%=z#!2A=V{t7V@M+fyMb1w zx$ur$VT%qdd#tN>T;tBhMzk??)F;qTNd-gbO2qsb4kG5BP(u+JHTUt4FX-%eVCr`x zfhKoy`O|8AhcT!$!s4G}x*hiq4o)cK-2ycO)R_7Mc-({x-r#Zkiwcu{w-6nj_-le& zc#X40p3D+Pfg)waq}~|cX~^4plO3$;i=VUEpUT^2H9P^fEOdF^F8Pti$z@&~!KUqbxD!ARAy4D$6n&*#_kxhdpog&1=I;j;r&hW1^U+~~Kr zYq=gzQDHvf445;WWQnVDldR&l8xE@YFJIpr#wNG93PFB?XS4CEZpy!Y#S zp`^Iu}5L7GQ5TQWGH1ts|W-palQ}A--2e;i=~UV&yEZ?USGef$?ObeRj9C6 z*=5D=ctl48ZqC~&lG87vd6DlR?Zjp(wJ_dQOftkqG@;`GPd4!EG3HVfq^*zMGRn&b ztgjirQBJ1Uy>gw#A?VfC#CAua%;g(-LgUvFeKd38&&p!4bn1BR_-$Mm9aF22o><)k%mnA! z%W)t*6~eAfo)khACFJy~6yJ%cv%C8>jlcgs5$BFA1ohOfl=0qls--YcfOVer*H9Wn zhP_|c_LCy4sQ2a`>Pu6?&r}vabcit-`<8oeHH)M%?Td^PsrljNl{d z%%?t@BLkAafbDKXWZF>DR#!Ko_U_gGa>sXX#9N-VvydR*br>9rV+7HLe7 zZY0EiZM25&{^wMfcx4+B>qldRqoQiQZ z-AkOy{LN!?POZVS9R)^q%VjUymQRxa_mWStvCmVFnYdHXKL0&0hb4n7Cg#5%qp<2p zV_atD+jKd2nEEsx*s9uG$rKkEKf*m}HTRvm#yjL`Mp5Wm4$jJ2%Xn@gYP=W}rEkUPGXYeX@IPonL6A7}uIU=Jr}X z0Jo;I@VqK^ryVd(tCsL~CcgukiQ*i)$dD0~u zlt&P$ocQFGEv-1XYTk_Tp(%D)c`X`w6?Joj7Cpij7SB~qpH64I&!W3$EKKC??mpx` zpRdoVSY7l0U`b}zUSqbc`JTA9)gu0JYwU^Cl$2Ieshr!3&QC$mN6P0r-VBT8(T#QN zbyfA`Z&6{-JuX~MfHEpW72IfEof<@&TUFSS0lg#1I>GQA8)%);(SI=LDn~TFNGLkw zpDT-lev<`^utl8#g97im$vOGs8}T!Hv)#=1D9Acct1m=H(AERqDtVu$F)6n!m;N zNKG7_PTTk}V8SIW4WyXM;$mV7#d)-#MNsw~?}T6Ln1GLA)Rq(*KtMp?%8fYlEvbn~ zXM#`@h3NTc)ZCDE#eR|P?lK+bj0LiLmq{^2=E-i`;l~u~j?2?|=53j#46Ne*j*~#% zEd18Uk^4zpk$_RvKT3le!<)cbXJ+fX_aZZ_XCFTv&gH4o(bI36v}qY;=XD}wo{m4c+qPnV&lE4Yzlroc^&+5Uu2Zl*v7lxez(UK~uDPuOQ&>W> zH_JNilW#1EjR(|s$g#(7LFIxx9jhI<1Z10^`F2Dc7FuBzl(ea)Qa!(Z@y=@6@FX>w@hsg@rj=IQwYx0}xc>n!qR&;r8xhbhK}P_5z}3 z7}-5+8Y?0gj}Ccob(`YheL6=~yCxrs+?sD(^=uzOt*PHg2D(y*R#y zOp#+t(VDwjL8H*i+T!PLxGJm#%T*&-cyled+ybLXFxqZQsQ0>`GGAh~eka$c`M2Pb zin1J~ z=jD~{yv*_rp9Ba_xm^2g)|aLjA4T<&0J9AJMcx}2p9093-3Iym@9>Kt>W-j?`2@q& zoRh*Hcf|7&FMJBe1Q*LYBqT+Mt%qaeUjeJ$;BCUy zv(&d5jxSK|H9wk32sOdX#1b%CQu-G0Fg!^FBJ!THWP<)c{Vmi zvo6+uO*^aDhfq+sCxuX}H;Qwu0Yk%e0ay1FIla{9xp)>9)394c=}sN}$eu)t!r;wc zWMiCxBhdB{YppI$rc)@B;He+uhOU!d7%#l<4~tic*^CrXuhW5-YN~ zX*`;DGgj;HazY9?rl12Sp7WHwPD;9&(sty5I>m)z0WFvlI5Fmfi&#_i~5BpRK2j@El?kK2uJwOd}?+1Y_w zx8bL#Afz^6!9VkuC}`0+=s%|GYt(;w*J;p9y{aS zG-!(vtTKuVh)1F-fyj6@rZrHb@Hm2P+BE2O$k|vIlc!@I9-~;&q_d%8oL5K*#C9#p zZuKKC%6*Bm0wt<)=Drg1^b2n)DZa z6ffjCV9BP-TGMIZlbxRpd?`#2a8&BY7$ku&9|qS=t1l`6Ct^ic2nY->+5p*Wqedl; z35M9f`|-`pq{qZ8j1aKZExvl|<=F_%WNWuSgEZ~ zeyWKML|+8;Vz_kzQ9trl{>z@q(bm`P->-0(sn^xYn11kSaz1(I=`(xn#to4Y2NEzf zxPX>V!Z03OhlmK-OYm5Vcksa?u*&P|)(ZQ_(3T-^beDKkK?0oe5DWFW!TiND2lJ0c zXrDcs!gO?A;k1+02FsOut)keMBuS0Ra(*ky0ECRyx>IFqX&??(yr(4& z{7~BMQr5M~0ddoY87Xstsq`Hx)x=M!S)7rkWhG=q(&MX*HWy+3}D- z`jEkhC9R)NcyMrVb@?$8O;z4mk;DBM5r}SZ=lYD8;HP`vjiCVsd?J+pM|t{M$%@|T zCQwCe^ZW>ah7YZJ{1!6?Q8NVED2fctvhMG#D?Y8mheKs9m~AW9h0|2B$afs@fIzrj z7Z(KqB!0S)Lm(cmMRNN;KI`?X<2wy0E-`xTn`w=!9Cd4aR5pmN+gpCt2tr%NK@yuO zcryO@99;I9IQk&K|42qtPO)Hm1&ww&uSx&rG_ zJgf(h+W6gYq|t6ME#0lW?Za@f_CEk^NE4+E|0D4T-4Ani-1wulUvb2bjo9{axMsB& zai4y9Mk6Hj#xKY=5z4pP(^ZXkmluVrJ**~|X1~C4ew1fb)Nt2_nccus0ah#YF6(=n z|82!*m)e20n#hnSZfK!^;=tb8*p9C_GyWnj;FX|b7grOVCl2@ZYmp^=o>v&}vCkeL zI|@*(IbA!`1x|ttUX23K*3wOg`HDGUG}(VURqd zdCEBGz}`0Tva!4#3I~aj0umyoAJh^OM0D!MfsL7mO22-#0+Y==+N^VPk62kh<3;?N zx1N!LoArxN79Q9t2!e*YA-Y?xH_@MkdOL_aEiOZX#6Wg|8vRmJD&l?_VT}bDtyuZh zss$3KfyJoYr1P7+l$&>1W?xU`bsyoHe$%|QbaXUQY##(pQ-JD8R=!CywZ~q!v~pk& zO7afj9*+v$Wq&j>2=~pfGsp9^D-$Sk^FvfZxD+;I z;%+ydNB#-=dq2#vPN;!*tS9RFMJ(AJ(J_ou+7y~eJhv|fu+ioV04i!l-`3khH{MZf zk9E7(vKq)!`z~@b=%B*xPX))@xmF!!fV^NrdIxi3ON3ukZ;o}B`lLR2HA;GL2kGS_ zWnFL_QcU_UnTxa(c7H83WkT1qtHM;6!KJyddl;9$+w>@$?Ac!T#JS1b3Q-iP>iHKS zTkHP#3JKUjqcIOSkSpAj=7)>ZP+-(b2)$SNn77=f?Eqnef6z-U6>RJx)-zn|R1v<5 zNvdeIUQA^E=3B>zh9U+nYMXMOKF{dI34=t#W6FKvow1OPV$FLY-SRVui2u4mYC$}W zaPiPDg()33?^9k{Mbh;<-_5e_Mas5}eV=LcR4x2lFYq_h6r?w$;S<*%rMPkTuD0O* zmoO4u&ViQ?Z;Og*CuBYRTP^hG;NLoqP*NIyZ=YWH`h$_}-$ZJE{y%|gJFk+PTqRm3XtQU;` z_t#?Iwkuwe!8A9DDO)~~`k%iGl$pl4+<|?q_Zzt8J*odSZT)lf)wF<85#h+}h;5Yn zQn=ImUO$n6r<9l)d%ZDm^LZ)5lqO-;b?&j6MWI&v^)DB(aXDoF5pU%rl3_-dJ^B`t zY2E0vDu|2GM7BC%4>tO_(W?{rcV~+oW9s)AvZLpr*K?VV2)SIAr!OZNQuNaQa}NI+ z(Z{Cr*JV%H*Xu$--k#ENBW14@YfsOBV`1J^z%Zmt2Fs20jlE8AD8118P`u53%<81nh!> zg5l!jw&a$@n{^+BS`e7f8zq4c33MKf=sjb03%fT%t@U{P?&KFW2x}wdmOu*P z&_|UY-_c5mWS9+2HOjMas8sEv7?z=6D2_N|UY;Ar0 zEv97h)vy;a=QkoF)YF`=NJY)(BjKl$*FukSKDxZdl-}FHf|Sns_$sY;Eb5v5Do!@&?q z+Zd8r0fR!1T-&QBgX`3S^buGUP$mI@W%-P!Coyeoe9`4C9sqfxyn24QxE2Rv<5k%S zm*aZ!l4e3P)e`VPlcksl))EM+MTCaIo>_bsv)SAO;DVp8aIfTl@9U~xuhQj!K4zF{ zr>7R)@b~w3Wm&<2+?19Wca74+lZ&F|MPn_)IdN_q>@rboawGL<5Bs&IPSJO5F9%OJ zGKaddg;ih@E2^t|4R{T@lgajKu|WWnG9P<68M8&&ZC_saMp3^P-qV`Z?8Onv6+-QQ1e_2$frFkd$v4Onf=qPGXV{d`3e zdR~0$d-FE@+~krv9nv zCkX=GeUH~zFA>l+TM{c1H$sXH^Zp@Gu!H?%#cO^LYmIk&X4ZB+d0t#m9(jBQ?U40q zl(Y)1(S+Lt(6BC0o4xEwt%9Zr8y8nTxJ??G!@aQ-ZCjX|fKKz#>!b5%4JwFDr-Ir9 zpc$xr>HvP#TT2~brhQqExuuK&>EErpW5*S5KWN)*#Ob}uiO9}rtm3sqqS3CkUDWIJ z^r(9%D;=YmW=(0Z&s-Cj61A##Lr=yFzwukW%BqIGSAy^vJI6xi?mT!|05n;P*;W?J zsPZ~qc=XE?c|vHwk{+Zd<4LD!w|OwuA;m>R&c$Nwu7hjmSC!04Udw>^7nMIVG(!fN zwR7}o3}v(*!R!I}rIh5%pA7#W+TJQGtG(+N1`7)?Xaqz+S{kHLQc^$(Dd`634n;v4 zq#LC~O1gv_ML}A+yYr?yzA@K&)_UIS{r15=*~eVMbk2W_F@7cYV!eK5(EVi9SpCwi z)={AxK5kVbOE;C(^lbA7*4m^{OMWf3lTzONHTlxI!~0YeJki`H&)2ERrePv%b-KtdBh$DzWM)oECyWq*MccB_vm2b9VILaQKWqUy!RmF8(B%QR6j5X6t<> zfgmj}Yssu`XoRjr)TXqj(~sM(R4Bv?&TGcVTeD8Jb;4|fyL~EDxcsHQzGb2;%90$^Aic$`;MY!?2>lJ4>-9bWC} z-Xc$=17jm>2q3Zzg=LkkLZ}9Bsd+D#{3UQAUvfWeidiTj0Cz7^A>*tM!TD} zEz5d7rQpQcjZ3=}0dDW45ei5ffiyg8mR*+BqC`g!kx)GH`^Rfh*uy#5K0%Of9t(np zAmY7{Nj@Ez`NFUCS<`ZZS&nTzUH++u9|o(@2tTyth^~*1p#3Q7`+2{u#d-a0{xJJpTzsDaA&kS0mECD1YN!vAoL1yKz8Bp;#{OA&#LYH>?Yp4e(^Y zj=~55)nad-+v=#DT^k*SL^l5p;iF3${QRQH@#xIV6}a#2OKOLZ9ti`#Zr?5RbT6lD z6+M>619$9P_n8L*i=>_%$arZdt?h-Wz=VxX{S%({*pca2Nt8|5mu0#feHE(WveC$u z5}vcn5x&|LfpX*C{CLLlTA#n`76gQ|BWDFQ%PLR|vPMk~&OH>vl zf9k#VwB!XPw5qn^k3ad+DsXs)pFZDGy5PMv&w?TH^l7SMh$*;*`<734p9;T=P^P?u zO(aqJg$vR8JbLtKWvtp~)ytC0{#%CZI6q7x;N<^FI_d_;N4?w`DMU`a={8m()!;Iu zT%KlB?ITN)uLrCEZ?Qp%|IHMb;?hvEv5ne$LcwLQ|0f*q1F{bhybB)Qqi#+N&FP6_erB$1+1vB&b6^4y3*C`*NWk?IUV|l7IU&? z__>*}JaF2tA})fdl(ld)+b<3v1^cPj__;qI;ejD%8_-o^%U@>dk=ns%^2b?UoBekz z)U>4OpVXV;iGfp~2gZQlsQU3U-%nJ0l$5W*U76kH2PZIB-u6E_p?k@7WI6bW8NP+Z zK*gnC2_OC1V}W4*xy&={!(H^30U<^>TYq)33B$ftxo|CnY!69`D>3UG`-4e-!Wp0J z!50qkXhhkBWG8PI7EGkLQHnTMuIP?rp&>ff2ha>s<6_%hmfROx(1UFRY=33-sJqSX zb^fzqAU6_d2Paxmb}l%q?(X`SS5N9px?!Xu?5FTpAH95O3t% zmXYKrn2{t?ImQC2ez^FW&}!cLjUKW5UiUMkqm6#9m(#1}pF@PFEq&PFEg|QH(E$_}i=%3(h2C+Se3hOG~E0EeFn!m3$Tdp8&A{JZ{ z1yTB?IxI9e|D(NfiSl$hYi@bC;-*6ao!WfqWJ7Qcl*x)VqnRZ!Xs?GKFi-rR<``*_ z3%S;H$Pm0*>an?Wok%_>+7hf%XF*rOqQn;6fCZlt}L}VIToRfVac|0S0nNb;7eUSBcmcm^bGN zjTQ?6WiNT3!3YX1ppIp~)k zyF07*L=d;NM_F%RZaM+;^frw?QtikmALkBE$1DCGoxWFX(H__+<@E1-URr%k4G8^!QVM=dgT4c`P@S z=DwVye@)GKz+D>~8baXn-?A4DgK$(<+n?2H8pG)cIOXOs$pZp1p&_2q;Be9dvWn1g0aQx`@mNq&Q9XD-9_kxRuaf)r z)18HWqNL*!`?WFbmr&Ku6c&AwTgGYK*L{$3j21mUvHm)4#{vTRA8ER`PsdJTbTuR! zj{&Djf`*Iq%`>3V>ccq*^qKe_R34?*=`n~BU%vo;&!nXF)_x)T%cG47miGYx1{)m^ zy;qn4Y4fd#wcfamA)K6%Ik_CdI!jY- zeeMIc4#P7daKA!i;XoNkg8Wyiyh7pk6APGJppmI!hYc@U=_DDN@w|om zxO7XwYV4c5dif?;nV-vRe*;TI56Zj?eix8(5z&{!L0h?RF*G6_^@ZJV3cN*r3D3aRI$_v2wD<;m%T;H_3);sh31k}IUcODb^d5id&>qO+;5B*1Zc>5y$fLB*S4SbjfnM=B4<(iR z9&r5{DNEB-cLL_dk1icTVDX)7w__xfrBetdJ#KSSR_=?e^|*Add0Mf1*T<83KcRlR z`{~gk`S-4_fcB&+5DMHRVCJroUmm6shNM9@@GSTwlf@HMjOoy?sM44#VPsiNA6Lp# z&}~;uuMYio^9nzP`_8Nw$l2>3Su0qL*81nW?kKSW4v zX2njDd`*Q*N-=!5)*n(kG<{Un8i{beCpx>wlAMASUeMTrxBlURw?kEA2z6S}^`Il_ z((}6e8YkT|3;Z7tCDK|=b;YYk!ofdv_)qWZ2uXq^d`do5Q^x0ORFb%pa0p}IP;BV6 z=Zb$5-1LyB;owA$uUZJxwi>PS2ishQWP`CkNyqa)o{@jc{QYrESiY z&iNElVJm~w&*MBtR)=cjdBB+1Gyz8}Kpl;+GQ5PBt@iCDZ@q8O%IyTvY-H$LcY zaF-Itr~u&0q?GS3sb7Thqf5AV+JQm}w1n?Z+qWi!j5^fn>Q3wTO`8Nn`RZT-7R$OJ zBWgTZcv}cyt&1l|*t$TC!~mP#c(>P12(~O*IqYPmSnEy$qXlyn$ro37%5B}bJ(&nu zmiY5(a9uutFDo2r0|$GKV9mC%In)RjcTlyP;RC^IJ#cFx@#kQ+b)AX~A=Fy@mI9v& zJacsB*Rpo=M1!(7;Cfjo%5xlYupoKwBgK`pPLm3XM3M@*@UU1ZHD@{yMR2z(v6kw1 z10~7@xRchk@o)RTd*q&3asf5#PpJ%Urfgyx3@12}4mt83zq`7%&?y?xy^$GomEqav zS5+a4U@A{6;VdC8zB#(5LnMKoE%P5&;E`2W^7t*oc491nj7BQ$GP6=Ey@bPxtY)!O zdV3zJ^w%aO38Ef!7GTB$KpOBIwSLqWERoS=4%H!WGqOmVJa?81;X0>bZQ~rsG$`?~ z`VB49=cMZ%+zj-^=IyaQHRmB{zIJk?6mA7C6eZK4X}<1Hw10$Wu6pS^FnuRFS4WPW zpj0k@zBXk$N{@Oi$$J>w*Mlq}T@knv;Gqvrutw<9QKkb!N{pjj^nE6#AllBuqwkQ% z1}82Xm2c=AXq6FciHWdKDC~iD!_*Mu=2z`hoLoe(y=tO@`LY!9 z9bW^^X4G~-8Q6(>fg~(}_o6e!CTIJlp3;oD$kMWQnb+qoB8*drF>PQ=p&G5))$7{h zAl_Sa^BsI_E1lE3aayfk>9Bkslzj(M!gjS9SGf!yoqf^@B(UV2sPvoQ+%w>^6t1K2 zvT7I;q5yjxJs3TCpU$QX+GWNbA3(d8=~?3|n|zqploI~9&B36Z4Y?aeBU^_O`WGva zJ}oEHV3!P*sRZ~?Bb7;X3v#kNRP8Sk z@b~;M%V|1?unJZvvWWS@MaC8Hkeyth&3a=hz2rhZV!S|f&cknHyxM7EN-1&b*G^iX z(r5aFaG+E+cpl?G5!2v2%+SJ zL}F1mYLDOI0vAv$rx&z5L0SFU;9MaM1%vNu0+;Fc(Q2pb%eT2L{s5KaTA#I=KHd3O zCx_30y_p6=^#G7~R+rJAv;O{l5AJ5aOFQ7x><*Noi<|uPd`uoEAs~%c5?$|aX21n> zHRC9Tr-1#kTlbmoM^So+pw{SIwC~C5#z2I5wRDR0@#x6kgCw0_!dZ@=XPY9hq{#5~n2^a}LuAnIwU_4RGQ_GpeYqO#BL^HC+e0ly z_`)2??@eq+cmQMljuSpgz9K$^EXdksD&GcdKJq)h0> zJ^1lMeY5Q};*a>b8=(VWHE(|goD^UcHOL;XVS#gx3VBYD4)^=uU>XH-#(HC@E_zET zpy7I=j6$etclhV(6Y9t2@_5GC9%O>QKE2T4I>!TTfks4{H*->AAawrH-bCMOLcn$j z`>+ttjL~p%96}FY;#?nmKWW~dPt*m1qbpagG<33|DD&Vg1I_3AEF&TI>L;Kt*8grL z;ab8tRI~~u7fesoa1kE{E#6LCh_9^8QqL2>NlY%Eo-^Tkkt`IPnW}uqrO=+DU|9{! zxcAOCzC*_zV9JLc>sE-0V8=JV3j5S9*6uWRdbCsjl^tW_hzke4@`o>#?XpcKC`U)f znUegjP^8?YL8*M@&(GA|!k91}r86EUCj+fNqq z_KPD)puH=4wUKxol|VA*UXEwhd~SP@3nT9mH%Z=Xe `*sospaKo)@++*c1meXw? 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 literal 0 HcmV?d00001 diff --git a/monitoring/docs/img/task4_password_required.png b/monitoring/docs/img/task4_password_required.png new file mode 100644 index 0000000000000000000000000000000000000000..0856c757825d8d883385cd7ecdc9a35386c2346f GIT binary patch literal 127162 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%0D{n%5M%W*PuGc>e2 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�D` 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 H79sxwR6?zu literal 0 HcmV?d00001 diff --git a/monitoring/grafana/provisioning/datasources/loki.yml b/monitoring/grafana/provisioning/datasources/loki.yml new file mode 100644 index 0000000000..fba0b1b8e0 --- /dev/null +++ b/monitoring/grafana/provisioning/datasources/loki.yml @@ -0,0 +1,10 @@ +apiVersion: 1 + +datasources: + - name: Loki + uid: loki + type: loki + access: proxy + url: http://loki:3100 + isDefault: true + editable: true diff --git a/monitoring/loki/config.yml b/monitoring/loki/config.yml new file mode 100644 index 0000000000..bf81bc7602 --- /dev/null +++ b/monitoring/loki/config.yml @@ -0,0 +1,42 @@ +auth_enabled: false + +server: + http_listen_port: 3100 + grpc_listen_port: 9096 + +common: + path_prefix: /loki + replication_factor: 1 + ring: + kvstore: + store: inmemory + storage: + filesystem: + chunks_directory: /loki/chunks + rules_directory: /loki/rules + +schema_config: + configs: + - from: 2024-01-01 + store: tsdb + object_store: filesystem + schema: v13 + index: + prefix: index_ + period: 24h + +storage_config: + tsdb_shipper: + active_index_directory: /loki/tsdb-index + cache_location: /loki/tsdb-cache + filesystem: + directory: /loki/chunks + +limits_config: + retention_period: 168h + +compactor: + working_directory: /loki/compactor + compaction_interval: 10m + retention_enabled: true + delete_request_store: filesystem diff --git a/monitoring/promtail/config.yml b/monitoring/promtail/config.yml new file mode 100644 index 0000000000..0b58e710d6 --- /dev/null +++ b/monitoring/promtail/config.yml @@ -0,0 +1,38 @@ +server: + http_listen_port: 9080 + grpc_listen_port: 0 + +positions: + filename: /run/promtail/positions.yaml + +clients: + - url: http://loki:3100/loki/api/v1/push + +scrape_configs: + - job_name: docker + docker_sd_configs: + - host: unix:///var/run/docker.sock + refresh_interval: 5s + filters: + - name: label + values: + - logging=promtail + relabel_configs: + - target_label: job + replacement: docker + - source_labels: + - __meta_docker_container_label_app + action: replace + regex: "(.+)" + replacement: "$1" + target_label: app + - source_labels: + - __meta_docker_container_name + regex: "/(.*)" + target_label: container + - source_labels: + - __meta_docker_container_label_com_docker_compose_service + target_label: compose_service + - source_labels: + - __meta_docker_container_log_stream + target_label: logstream From d95fbbf8a0325ba99472819a6db4060257a44fe8 Mon Sep 17 00:00:00 2001 From: LocalT0aster Dan <90502400+LocalT0aster@users.noreply.github.com> Date: Thu, 26 Mar 2026 23:34:48 +0300 Subject: [PATCH 08/21] Lab08 Complete (#8) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: vagrant github-runner provisioning * task 1 * task2 * task 3 * 😴 --- app_python/README.md | 5 +- app_python/docs/LAB08.md | 138 ++++ app_python/poetry.lock | 501 +++++++------- app_python/pyproject.toml | 33 +- app_python/src/metrics.py | 119 ++++ app_python/src/router.py | 22 +- app_python/tests/test_endpoints.py | 1 + app_python/tests/test_metrics.py | 106 +++ monitoring/docker-compose.yml | 51 +- monitoring/docs/LAB08.md | 612 +++++++++++++++++ monitoring/docs/img/lab08_task2_targets.png | Bin 0 -> 131121 bytes monitoring/docs/img/lab08_task2_up_query.png | Bin 0 -> 21487 bytes .../docs/img/lab08_task3_custom_dashboard.png | Bin 0 -> 231683 bytes monitoring/grafana/dashbboard.json | 620 ++++++++++++++++++ monitoring/prometheus/prometheus.yml | 27 + vagrant/README.md | 12 +- vagrant/Vagrantfile | 2 + vagrant/shared/github-runner.env.example | 14 +- .../shared/provision-gh-runner-register.sh | 126 +++- vagrant/shared/provision-gh-runner.sh | 2 +- 20 files changed, 2122 insertions(+), 269 deletions(-) create mode 100644 app_python/docs/LAB08.md create mode 100644 app_python/src/metrics.py create mode 100644 app_python/tests/test_metrics.py create mode 100644 monitoring/docs/LAB08.md create mode 100644 monitoring/docs/img/lab08_task2_targets.png create mode 100644 monitoring/docs/img/lab08_task2_up_query.png create mode 100644 monitoring/docs/img/lab08_task3_custom_dashboard.png create mode 100644 monitoring/grafana/dashbboard.json create mode 100644 monitoring/prometheus/prometheus.yml diff --git a/app_python/README.md b/app_python/README.md index 1415a24a2a..dd63b7a64a 100644 --- a/app_python/README.md +++ b/app_python/README.md @@ -4,11 +4,11 @@ ## Overview -Small Flask web service that reports service metadata, system information, runtime uptime, and basic request details. Includes a simple health check endpoint for monitoring. +Small Flask web service that reports service metadata, system information, runtime uptime, and basic request details. Includes health and Prometheus metrics endpoints for monitoring. ## Prerequisites -- Python 3.13+ +- Python 3.14+ - Poetry ## Installation @@ -54,6 +54,7 @@ Gunicorn access logs are emitted as JSON so Loki can parse request fields cleanl - `GET /` - Service and system information - `GET /health` - Health check +- `GET /metrics` - Prometheus metrics exposition ## Configuration diff --git a/app_python/docs/LAB08.md b/app_python/docs/LAB08.md new file mode 100644 index 0000000000..1d947a2350 --- /dev/null +++ b/app_python/docs/LAB08.md @@ -0,0 +1,138 @@ +# LAB08 - Metrics and Monitoring (Task 1) + +## 1. Overview + +Prometheus instrumentation was added to the Flask service using `prometheus-client==0.23.1`. + +Implemented metrics: + +- `http_requests_total` counter with `method`, `endpoint`, and `status_code` +- `http_request_duration_seconds` histogram with `method`, `endpoint`, and `status_code` +- `http_requests_in_progress` gauge with `method` and `endpoint` +- `devops_info_endpoint_calls_total` counter for application endpoint usage +- `devops_info_system_info_duration_seconds` histogram for system-info collection latency + +Labeling choice: + +- Matched routes use normalized Flask rules such as `/`, `/health`, and `/metrics` +- Unmatched requests are grouped under `endpoint="unmatched"` to keep label cardinality low +- The in-progress gauge does not include `status_code` because that value does not exist until a response is produced + +## 2. Verification + +Install and run with the project-local Poetry binary: + +```bash +cd app_python +.venv/bin/poetry install --with dev +.venv/bin/poetry run pytest +.venv/bin/poetry run gunicorn --config gunicorn.conf.py src.main:app +``` + +Generate a few requests, then inspect metrics: + +```bash +curl -fSsL http://127.0.0.1:5000/ | jq +curl -fSsL http://127.0.0.1:5000/health | jq +curl -fSsL http://127.0.0.1:5000/metrics +``` + +

+/metrics output + +```text +$ curl -fSsL http://127.0.0.1:5000/metrics +# HELP http_requests_total Total HTTP requests handled by the service. +# TYPE http_requests_total counter +http_requests_total{endpoint="/",method="GET",status_code="200"} 6.0 +http_requests_total{endpoint="/health",method="GET",status_code="200"} 6.0 +# HELP http_requests_created Total HTTP requests handled by the service. +# TYPE http_requests_created gauge +http_requests_created{endpoint="/",method="GET",status_code="200"} 1.7739616481696362e+09 +http_requests_created{endpoint="/health",method="GET",status_code="200"} 1.7739616482041702e+09 +# HELP http_request_duration_seconds HTTP request duration in seconds. +# TYPE http_request_duration_seconds histogram +http_request_duration_seconds_bucket{endpoint="/",le="0.005",method="GET",status_code="200"} 6.0 +http_request_duration_seconds_bucket{endpoint="/",le="0.01",method="GET",status_code="200"} 6.0 +http_request_duration_seconds_bucket{endpoint="/",le="0.025",method="GET",status_code="200"} 6.0 +http_request_duration_seconds_bucket{endpoint="/",le="0.05",method="GET",status_code="200"} 6.0 +http_request_duration_seconds_bucket{endpoint="/",le="0.075",method="GET",status_code="200"} 6.0 +http_request_duration_seconds_bucket{endpoint="/",le="0.1",method="GET",status_code="200"} 6.0 +http_request_duration_seconds_bucket{endpoint="/",le="0.25",method="GET",status_code="200"} 6.0 +http_request_duration_seconds_bucket{endpoint="/",le="0.5",method="GET",status_code="200"} 6.0 +http_request_duration_seconds_bucket{endpoint="/",le="0.75",method="GET",status_code="200"} 6.0 +http_request_duration_seconds_bucket{endpoint="/",le="1.0",method="GET",status_code="200"} 6.0 +http_request_duration_seconds_bucket{endpoint="/",le="2.5",method="GET",status_code="200"} 6.0 +http_request_duration_seconds_bucket{endpoint="/",le="5.0",method="GET",status_code="200"} 6.0 +http_request_duration_seconds_bucket{endpoint="/",le="7.5",method="GET",status_code="200"} 6.0 +http_request_duration_seconds_bucket{endpoint="/",le="10.0",method="GET",status_code="200"} 6.0 +http_request_duration_seconds_bucket{endpoint="/",le="+Inf",method="GET",status_code="200"} 6.0 +http_request_duration_seconds_count{endpoint="/",method="GET",status_code="200"} 6.0 +http_request_duration_seconds_sum{endpoint="/",method="GET",status_code="200"} 0.0015464909993170295 +http_request_duration_seconds_bucket{endpoint="/health",le="0.005",method="GET",status_code="200"} 6.0 +http_request_duration_seconds_bucket{endpoint="/health",le="0.01",method="GET",status_code="200"} 6.0 +http_request_duration_seconds_bucket{endpoint="/health",le="0.025",method="GET",status_code="200"} 6.0 +http_request_duration_seconds_bucket{endpoint="/health",le="0.05",method="GET",status_code="200"} 6.0 +http_request_duration_seconds_bucket{endpoint="/health",le="0.075",method="GET",status_code="200"} 6.0 +http_request_duration_seconds_bucket{endpoint="/health",le="0.1",method="GET",status_code="200"} 6.0 +http_request_duration_seconds_bucket{endpoint="/health",le="0.25",method="GET",status_code="200"} 6.0 +http_request_duration_seconds_bucket{endpoint="/health",le="0.5",method="GET",status_code="200"} 6.0 +http_request_duration_seconds_bucket{endpoint="/health",le="0.75",method="GET",status_code="200"} 6.0 +http_request_duration_seconds_bucket{endpoint="/health",le="1.0",method="GET",status_code="200"} 6.0 +http_request_duration_seconds_bucket{endpoint="/health",le="2.5",method="GET",status_code="200"} 6.0 +http_request_duration_seconds_bucket{endpoint="/health",le="5.0",method="GET",status_code="200"} 6.0 +http_request_duration_seconds_bucket{endpoint="/health",le="7.5",method="GET",status_code="200"} 6.0 +http_request_duration_seconds_bucket{endpoint="/health",le="10.0",method="GET",status_code="200"} 6.0 +http_request_duration_seconds_bucket{endpoint="/health",le="+Inf",method="GET",status_code="200"} 6.0 +http_request_duration_seconds_count{endpoint="/health",method="GET",status_code="200"} 6.0 +http_request_duration_seconds_sum{endpoint="/health",method="GET",status_code="200"} 0.0019912700008717366 +# HELP http_request_duration_seconds_created HTTP request duration in seconds. +# TYPE http_request_duration_seconds_created gauge +http_request_duration_seconds_created{endpoint="/",method="GET",status_code="200"} 1.7739616481696527e+09 +http_request_duration_seconds_created{endpoint="/health",method="GET",status_code="200"} 1.7739616482041845e+09 +# HELP http_requests_in_progress HTTP requests currently being processed. +# TYPE http_requests_in_progress gauge +http_requests_in_progress{endpoint="/",method="GET"} 0.0 +http_requests_in_progress{endpoint="/health",method="GET"} 0.0 +http_requests_in_progress{endpoint="/metrics",method="GET"} 1.0 +# HELP devops_info_endpoint_calls_total Total calls to application endpoints. +# TYPE devops_info_endpoint_calls_total counter +devops_info_endpoint_calls_total{endpoint="/"} 6.0 +devops_info_endpoint_calls_total{endpoint="/health"} 6.0 +devops_info_endpoint_calls_total{endpoint="/metrics"} 1.0 +# HELP devops_info_endpoint_calls_created Total calls to application endpoints. +# TYPE devops_info_endpoint_calls_created gauge +devops_info_endpoint_calls_created{endpoint="/"} 1.773961648169205e+09 +devops_info_endpoint_calls_created{endpoint="/health"} 1.7739616482040732e+09 +devops_info_endpoint_calls_created{endpoint="/metrics"} 1.7739616631203315e+09 +# HELP devops_info_system_info_duration_seconds Time spent collecting system information. +# TYPE devops_info_system_info_duration_seconds histogram +devops_info_system_info_duration_seconds_bucket{le="0.005"} 6.0 +devops_info_system_info_duration_seconds_bucket{le="0.01"} 6.0 +devops_info_system_info_duration_seconds_bucket{le="0.025"} 6.0 +devops_info_system_info_duration_seconds_bucket{le="0.05"} 6.0 +devops_info_system_info_duration_seconds_bucket{le="0.075"} 6.0 +devops_info_system_info_duration_seconds_bucket{le="0.1"} 6.0 +devops_info_system_info_duration_seconds_bucket{le="0.25"} 6.0 +devops_info_system_info_duration_seconds_bucket{le="0.5"} 6.0 +devops_info_system_info_duration_seconds_bucket{le="0.75"} 6.0 +devops_info_system_info_duration_seconds_bucket{le="1.0"} 6.0 +devops_info_system_info_duration_seconds_bucket{le="2.5"} 6.0 +devops_info_system_info_duration_seconds_bucket{le="5.0"} 6.0 +devops_info_system_info_duration_seconds_bucket{le="7.5"} 6.0 +devops_info_system_info_duration_seconds_bucket{le="10.0"} 6.0 +devops_info_system_info_duration_seconds_bucket{le="+Inf"} 6.0 +devops_info_system_info_duration_seconds_count 6.0 +devops_info_system_info_duration_seconds_sum 0.00042895499973383266 +# HELP devops_info_system_info_duration_seconds_created Time spent collecting system information. +# TYPE devops_info_system_info_duration_seconds_created gauge +devops_info_system_info_duration_seconds_created 1.7739616389214125e+09 +``` + +
+ +## 3. Notes + +- HTTP metrics are captured with Flask request hooks so 2xx, 4xx, and 5xx responses are all measured consistently. +- Application-specific metrics are recorded in route handlers and around system-info collection. +- Automated tests cover `/metrics` exposure plus label handling for `200`, `404`, and `500` responses. diff --git a/app_python/poetry.lock b/app_python/poetry.lock index e4918ed237..748bfe2685 100644 --- a/app_python/poetry.lock +++ b/app_python/poetry.lock @@ -14,137 +14,153 @@ files = [ [[package]] name = "certifi" -version = "2026.1.4" +version = "2026.2.25" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.7" groups = ["main"] files = [ - {file = "certifi-2026.1.4-py3-none-any.whl", hash = "sha256:9943707519e4add1115f44c2bc244f782c0249876bf51b6599fee1ffbedd685c"}, - {file = "certifi-2026.1.4.tar.gz", hash = "sha256:ac726dd470482006e014ad384921ed6438c457018f4b3d204aea4281258b2120"}, + {file = "certifi-2026.2.25-py3-none-any.whl", hash = "sha256:027692e4402ad994f1c42e52a4997a9763c646b73e4096e4d5d6db8af1d6f0fa"}, + {file = "certifi-2026.2.25.tar.gz", hash = "sha256:e887ab5cee78ea814d3472169153c2d12cd43b14bd03329a39a9c6e2e80bfba7"}, ] [[package]] name = "charset-normalizer" -version = "3.4.4" +version = "3.4.6" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7" groups = ["main"] files = [ - {file = "charset_normalizer-3.4.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e824f1492727fa856dd6eda4f7cee25f8518a12f3c4a56a74e8095695089cf6d"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4bd5d4137d500351a30687c2d3971758aac9a19208fc110ccb9d7188fbe709e8"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:027f6de494925c0ab2a55eab46ae5129951638a49a34d87f4c3eda90f696b4ad"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f820802628d2694cb7e56db99213f930856014862f3fd943d290ea8438d07ca8"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:798d75d81754988d2565bff1b97ba5a44411867c0cf32b77a7e8f8d84796b10d"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d1bb833febdff5c8927f922386db610b49db6e0d4f4ee29601d71e7c2694313"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9cd98cdc06614a2f768d2b7286d66805f94c48cde050acdbbb7db2600ab3197e"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:077fbb858e903c73f6c9db43374fd213b0b6a778106bc7032446a8e8b5b38b93"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:244bfb999c71b35de57821b8ea746b24e863398194a4014e4c76adc2bbdfeff0"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:64b55f9dce520635f018f907ff1b0df1fdc31f2795a922fb49dd14fbcdf48c84"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:faa3a41b2b66b6e50f84ae4a68c64fcd0c44355741c6374813a800cd6695db9e"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:6515f3182dbe4ea06ced2d9e8666d97b46ef4c75e326b79bb624110f122551db"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cc00f04ed596e9dc0da42ed17ac5e596c6ccba999ba6bd92b0e0aef2f170f2d6"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-win32.whl", hash = "sha256:f34be2938726fc13801220747472850852fe6b1ea75869a048d6f896838c896f"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:a61900df84c667873b292c3de315a786dd8dac506704dea57bc957bd31e22c7d"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-win_arm64.whl", hash = "sha256:cead0978fc57397645f12578bfd2d5ea9138ea0fac82b2f63f7f7c6877986a69"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6e1fcf0720908f200cd21aa4e6750a48ff6ce4afe7ff5a79a90d5ed8a08296f8"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f819d5fe9234f9f82d75bdfa9aef3a3d72c4d24a6e57aeaebba32a704553aa0"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a59cb51917aa591b1c4e6a43c132f0cdc3c76dbad6155df4e28ee626cc77a0a3"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8ef3c867360f88ac904fd3f5e1f902f13307af9052646963ee08ff4f131adafc"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d9e45d7faa48ee908174d8fe84854479ef838fc6a705c9315372eacbc2f02897"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:840c25fb618a231545cbab0564a799f101b63b9901f2569faecd6b222ac72381"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ca5862d5b3928c4940729dacc329aa9102900382fea192fc5e52eb69d6093815"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d9c7f57c3d666a53421049053eaacdd14bbd0a528e2186fcb2e672effd053bb0"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:277e970e750505ed74c832b4bf75dac7476262ee2a013f5574dd49075879e161"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:31fd66405eaf47bb62e8cd575dc621c56c668f27d46a61d975a249930dd5e2a4"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:0d3d8f15c07f86e9ff82319b3d9ef6f4bf907608f53fe9d92b28ea9ae3d1fd89"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:9f7fcd74d410a36883701fafa2482a6af2ff5ba96b9a620e9e0721e28ead5569"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ebf3e58c7ec8a8bed6d66a75d7fb37b55e5015b03ceae72a8e7c74495551e224"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-win32.whl", hash = "sha256:eecbc200c7fd5ddb9a7f16c7decb07b566c29fa2161a16cf67b8d068bd21690a"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:5ae497466c7901d54b639cf42d5b8c1b6a4fead55215500d2f486d34db48d016"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-win_arm64.whl", hash = "sha256:65e2befcd84bc6f37095f5961e68a6f077bf44946771354a28ad434c2cce0ae1"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0a98e6759f854bd25a58a73fa88833fba3b7c491169f86ce1180c948ab3fd394"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b5b290ccc2a263e8d185130284f8501e3e36c5e02750fc6b6bdeb2e9e96f1e25"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74bb723680f9f7a6234dcf67aea57e708ec1fbdf5699fb91dfd6f511b0a320ef"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f1e34719c6ed0b92f418c7c780480b26b5d9c50349e9a9af7d76bf757530350d"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2437418e20515acec67d86e12bf70056a33abdacb5cb1655042f6538d6b085a8"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11d694519d7f29d6cd09f6ac70028dba10f92f6cdd059096db198c283794ac86"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ac1c4a689edcc530fc9d9aa11f5774b9e2f33f9a0c6a57864e90908f5208d30a"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:21d142cc6c0ec30d2efee5068ca36c128a30b0f2c53c1c07bd78cb6bc1d3be5f"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:5dbe56a36425d26d6cfb40ce79c314a2e4dd6211d51d6d2191c00bed34f354cc"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5bfbb1b9acf3334612667b61bd3002196fe2a1eb4dd74d247e0f2a4d50ec9bbf"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:d055ec1e26e441f6187acf818b73564e6e6282709e9bcb5b63f5b23068356a15"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:af2d8c67d8e573d6de5bc30cdb27e9b95e49115cd9baad5ddbd1a6207aaa82a9"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:780236ac706e66881f3b7f2f32dfe90507a09e67d1d454c762cf642e6e1586e0"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-win32.whl", hash = "sha256:5833d2c39d8896e4e19b689ffc198f08ea58116bee26dea51e362ecc7cd3ed26"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:a79cfe37875f822425b89a82333404539ae63dbdddf97f84dcbc3d339aae9525"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-win_arm64.whl", hash = "sha256:376bec83a63b8021bb5c8ea75e21c4ccb86e7e45ca4eb81146091b56599b80c3"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e1f185f86a6f3403aa2420e815904c67b2f9ebc443f045edd0de921108345794"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b39f987ae8ccdf0d2642338faf2abb1862340facc796048b604ef14919e55ed"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3162d5d8ce1bb98dd51af660f2121c55d0fa541b46dff7bb9b9f86ea1d87de72"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:81d5eb2a312700f4ecaa977a8235b634ce853200e828fbadf3a9c50bab278328"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5bd2293095d766545ec1a8f612559f6b40abc0eb18bb2f5d1171872d34036ede"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8a8b89589086a25749f471e6a900d3f662d1d3b6e2e59dcecf787b1cc3a1894"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc7637e2f80d8530ee4a78e878bce464f70087ce73cf7c1caf142416923b98f1"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f8bf04158c6b607d747e93949aa60618b61312fe647a6369f88ce2ff16043490"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:554af85e960429cf30784dd47447d5125aaa3b99a6f0683589dbd27e2f45da44"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:74018750915ee7ad843a774364e13a3db91682f26142baddf775342c3f5b1133"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c0463276121fdee9c49b98908b3a89c39be45d86d1dbaa22957e38f6321d4ce3"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:362d61fd13843997c1c446760ef36f240cf81d3ebf74ac62652aebaf7838561e"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a26f18905b8dd5d685d6d07b0cdf98a79f3c7a918906af7cc143ea2e164c8bc"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-win32.whl", hash = "sha256:9b35f4c90079ff2e2edc5b26c0c77925e5d2d255c42c74fdb70fb49b172726ac"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-win_amd64.whl", hash = "sha256:b435cba5f4f750aa6c0a0d92c541fb79f69a387c91e61f1795227e4ed9cece14"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-win_arm64.whl", hash = "sha256:542d2cee80be6f80247095cc36c418f7bddd14f4a6de45af91dfad36d817bba2"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:da3326d9e65ef63a817ecbcc0df6e94463713b754fe293eaa03da99befb9a5bd"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8af65f14dc14a79b924524b1e7fffe304517b2bff5a58bf64f30b98bbc5079eb"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74664978bb272435107de04e36db5a9735e78232b85b77d45cfb38f758efd33e"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:752944c7ffbfdd10c074dc58ec2d5a8a4cd9493b314d367c14d24c17684ddd14"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d1f13550535ad8cff21b8d757a3257963e951d96e20ec82ab44bc64aeb62a191"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ecaae4149d99b1c9e7b88bb03e3221956f68fd6d50be2ef061b2381b61d20838"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cb6254dc36b47a990e59e1068afacdcd02958bdcce30bb50cc1700a8b9d624a6"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c8ae8a0f02f57a6e61203a31428fa1d677cbe50c93622b4149d5c0f319c1d19e"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:47cc91b2f4dd2833fddaedd2893006b0106129d4b94fdb6af1f4ce5a9965577c"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:82004af6c302b5d3ab2cfc4cc5f29db16123b1a8417f2e25f9066f91d4411090"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2b7d8f6c26245217bd2ad053761201e9f9680f8ce52f0fcd8d0755aeae5b2152"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:799a7a5e4fb2d5898c60b640fd4981d6a25f1c11790935a44ce38c54e985f828"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:99ae2cffebb06e6c22bdc25801d7b30f503cc87dbd283479e7b606f70aff57ec"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-win32.whl", hash = "sha256:f9d332f8c2a2fcbffe1378594431458ddbef721c1769d78e2cbc06280d8155f9"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-win_amd64.whl", hash = "sha256:8a6562c3700cce886c5be75ade4a5db4214fda19fede41d9792d100288d8f94c"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-win_arm64.whl", hash = "sha256:de00632ca48df9daf77a2c65a484531649261ec9f25489917f09e455cb09ddb2"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ce8a0633f41a967713a59c4139d29110c07e826d131a316b50ce11b1d79b4f84"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eaabd426fe94daf8fd157c32e571c85cb12e66692f15516a83a03264b08d06c3"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c4ef880e27901b6cc782f1b95f82da9313c0eb95c3af699103088fa0ac3ce9ac"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2aaba3b0819274cc41757a1da876f810a3e4d7b6eb25699253a4effef9e8e4af"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:778d2e08eda00f4256d7f672ca9fef386071c9202f5e4607920b86d7803387f2"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f155a433c2ec037d4e8df17d18922c3a0d9b3232a396690f17175d2946f0218d"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a8bf8d0f749c5757af2142fe7903a9df1d2e8aa3841559b2bad34b08d0e2bcf3"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:194f08cbb32dc406d6e1aea671a68be0823673db2832b38405deba2fb0d88f63"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:6aee717dcfead04c6eb1ce3bd29ac1e22663cdea57f943c87d1eab9a025438d7"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:cd4b7ca9984e5e7985c12bc60a6f173f3c958eae74f3ef6624bb6b26e2abbae4"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_riscv64.whl", hash = "sha256:b7cf1017d601aa35e6bb650b6ad28652c9cd78ee6caff19f3c28d03e1c80acbf"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:e912091979546adf63357d7e2ccff9b44f026c075aeaf25a52d0e95ad2281074"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:5cb4d72eea50c8868f5288b7f7f33ed276118325c1dfd3957089f6b519e1382a"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-win32.whl", hash = "sha256:837c2ce8c5a65a2035be9b3569c684358dfbf109fd3b6969630a87535495ceaa"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:44c2a8734b333e0578090c4cd6b16f275e07aa6614ca8715e6c038e865e70576"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a9768c477b9d7bd54bc0c86dbaebdec6f03306675526c9927c0e8a04e8f94af9"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1bee1e43c28aa63cb16e5c14e582580546b08e535299b8b6158a7c9c768a1f3d"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:fd44c878ea55ba351104cb93cc85e74916eb8fa440ca7903e57575e97394f608"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0f04b14ffe5fdc8c4933862d8306109a2c51e0704acfa35d51598eb45a1e89fc"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:cd09d08005f958f370f539f186d10aec3377d55b9eeb0d796025d4886119d76e"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4fe7859a4e3e8457458e2ff592f15ccb02f3da787fcd31e0183879c3ad4692a1"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fa09f53c465e532f4d3db095e0c55b615f010ad81803d383195b6b5ca6cbf5f3"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:7fa17817dc5625de8a027cb8b26d9fefa3ea28c8253929b8d6649e705d2835b6"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:5947809c8a2417be3267efc979c47d76a079758166f7d43ef5ae8e9f92751f88"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:4902828217069c3c5c71094537a8e623f5d097858ac6ca8252f7b4d10b7560f1"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:7c308f7e26e4363d79df40ca5b2be1c6ba9f02bdbccfed5abddb7859a6ce72cf"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:2c9d3c380143a1fedbff95a312aa798578371eb29da42106a29019368a475318"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:cb01158d8b88ee68f15949894ccc6712278243d95f344770fa7593fa2d94410c"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-win32.whl", hash = "sha256:2677acec1a2f8ef614c6888b5b4ae4060cc184174a938ed4e8ef690e15d3e505"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:f8e160feb2aed042cd657a72acc0b481212ed28b1b9a95c0cee1621b524e1966"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-win_arm64.whl", hash = "sha256:b5d84d37db046c5ca74ee7bb47dd6cbc13f80665fdde3e8040bdd3fb015ecb50"}, - {file = "charset_normalizer-3.4.4-py3-none-any.whl", hash = "sha256:7a32c560861a02ff789ad905a2fe94e3f840803362c84fecf1851cb4cf3dc37f"}, - {file = "charset_normalizer-3.4.4.tar.gz", hash = "sha256:94537985111c35f28720e43603b8e7b43a6ecfb2ce1d3058bbe955b73404e21a"}, + {file = "charset_normalizer-3.4.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2e1d8ca8611099001949d1cdfaefc510cf0f212484fe7c565f735b68c78c3c95"}, + {file = "charset_normalizer-3.4.6-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e25369dc110d58ddf29b949377a93e0716d72a24f62bad72b2b39f155949c1fd"}, + {file = "charset_normalizer-3.4.6-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:259695e2ccc253feb2a016303543d691825e920917e31f894ca1a687982b1de4"}, + {file = "charset_normalizer-3.4.6-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:dda86aba335c902b6149a02a55b38e96287157e609200811837678214ba2b1db"}, + {file = "charset_normalizer-3.4.6-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:51fb3c322c81d20567019778cb5a4a6f2dc1c200b886bc0d636238e364848c89"}, + {file = "charset_normalizer-3.4.6-cp310-cp310-manylinux_2_31_armv7l.whl", hash = "sha256:4482481cb0572180b6fd976a4d5c72a30263e98564da68b86ec91f0fe35e8565"}, + {file = "charset_normalizer-3.4.6-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:39f5068d35621da2881271e5c3205125cc456f54e9030d3f723288c873a71bf9"}, + {file = "charset_normalizer-3.4.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8bea55c4eef25b0b19a0337dc4e3f9a15b00d569c77211fa8cde38684f234fb7"}, + {file = "charset_normalizer-3.4.6-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:f0cdaecd4c953bfae0b6bb64910aaaca5a424ad9c72d85cb88417bb9814f7550"}, + {file = "charset_normalizer-3.4.6-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:150b8ce8e830eb7ccb029ec9ca36022f756986aaaa7956aad6d9ec90089338c0"}, + {file = "charset_normalizer-3.4.6-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:e68c14b04827dd76dcbd1aeea9e604e3e4b78322d8faf2f8132c7138efa340a8"}, + {file = "charset_normalizer-3.4.6-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:3778fd7d7cd04ae8f54651f4a7a0bd6e39a0cf20f801720a4c21d80e9b7ad6b0"}, + {file = "charset_normalizer-3.4.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:dad6e0f2e481fffdcf776d10ebee25e0ef89f16d691f1e5dee4b586375fdc64b"}, + {file = "charset_normalizer-3.4.6-cp310-cp310-win32.whl", hash = "sha256:74a2e659c7ecbc73562e2a15e05039f1e22c75b7c7618b4b574a3ea9118d1557"}, + {file = "charset_normalizer-3.4.6-cp310-cp310-win_amd64.whl", hash = "sha256:aa9cccf4a44b9b62d8ba8b4dd06c649ba683e4bf04eea606d2e94cfc2d6ff4d6"}, + {file = "charset_normalizer-3.4.6-cp310-cp310-win_arm64.whl", hash = "sha256:e985a16ff513596f217cee86c21371b8cd011c0f6f056d0920aa2d926c544058"}, + {file = "charset_normalizer-3.4.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:82060f995ab5003a2d6e0f4ad29065b7672b6593c8c63559beefe5b443242c3e"}, + {file = "charset_normalizer-3.4.6-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:60c74963d8350241a79cb8feea80e54d518f72c26db618862a8f53e5023deaf9"}, + {file = "charset_normalizer-3.4.6-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f6e4333fb15c83f7d1482a76d45a0818897b3d33f00efd215528ff7c51b8e35d"}, + {file = "charset_normalizer-3.4.6-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:bc72863f4d9aba2e8fd9085e63548a324ba706d2ea2c83b260da08a59b9482de"}, + {file = "charset_normalizer-3.4.6-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9cc4fc6c196d6a8b76629a70ddfcd4635a6898756e2d9cac5565cf0654605d73"}, + {file = "charset_normalizer-3.4.6-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:0c173ce3a681f309f31b87125fecec7a5d1347261ea11ebbb856fa6006b23c8c"}, + {file = "charset_normalizer-3.4.6-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c907cdc8109f6c619e6254212e794d6548373cc40e1ec75e6e3823d9135d29cc"}, + {file = "charset_normalizer-3.4.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:404a1e552cf5b675a87f0651f8b79f5f1e6fd100ee88dc612f89aa16abd4486f"}, + {file = "charset_normalizer-3.4.6-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:e3c701e954abf6fc03a49f7c579cc80c2c6cc52525340ca3186c41d3f33482ef"}, + {file = "charset_normalizer-3.4.6-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:7a6967aaf043bceabab5412ed6bd6bd26603dae84d5cb75bf8d9a74a4959d398"}, + {file = "charset_normalizer-3.4.6-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:5feb91325bbceade6afab43eb3b508c63ee53579fe896c77137ded51c6b6958e"}, + {file = "charset_normalizer-3.4.6-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:f820f24b09e3e779fe84c3c456cb4108a7aa639b0d1f02c28046e11bfcd088ed"}, + {file = "charset_normalizer-3.4.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b35b200d6a71b9839a46b9b7fff66b6638bb52fc9658aa58796b0326595d3021"}, + {file = "charset_normalizer-3.4.6-cp311-cp311-win32.whl", hash = "sha256:9ca4c0b502ab399ef89248a2c84c54954f77a070f28e546a85e91da627d1301e"}, + {file = "charset_normalizer-3.4.6-cp311-cp311-win_amd64.whl", hash = "sha256:a9e68c9d88823b274cf1e72f28cb5dc89c990edf430b0bfd3e2fb0785bfeabf4"}, + {file = "charset_normalizer-3.4.6-cp311-cp311-win_arm64.whl", hash = "sha256:97d0235baafca5f2b09cf332cc275f021e694e8362c6bb9c96fc9a0eb74fc316"}, + {file = "charset_normalizer-3.4.6-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:2ef7fedc7a6ecbe99969cd09632516738a97eeb8bd7258bf8a0f23114c057dab"}, + {file = "charset_normalizer-3.4.6-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a4ea868bc28109052790eb2b52a9ab33f3aa7adc02f96673526ff47419490e21"}, + {file = "charset_normalizer-3.4.6-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:836ab36280f21fc1a03c99cd05c6b7af70d2697e374c7af0b61ed271401a72a2"}, + {file = "charset_normalizer-3.4.6-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f1ce721c8a7dfec21fcbdfe04e8f68174183cf4e8188e0645e92aa23985c57ff"}, + {file = "charset_normalizer-3.4.6-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e28d62a8fc7a1fa411c43bd65e346f3bce9716dc51b897fbe930c5987b402d5"}, + {file = "charset_normalizer-3.4.6-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:530d548084c4a9f7a16ed4a294d459b4f229db50df689bfe92027452452943a0"}, + {file = "charset_normalizer-3.4.6-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:30f445ae60aad5e1f8bdbb3108e39f6fbc09f4ea16c815c66578878325f8f15a"}, + {file = "charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ac2393c73378fea4e52aa56285a3d64be50f1a12395afef9cce47772f60334c2"}, + {file = "charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:90ca27cd8da8118b18a52d5f547859cc1f8354a00cd1e8e5120df3e30d6279e5"}, + {file = "charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8e5a94886bedca0f9b78fecd6afb6629142fd2605aa70a125d49f4edc6037ee6"}, + {file = "charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:695f5c2823691a25f17bc5d5ffe79fa90972cc34b002ac6c843bb8a1720e950d"}, + {file = "charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:231d4da14bcd9301310faf492051bee27df11f2bc7549bc0bb41fef11b82daa2"}, + {file = "charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a056d1ad2633548ca18ffa2f85c202cfb48b68615129143915b8dc72a806a923"}, + {file = "charset_normalizer-3.4.6-cp312-cp312-win32.whl", hash = "sha256:c2274ca724536f173122f36c98ce188fd24ce3dad886ec2b7af859518ce008a4"}, + {file = "charset_normalizer-3.4.6-cp312-cp312-win_amd64.whl", hash = "sha256:c8ae56368f8cc97c7e40a7ee18e1cedaf8e780cd8bc5ed5ac8b81f238614facb"}, + {file = "charset_normalizer-3.4.6-cp312-cp312-win_arm64.whl", hash = "sha256:899d28f422116b08be5118ef350c292b36fc15ec2daeb9ea987c89281c7bb5c4"}, + {file = "charset_normalizer-3.4.6-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:11afb56037cbc4b1555a34dd69151e8e069bee82e613a73bef6e714ce733585f"}, + {file = "charset_normalizer-3.4.6-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:423fb7e748a08f854a08a222b983f4df1912b1daedce51a72bd24fe8f26a1843"}, + {file = "charset_normalizer-3.4.6-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d73beaac5e90173ac3deb9928a74763a6d230f494e4bfb422c217a0ad8e629bf"}, + {file = "charset_normalizer-3.4.6-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d60377dce4511655582e300dc1e5a5f24ba0cb229005a1d5c8d0cb72bb758ab8"}, + {file = "charset_normalizer-3.4.6-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:530e8cebeea0d76bdcf93357aa5e41336f48c3dc709ac52da2bb167c5b8271d9"}, + {file = "charset_normalizer-3.4.6-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:a26611d9987b230566f24a0a125f17fe0de6a6aff9f25c9f564aaa2721a5fb88"}, + {file = "charset_normalizer-3.4.6-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:34315ff4fc374b285ad7f4a0bf7dcbfe769e1b104230d40f49f700d4ab6bbd84"}, + {file = "charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5f8ddd609f9e1af8c7bd6e2aca279c931aefecd148a14402d4e368f3171769fd"}, + {file = "charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:80d0a5615143c0b3225e5e3ef22c8d5d51f3f72ce0ea6fb84c943546c7b25b6c"}, + {file = "charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:92734d4d8d187a354a556626c221cd1a892a4e0802ccb2af432a1d85ec012194"}, + {file = "charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:613f19aa6e082cf96e17e3ffd89383343d0d589abda756b7764cf78361fd41dc"}, + {file = "charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:2b1a63e8224e401cafe7739f77efd3f9e7f5f2026bda4aead8e59afab537784f"}, + {file = "charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6cceb5473417d28edd20c6c984ab6fee6c6267d38d906823ebfe20b03d607dc2"}, + {file = "charset_normalizer-3.4.6-cp313-cp313-win32.whl", hash = "sha256:d7de2637729c67d67cf87614b566626057e95c303bc0a55ffe391f5205e7003d"}, + {file = "charset_normalizer-3.4.6-cp313-cp313-win_amd64.whl", hash = "sha256:572d7c822caf521f0525ba1bce1a622a0b85cf47ffbdae6c9c19e3b5ac3c4389"}, + {file = "charset_normalizer-3.4.6-cp313-cp313-win_arm64.whl", hash = "sha256:a4474d924a47185a06411e0064b803c68be044be2d60e50e8bddcc2649957c1f"}, + {file = "charset_normalizer-3.4.6-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:9cc6e6d9e571d2f863fa77700701dae73ed5f78881efc8b3f9a4398772ff53e8"}, + {file = "charset_normalizer-3.4.6-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef5960d965e67165d75b7c7ffc60a83ec5abfc5c11b764ec13ea54fbef8b4421"}, + {file = "charset_normalizer-3.4.6-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b3694e3f87f8ac7ce279d4355645b3c878d24d1424581b46282f24b92f5a4ae2"}, + {file = "charset_normalizer-3.4.6-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5d11595abf8dd942a77883a39d81433739b287b6aa71620f15164f8096221b30"}, + {file = "charset_normalizer-3.4.6-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7bda6eebafd42133efdca535b04ccb338ab29467b3f7bf79569883676fc628db"}, + {file = "charset_normalizer-3.4.6-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:bbc8c8650c6e51041ad1be191742b8b421d05bbd3410f43fa2a00c8db87678e8"}, + {file = "charset_normalizer-3.4.6-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:22c6f0c2fbc31e76c3b8a86fba1a56eda6166e238c29cdd3d14befdb4a4e4815"}, + {file = "charset_normalizer-3.4.6-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7edbed096e4a4798710ed6bc75dcaa2a21b68b6c356553ac4823c3658d53743a"}, + {file = "charset_normalizer-3.4.6-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:7f9019c9cb613f084481bd6a100b12e1547cf2efe362d873c2e31e4035a6fa43"}, + {file = "charset_normalizer-3.4.6-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:58c948d0d086229efc484fe2f30c2d382c86720f55cd9bc33591774348ad44e0"}, + {file = "charset_normalizer-3.4.6-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:419a9d91bd238052642a51938af8ac05da5b3343becde08d5cdeab9046df9ee1"}, + {file = "charset_normalizer-3.4.6-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:5273b9f0b5835ff0350c0828faea623c68bfa65b792720c453e22b25cc72930f"}, + {file = "charset_normalizer-3.4.6-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:0e901eb1049fdb80f5bd11ed5ea1e498ec423102f7a9b9e4645d5b8204ff2815"}, + {file = "charset_normalizer-3.4.6-cp314-cp314-win32.whl", hash = "sha256:b4ff1d35e8c5bd078be89349b6f3a845128e685e751b6ea1169cf2160b344c4d"}, + {file = "charset_normalizer-3.4.6-cp314-cp314-win_amd64.whl", hash = "sha256:74119174722c4349af9708993118581686f343adc1c8c9c007d59be90d077f3f"}, + {file = "charset_normalizer-3.4.6-cp314-cp314-win_arm64.whl", hash = "sha256:e5bcc1a1ae744e0bb59641171ae53743760130600da8db48cbb6e4918e186e4e"}, + {file = "charset_normalizer-3.4.6-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:ad8faf8df23f0378c6d527d8b0b15ea4a2e23c89376877c598c4870d1b2c7866"}, + {file = "charset_normalizer-3.4.6-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f5ea69428fa1b49573eef0cc44a1d43bebd45ad0c611eb7d7eac760c7ae771bc"}, + {file = "charset_normalizer-3.4.6-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:06a7e86163334edfc5d20fe104db92fcd666e5a5df0977cb5680a506fe26cc8e"}, + {file = "charset_normalizer-3.4.6-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e1f6e2f00a6b8edb562826e4632e26d063ac10307e80f7461f7de3ad8ef3f077"}, + {file = "charset_normalizer-3.4.6-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:95b52c68d64c1878818687a473a10547b3292e82b6f6fe483808fb1468e2f52f"}, + {file = "charset_normalizer-3.4.6-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:7504e9b7dc05f99a9bbb4525c67a2c155073b44d720470a148b34166a69c054e"}, + {file = "charset_normalizer-3.4.6-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:172985e4ff804a7ad08eebec0a1640ece87ba5041d565fff23c8f99c1f389484"}, + {file = "charset_normalizer-3.4.6-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:4be9f4830ba8741527693848403e2c457c16e499100963ec711b1c6f2049b7c7"}, + {file = "charset_normalizer-3.4.6-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:79090741d842f564b1b2827c0b82d846405b744d31e84f18d7a7b41c20e473ff"}, + {file = "charset_normalizer-3.4.6-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:87725cfb1a4f1f8c2fc9890ae2f42094120f4b44db9360be5d99a4c6b0e03a9e"}, + {file = "charset_normalizer-3.4.6-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:fcce033e4021347d80ed9c66dcf1e7b1546319834b74445f561d2e2221de5659"}, + {file = "charset_normalizer-3.4.6-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:ca0276464d148c72defa8bb4390cce01b4a0e425f3b50d1435aa6d7a18107602"}, + {file = "charset_normalizer-3.4.6-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:197c1a244a274bb016dd8b79204850144ef77fe81c5b797dc389327adb552407"}, + {file = "charset_normalizer-3.4.6-cp314-cp314t-win32.whl", hash = "sha256:2a24157fa36980478dd1770b585c0f30d19e18f4fb0c47c13aa568f871718579"}, + {file = "charset_normalizer-3.4.6-cp314-cp314t-win_amd64.whl", hash = "sha256:cd5e2801c89992ed8c0a3f0293ae83c159a60d9a5d685005383ef4caca77f2c4"}, + {file = "charset_normalizer-3.4.6-cp314-cp314t-win_arm64.whl", hash = "sha256:47955475ac79cc504ef2704b192364e51d0d473ad452caedd0002605f780101c"}, + {file = "charset_normalizer-3.4.6-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:659a1e1b500fac8f2779dd9e1570464e012f43e580371470b45277a27baa7532"}, + {file = "charset_normalizer-3.4.6-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f61aa92e4aad0be58eb6eb4e0c21acf32cf8065f4b2cae5665da756c4ceef982"}, + {file = "charset_normalizer-3.4.6-cp38-cp38-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f50498891691e0864dc3da965f340fada0771f6142a378083dc4608f4ea513e2"}, + {file = "charset_normalizer-3.4.6-cp38-cp38-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:bf625105bb9eef28a56a943fec8c8a98aeb80e7d7db99bd3c388137e6eb2d237"}, + {file = "charset_normalizer-3.4.6-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2bd9d128ef93637a5d7a6af25363cf5dec3fa21cf80e68055aad627f280e8afa"}, + {file = "charset_normalizer-3.4.6-cp38-cp38-manylinux_2_31_armv7l.whl", hash = "sha256:d08ec48f0a1c48d75d0356cea971921848fb620fdeba805b28f937e90691209f"}, + {file = "charset_normalizer-3.4.6-cp38-cp38-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1ed80ff870ca6de33f4d953fda4d55654b9a2b340ff39ab32fa3adbcd718f264"}, + {file = "charset_normalizer-3.4.6-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:f98059e4fcd3e3e4e2d632b7cf81c2faae96c43c60b569e9c621468082f1d104"}, + {file = "charset_normalizer-3.4.6-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:ab30e5e3e706e3063bc6de96b118688cb10396b70bb9864a430f67df98c61ecc"}, + {file = "charset_normalizer-3.4.6-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:d5f5d1e9def3405f60e3ca8232d56f35c98fb7bf581efcc60051ebf53cb8b611"}, + {file = "charset_normalizer-3.4.6-cp38-cp38-musllinux_1_2_riscv64.whl", hash = "sha256:461598cd852bfa5a61b09cae2b1c02e2efcd166ee5516e243d540ac24bfa68a7"}, + {file = "charset_normalizer-3.4.6-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:71be7e0e01753a89cf024abf7ecb6bca2c81738ead80d43004d9b5e3f1244e64"}, + {file = "charset_normalizer-3.4.6-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:df01808ee470038c3f8dc4f48620df7225c49c2d6639e38f96e6d6ac6e6f7b0e"}, + {file = "charset_normalizer-3.4.6-cp38-cp38-win32.whl", hash = "sha256:69dd852c2f0ad631b8b60cfbe25a28c0058a894de5abb566619c205ce0550eae"}, + {file = "charset_normalizer-3.4.6-cp38-cp38-win_amd64.whl", hash = "sha256:517ad0e93394ac532745129ceabdf2696b609ec9f87863d337140317ebce1c14"}, + {file = "charset_normalizer-3.4.6-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:31215157227939b4fb3d740cd23fe27be0439afef67b785a1eb78a3ae69cba9e"}, + {file = "charset_normalizer-3.4.6-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ecbbd45615a6885fe3240eb9db73b9e62518b611850fdf8ab08bd56de7ad2b17"}, + {file = "charset_normalizer-3.4.6-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c45a03a4c69820a399f1dda9e1d8fbf3562eda46e7720458180302021b08f778"}, + {file = "charset_normalizer-3.4.6-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e8aeb10fcbe92767f0fa69ad5a72deca50d0dca07fbde97848997d778a50c9fe"}, + {file = "charset_normalizer-3.4.6-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:54fae94be3d75f3e573c9a1b5402dc593de19377013c9a0e4285e3d402dd3a2a"}, + {file = "charset_normalizer-3.4.6-cp39-cp39-manylinux_2_31_armv7l.whl", hash = "sha256:2f7fdd9b6e6c529d6a2501a2d36b240109e78a8ceaef5687cfcfa2bbe671d297"}, + {file = "charset_normalizer-3.4.6-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4d1d02209e06550bdaef34af58e041ad71b88e624f5d825519da3a3308e22687"}, + {file = "charset_normalizer-3.4.6-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8bc5f0687d796c05b1e28ab0d38a50e6309906ee09375dd3aff6a9c09dd6e8f4"}, + {file = "charset_normalizer-3.4.6-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:ee4ec14bc1680d6b0afab9aea2ef27e26d2024f18b24a2d7155a52b60da7e833"}, + {file = "charset_normalizer-3.4.6-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:d1a2ee9c1499fc8f86f4521f27a973c914b211ffa87322f4ee33bb35392da2c5"}, + {file = "charset_normalizer-3.4.6-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:48696db7f18afb80a068821504296eb0787d9ce239b91ca15059d1d3eaacf13b"}, + {file = "charset_normalizer-3.4.6-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:4f41da960b196ea355357285ad1316a00099f22d0929fe168343b99b254729c9"}, + {file = "charset_normalizer-3.4.6-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:802168e03fba8bbc5ce0d866d589e4b1ca751d06edee69f7f3a19c5a9fe6b597"}, + {file = "charset_normalizer-3.4.6-cp39-cp39-win32.whl", hash = "sha256:8761ac29b6c81574724322a554605608a9960769ea83d2c73e396f3df896ad54"}, + {file = "charset_normalizer-3.4.6-cp39-cp39-win_amd64.whl", hash = "sha256:1cf0a70018692f85172348fe06d3a4b63f94ecb055e13a00c644d368eb82e5b8"}, + {file = "charset_normalizer-3.4.6-cp39-cp39-win_arm64.whl", hash = "sha256:3516bbb8d42169de9e61b8520cbeeeb716f12f4ecfe3fd30a9919aa16c806ca8"}, + {file = "charset_normalizer-3.4.6-py3-none-any.whl", hash = "sha256:947cf925bc916d90adba35a64c82aace04fa39b46b52d4630ece166655905a69"}, + {file = "charset_normalizer-3.4.6.tar.gz", hash = "sha256:1ae6b62897110aa7c79ea2f5dd38d1abca6db663687c0b1ad9aed6f6bae3d9d6"}, ] [[package]] @@ -177,118 +193,118 @@ markers = {main = "platform_system == \"Windows\"", dev = "sys_platform == \"win [[package]] name = "coverage" -version = "7.13.4" +version = "7.13.5" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "coverage-7.13.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0fc31c787a84f8cd6027eba44010517020e0d18487064cd3d8968941856d1415"}, - {file = "coverage-7.13.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a32ebc02a1805adf637fc8dec324b5cdacd2e493515424f70ee33799573d661b"}, - {file = "coverage-7.13.4-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:e24f9156097ff9dc286f2f913df3a7f63c0e333dcafa3c196f2c18b4175ca09a"}, - {file = "coverage-7.13.4-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8041b6c5bfdc03257666e9881d33b1abc88daccaf73f7b6340fb7946655cd10f"}, - {file = "coverage-7.13.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2a09cfa6a5862bc2fc6ca7c3def5b2926194a56b8ab78ffcf617d28911123012"}, - {file = "coverage-7.13.4-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:296f8b0af861d3970c2a4d8c91d48eb4dd4771bcef9baedec6a9b515d7de3def"}, - {file = "coverage-7.13.4-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e101609bcbbfb04605ea1027b10dc3735c094d12d40826a60f897b98b1c30256"}, - {file = "coverage-7.13.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:aa3feb8db2e87ff5e6d00d7e1480ae241876286691265657b500886c98f38bda"}, - {file = "coverage-7.13.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:4fc7fa81bbaf5a02801b65346c8b3e657f1d93763e58c0abdf7c992addd81a92"}, - {file = "coverage-7.13.4-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:33901f604424145c6e9c2398684b92e176c0b12df77d52db81c20abd48c3794c"}, - {file = "coverage-7.13.4-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:bb28c0f2cf2782508a40cec377935829d5fcc3ad9a3681375af4e84eb34b6b58"}, - {file = "coverage-7.13.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9d107aff57a83222ddbd8d9ee705ede2af2cc926608b57abed8ef96b50b7e8f9"}, - {file = "coverage-7.13.4-cp310-cp310-win32.whl", hash = "sha256:a6f94a7d00eb18f1b6d403c91a88fd58cfc92d4b16080dfdb774afc8294469bf"}, - {file = "coverage-7.13.4-cp310-cp310-win_amd64.whl", hash = "sha256:2cb0f1e000ebc419632bbe04366a8990b6e32c4e0b51543a6484ffe15eaeda95"}, - {file = "coverage-7.13.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d490ba50c3f35dd7c17953c68f3270e7ccd1c6642e2d2afe2d8e720b98f5a053"}, - {file = "coverage-7.13.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:19bc3c88078789f8ef36acb014d7241961dbf883fd2533d18cb1e7a5b4e28b11"}, - {file = "coverage-7.13.4-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3998e5a32e62fdf410c0dbd3115df86297995d6e3429af80b8798aad894ca7aa"}, - {file = "coverage-7.13.4-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8e264226ec98e01a8e1054314af91ee6cde0eacac4f465cc93b03dbe0bce2fd7"}, - {file = "coverage-7.13.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a3aa4e7b9e416774b21797365b358a6e827ffadaaca81b69ee02946852449f00"}, - {file = "coverage-7.13.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:71ca20079dd8f27fcf808817e281e90220475cd75115162218d0e27549f95fef"}, - {file = "coverage-7.13.4-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e2f25215f1a359ab17320b47bcdaca3e6e6356652e8256f2441e4ef972052903"}, - {file = "coverage-7.13.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d65b2d373032411e86960604dc4edac91fdfb5dca539461cf2cbe78327d1e64f"}, - {file = "coverage-7.13.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:94eb63f9b363180aff17de3e7c8760c3ba94664ea2695c52f10111244d16a299"}, - {file = "coverage-7.13.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e856bf6616714c3a9fbc270ab54103f4e685ba236fa98c054e8f87f266c93505"}, - {file = "coverage-7.13.4-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:65dfcbe305c3dfe658492df2d85259e0d79ead4177f9ae724b6fb245198f55d6"}, - {file = "coverage-7.13.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b507778ae8a4c915436ed5c2e05b4a6cecfa70f734e19c22a005152a11c7b6a9"}, - {file = "coverage-7.13.4-cp311-cp311-win32.whl", hash = "sha256:784fc3cf8be001197b652d51d3fd259b1e2262888693a4636e18879f613a62a9"}, - {file = "coverage-7.13.4-cp311-cp311-win_amd64.whl", hash = "sha256:2421d591f8ca05b308cf0092807308b2facbefe54af7c02ac22548b88b95c98f"}, - {file = "coverage-7.13.4-cp311-cp311-win_arm64.whl", hash = "sha256:79e73a76b854d9c6088fe5d8b2ebe745f8681c55f7397c3c0a016192d681045f"}, - {file = "coverage-7.13.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:02231499b08dabbe2b96612993e5fc34217cdae907a51b906ac7fca8027a4459"}, - {file = "coverage-7.13.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40aa8808140e55dc022b15d8aa7f651b6b3d68b365ea0398f1441e0b04d859c3"}, - {file = "coverage-7.13.4-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5b856a8ccf749480024ff3bd7310adaef57bf31fd17e1bfc404b7940b6986634"}, - {file = "coverage-7.13.4-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2c048ea43875fbf8b45d476ad79f179809c590ec7b79e2035c662e7afa3192e3"}, - {file = "coverage-7.13.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b7b38448866e83176e28086674fe7368ab8590e4610fb662b44e345b86d63ffa"}, - {file = "coverage-7.13.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:de6defc1c9badbf8b9e67ae90fd00519186d6ab64e5cc5f3d21359c2a9b2c1d3"}, - {file = "coverage-7.13.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7eda778067ad7ffccd23ecffce537dface96212576a07924cbf0d8799d2ded5a"}, - {file = "coverage-7.13.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e87f6c587c3f34356c3759f0420693e35e7eb0e2e41e4c011cb6ec6ecbbf1db7"}, - {file = "coverage-7.13.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:8248977c2e33aecb2ced42fef99f2d319e9904a36e55a8a68b69207fb7e43edc"}, - {file = "coverage-7.13.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:25381386e80ae727608e662474db537d4df1ecd42379b5ba33c84633a2b36d47"}, - {file = "coverage-7.13.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:ee756f00726693e5ba94d6df2bdfd64d4852d23b09bb0bc700e3b30e6f333985"}, - {file = "coverage-7.13.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fdfc1e28e7c7cdce44985b3043bc13bbd9c747520f94a4d7164af8260b3d91f0"}, - {file = "coverage-7.13.4-cp312-cp312-win32.whl", hash = "sha256:01d4cbc3c283a17fc1e42d614a119f7f438eabb593391283adca8dc86eff1246"}, - {file = "coverage-7.13.4-cp312-cp312-win_amd64.whl", hash = "sha256:9401ebc7ef522f01d01d45532c68c5ac40fb27113019b6b7d8b208f6e9baa126"}, - {file = "coverage-7.13.4-cp312-cp312-win_arm64.whl", hash = "sha256:b1ec7b6b6e93255f952e27ab58fbc68dcc468844b16ecbee881aeb29b6ab4d8d"}, - {file = "coverage-7.13.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b66a2da594b6068b48b2692f043f35d4d3693fb639d5ea8b39533c2ad9ac3ab9"}, - {file = "coverage-7.13.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3599eb3992d814d23b35c536c28df1a882caa950f8f507cef23d1cbf334995ac"}, - {file = "coverage-7.13.4-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:93550784d9281e374fb5a12bf1324cc8a963fd63b2d2f223503ef0fd4aa339ea"}, - {file = "coverage-7.13.4-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b720ce6a88a2755f7c697c23268ddc47a571b88052e6b155224347389fdf6a3b"}, - {file = "coverage-7.13.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7b322db1284a2ed3aa28ffd8ebe3db91c929b7a333c0820abec3d838ef5b3525"}, - {file = "coverage-7.13.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f4594c67d8a7c89cf922d9df0438c7c7bb022ad506eddb0fdb2863359ff78242"}, - {file = "coverage-7.13.4-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:53d133df809c743eb8bce33b24bcababb371f4441340578cd406e084d94a6148"}, - {file = "coverage-7.13.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:76451d1978b95ba6507a039090ba076105c87cc76fc3efd5d35d72093964d49a"}, - {file = "coverage-7.13.4-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:7f57b33491e281e962021de110b451ab8a24182589be17e12a22c79047935e23"}, - {file = "coverage-7.13.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:1731dc33dc276dafc410a885cbf5992f1ff171393e48a21453b78727d090de80"}, - {file = "coverage-7.13.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:bd60d4fe2f6fa7dff9223ca1bbc9f05d2b6697bc5961072e5d3b952d46e1b1ea"}, - {file = "coverage-7.13.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9181a3ccead280b828fae232df12b16652702b49d41e99d657f46cc7b1f6ec7a"}, - {file = "coverage-7.13.4-cp313-cp313-win32.whl", hash = "sha256:f53d492307962561ac7de4cd1de3e363589b000ab69617c6156a16ba7237998d"}, - {file = "coverage-7.13.4-cp313-cp313-win_amd64.whl", hash = "sha256:e6f70dec1cc557e52df5306d051ef56003f74d56e9c4dd7ddb07e07ef32a84dd"}, - {file = "coverage-7.13.4-cp313-cp313-win_arm64.whl", hash = "sha256:fb07dc5da7e849e2ad31a5d74e9bece81f30ecf5a42909d0a695f8bd1874d6af"}, - {file = "coverage-7.13.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:40d74da8e6c4b9ac18b15331c4b5ebc35a17069410cad462ad4f40dcd2d50c0d"}, - {file = "coverage-7.13.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4223b4230a376138939a9173f1bdd6521994f2aff8047fae100d6d94d50c5a12"}, - {file = "coverage-7.13.4-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:1d4be36a5114c499f9f1f9195e95ebf979460dbe2d88e6816ea202010ba1c34b"}, - {file = "coverage-7.13.4-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:200dea7d1e8095cc6e98cdabe3fd1d21ab17d3cee6dab00cadbb2fe35d9c15b9"}, - {file = "coverage-7.13.4-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b8eb931ee8e6d8243e253e5ed7336deea6904369d2fd8ae6e43f68abbf167092"}, - {file = "coverage-7.13.4-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:75eab1ebe4f2f64d9509b984f9314d4aa788540368218b858dad56dc8f3e5eb9"}, - {file = "coverage-7.13.4-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c35eb28c1d085eb7d8c9b3296567a1bebe03ce72962e932431b9a61f28facf26"}, - {file = "coverage-7.13.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:eb88b316ec33760714a4720feb2816a3a59180fd58c1985012054fa7aebee4c2"}, - {file = "coverage-7.13.4-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:7d41eead3cc673cbd38a4417deb7fd0b4ca26954ff7dc6078e33f6ff97bed940"}, - {file = "coverage-7.13.4-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:fb26a934946a6afe0e326aebe0730cdff393a8bc0bbb65a2f41e30feddca399c"}, - {file = "coverage-7.13.4-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:dae88bc0fc77edaa65c14be099bd57ee140cf507e6bfdeea7938457ab387efb0"}, - {file = "coverage-7.13.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:845f352911777a8e722bfce168958214951e07e47e5d5d9744109fa5fe77f79b"}, - {file = "coverage-7.13.4-cp313-cp313t-win32.whl", hash = "sha256:2fa8d5f8de70688a28240de9e139fa16b153cc3cbb01c5f16d88d6505ebdadf9"}, - {file = "coverage-7.13.4-cp313-cp313t-win_amd64.whl", hash = "sha256:9351229c8c8407645840edcc277f4a2d44814d1bc34a2128c11c2a031d45a5dd"}, - {file = "coverage-7.13.4-cp313-cp313t-win_arm64.whl", hash = "sha256:30b8d0512f2dc8c8747557e8fb459d6176a2c9e5731e2b74d311c03b78451997"}, - {file = "coverage-7.13.4-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:300deaee342f90696ed186e3a00c71b5b3d27bffe9e827677954f4ee56969601"}, - {file = "coverage-7.13.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:29e3220258d682b6226a9b0925bc563ed9a1ebcff3cad30f043eceea7eaf2689"}, - {file = "coverage-7.13.4-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:391ee8f19bef69210978363ca930f7328081c6a0152f1166c91f0b5fdd2a773c"}, - {file = "coverage-7.13.4-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0dd7ab8278f0d58a0128ba2fca25824321f05d059c1441800e934ff2efa52129"}, - {file = "coverage-7.13.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:78cdf0d578b15148b009ccf18c686aa4f719d887e76e6b40c38ffb61d264a552"}, - {file = "coverage-7.13.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:48685fee12c2eb3b27c62f2658e7ea21e9c3239cba5a8a242801a0a3f6a8c62a"}, - {file = "coverage-7.13.4-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4e83efc079eb39480e6346a15a1bcb3e9b04759c5202d157e1dd4303cd619356"}, - {file = "coverage-7.13.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ecae9737b72408d6a950f7e525f30aca12d4bd8dd95e37342e5beb3a2a8c4f71"}, - {file = "coverage-7.13.4-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:ae4578f8528569d3cf303fef2ea569c7f4c4059a38c8667ccef15c6e1f118aa5"}, - {file = "coverage-7.13.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:6fdef321fdfbb30a197efa02d48fcd9981f0d8ad2ae8903ac318adc653f5df98"}, - {file = "coverage-7.13.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2b0f6ccf3dbe577170bebfce1318707d0e8c3650003cb4b3a9dd744575daa8b5"}, - {file = "coverage-7.13.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:75fcd519f2a5765db3f0e391eb3b7d150cce1a771bf4c9f861aeab86c767a3c0"}, - {file = "coverage-7.13.4-cp314-cp314-win32.whl", hash = "sha256:8e798c266c378da2bd819b0677df41ab46d78065fb2a399558f3f6cae78b2fbb"}, - {file = "coverage-7.13.4-cp314-cp314-win_amd64.whl", hash = "sha256:245e37f664d89861cf2329c9afa2c1fe9e6d4e1a09d872c947e70718aeeac505"}, - {file = "coverage-7.13.4-cp314-cp314-win_arm64.whl", hash = "sha256:ad27098a189e5838900ce4c2a99f2fe42a0bf0c2093c17c69b45a71579e8d4a2"}, - {file = "coverage-7.13.4-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:85480adfb35ffc32d40918aad81b89c69c9cc5661a9b8a81476d3e645321a056"}, - {file = "coverage-7.13.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:79be69cf7f3bf9b0deeeb062eab7ac7f36cd4cc4c4dd694bd28921ba4d8596cc"}, - {file = "coverage-7.13.4-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:caa421e2684e382c5d8973ac55e4f36bed6821a9bad5c953494de960c74595c9"}, - {file = "coverage-7.13.4-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:14375934243ee05f56c45393fe2ce81fe5cc503c07cee2bdf1725fb8bef3ffaf"}, - {file = "coverage-7.13.4-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:25a41c3104d08edb094d9db0d905ca54d0cd41c928bb6be3c4c799a54753af55"}, - {file = "coverage-7.13.4-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6f01afcff62bf9a08fb32b2c1d6e924236c0383c02c790732b6537269e466a72"}, - {file = "coverage-7.13.4-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:eb9078108fbf0bcdde37c3f4779303673c2fa1fe8f7956e68d447d0dd426d38a"}, - {file = "coverage-7.13.4-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:0e086334e8537ddd17e5f16a344777c1ab8194986ec533711cbe6c41cde841b6"}, - {file = "coverage-7.13.4-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:725d985c5ab621268b2edb8e50dfe57633dc69bda071abc470fed55a14935fd3"}, - {file = "coverage-7.13.4-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:3c06f0f1337c667b971ca2f975523347e63ec5e500b9aa5882d91931cd3ef750"}, - {file = "coverage-7.13.4-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:590c0ed4bf8e85f745e6b805b2e1c457b2e33d5255dd9729743165253bc9ad39"}, - {file = "coverage-7.13.4-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:eb30bf180de3f632cd043322dad5751390e5385108b2807368997d1a92a509d0"}, - {file = "coverage-7.13.4-cp314-cp314t-win32.whl", hash = "sha256:c4240e7eded42d131a2d2c4dec70374b781b043ddc79a9de4d55ca71f8e98aea"}, - {file = "coverage-7.13.4-cp314-cp314t-win_amd64.whl", hash = "sha256:4c7d3cc01e7350f2f0f6f7036caaf5673fb56b6998889ccfe9e1c1fe75a9c932"}, - {file = "coverage-7.13.4-cp314-cp314t-win_arm64.whl", hash = "sha256:23e3f687cf945070d1c90f85db66d11e3025665d8dafa831301a0e0038f3db9b"}, - {file = "coverage-7.13.4-py3-none-any.whl", hash = "sha256:1af1641e57cf7ba1bd67d677c9abdbcd6cc2ab7da3bca7fa1e2b7e50e65f2ad0"}, - {file = "coverage-7.13.4.tar.gz", hash = "sha256:e5c8f6ed1e61a8b2dcdf31eb0b9bbf0130750ca79c1c49eb898e2ad86f5ccc91"}, + {file = "coverage-7.13.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e0723d2c96324561b9aa76fb982406e11d93cdb388a7a7da2b16e04719cf7ca5"}, + {file = "coverage-7.13.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:52f444e86475992506b32d4e5ca55c24fc88d73bcbda0e9745095b28ef4dc0cf"}, + {file = "coverage-7.13.5-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:704de6328e3d612a8f6c07000a878ff38181ec3263d5a11da1db294fa6a9bdf8"}, + {file = "coverage-7.13.5-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a1a6d79a14e1ec1832cabc833898636ad5f3754a678ef8bb4908515208bf84f4"}, + {file = "coverage-7.13.5-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:79060214983769c7ba3f0cee10b54c97609dca4d478fa1aa32b914480fd5738d"}, + {file = "coverage-7.13.5-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:356e76b46783a98c2a2fe81ec79df4883a1e62895ea952968fb253c114e7f930"}, + {file = "coverage-7.13.5-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0cef0cdec915d11254a7f549c1170afecce708d30610c6abdded1f74e581666d"}, + {file = "coverage-7.13.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:dc022073d063b25a402454e5712ef9e007113e3a676b96c5f29b2bda29352f40"}, + {file = "coverage-7.13.5-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:9b74db26dfea4f4e50d48a4602207cd1e78be33182bc9cbf22da94f332f99878"}, + {file = "coverage-7.13.5-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ad146744ca4fd09b50c482650e3c1b1f4dfa1d4792e0a04a369c7f23336f0400"}, + {file = "coverage-7.13.5-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:c555b48be1853fe3997c11c4bd521cdd9a9612352de01fa4508f16ec341e6fe0"}, + {file = "coverage-7.13.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7034b5c56a58ae5e85f23949d52c14aca2cfc6848a31764995b7de88f13a1ea0"}, + {file = "coverage-7.13.5-cp310-cp310-win32.whl", hash = "sha256:eb7fdf1ef130660e7415e0253a01a7d5a88c9c4d158bcf75cbbd922fd65a5b58"}, + {file = "coverage-7.13.5-cp310-cp310-win_amd64.whl", hash = "sha256:3e1bb5f6c78feeb1be3475789b14a0f0a5b47d505bfc7267126ccbd50289999e"}, + {file = "coverage-7.13.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:66a80c616f80181f4d643b0f9e709d97bcea413ecd9631e1dedc7401c8e6695d"}, + {file = "coverage-7.13.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:145ede53ccbafb297c1c9287f788d1bc3efd6c900da23bf6931b09eafc931587"}, + {file = "coverage-7.13.5-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:0672854dc733c342fa3e957e0605256d2bf5934feeac328da9e0b5449634a642"}, + {file = "coverage-7.13.5-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:ec10e2a42b41c923c2209b846126c6582db5e43a33157e9870ba9fb70dc7854b"}, + {file = "coverage-7.13.5-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:be3d4bbad9d4b037791794ddeedd7d64a56f5933a2c1373e18e9e568b9141686"}, + {file = "coverage-7.13.5-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4d2afbc5cc54d286bfb54541aa50b64cdb07a718227168c87b9e2fb8f25e1743"}, + {file = "coverage-7.13.5-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3ad050321264c49c2fa67bb599100456fc51d004b82534f379d16445da40fb75"}, + {file = "coverage-7.13.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7300c8a6d13335b29bb76d7651c66af6bd8658517c43499f110ddc6717bfc209"}, + {file = "coverage-7.13.5-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:eb07647a5738b89baab047f14edd18ded523de60f3b30e75c2acc826f79c839a"}, + {file = "coverage-7.13.5-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:9adb6688e3b53adffefd4a52d72cbd8b02602bfb8f74dcd862337182fd4d1a4e"}, + {file = "coverage-7.13.5-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:7c8d4bc913dd70b93488d6c496c77f3aff5ea99a07e36a18f865bca55adef8bd"}, + {file = "coverage-7.13.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0e3c426ffc4cd952f54ee9ffbdd10345709ecc78a3ecfd796a57236bfad0b9b8"}, + {file = "coverage-7.13.5-cp311-cp311-win32.whl", hash = "sha256:259b69bb83ad9894c4b25be2528139eecba9a82646ebdda2d9db1ba28424a6bf"}, + {file = "coverage-7.13.5-cp311-cp311-win_amd64.whl", hash = "sha256:258354455f4e86e3e9d0d17571d522e13b4e1e19bf0f8596bcf9476d61e7d8a9"}, + {file = "coverage-7.13.5-cp311-cp311-win_arm64.whl", hash = "sha256:bff95879c33ec8da99fc9b6fe345ddb5be6414b41d6d1ad1c8f188d26f36e028"}, + {file = "coverage-7.13.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:460cf0114c5016fa841214ff5564aa4864f11948da9440bc97e21ad1f4ba1e01"}, + {file = "coverage-7.13.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0e223ce4b4ed47f065bfb123687686512e37629be25cc63728557ae7db261422"}, + {file = "coverage-7.13.5-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:6e3370441f4513c6252bf042b9c36d22491142385049243253c7e48398a15a9f"}, + {file = "coverage-7.13.5-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:03ccc709a17a1de074fb1d11f217342fb0d2b1582ed544f554fc9fc3f07e95f5"}, + {file = "coverage-7.13.5-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3f4818d065964db3c1c66dc0fbdac5ac692ecbc875555e13374fdbe7eedb4376"}, + {file = "coverage-7.13.5-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:012d5319e66e9d5a218834642d6c35d265515a62f01157a45bcc036ecf947256"}, + {file = "coverage-7.13.5-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8dd02af98971bdb956363e4827d34425cb3df19ee550ef92855b0acb9c7ce51c"}, + {file = "coverage-7.13.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f08fd75c50a760c7eb068ae823777268daaf16a80b918fa58eea888f8e3919f5"}, + {file = "coverage-7.13.5-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:843ea8643cf967d1ac7e8ecd4bb00c99135adf4816c0c0593fdcc47b597fcf09"}, + {file = "coverage-7.13.5-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:9d44d7aa963820b1b971dbecd90bfe5fe8f81cff79787eb6cca15750bd2f79b9"}, + {file = "coverage-7.13.5-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:7132bed4bd7b836200c591410ae7d97bf7ae8be6fc87d160b2bd881df929e7bf"}, + {file = "coverage-7.13.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a698e363641b98843c517817db75373c83254781426e94ada3197cabbc2c919c"}, + {file = "coverage-7.13.5-cp312-cp312-win32.whl", hash = "sha256:bdba0a6b8812e8c7df002d908a9a2ea3c36e92611b5708633c50869e6d922fdf"}, + {file = "coverage-7.13.5-cp312-cp312-win_amd64.whl", hash = "sha256:d2c87e0c473a10bffe991502eac389220533024c8082ec1ce849f4218dded810"}, + {file = "coverage-7.13.5-cp312-cp312-win_arm64.whl", hash = "sha256:bf69236a9a81bdca3bff53796237aab096cdbf8d78a66ad61e992d9dac7eb2de"}, + {file = "coverage-7.13.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5ec4af212df513e399cf11610cc27063f1586419e814755ab362e50a85ea69c1"}, + {file = "coverage-7.13.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:941617e518602e2d64942c88ec8499f7fbd49d3f6c4327d3a71d43a1973032f3"}, + {file = "coverage-7.13.5-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:da305e9937617ee95c2e39d8ff9f040e0487cbf1ac174f777ed5eddd7a7c1f26"}, + {file = "coverage-7.13.5-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:78e696e1cc714e57e8b25760b33a8b1026b7048d270140d25dafe1b0a1ee05a3"}, + {file = "coverage-7.13.5-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:02ca0eed225b2ff301c474aeeeae27d26e2537942aa0f87491d3e147e784a82b"}, + {file = "coverage-7.13.5-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:04690832cbea4e4663d9149e05dba142546ca05cb1848816760e7f58285c970a"}, + {file = "coverage-7.13.5-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0590e44dd2745c696a778f7bab6aa95256de2cbc8b8cff4f7db8ff09813d6969"}, + {file = "coverage-7.13.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d7cfad2d6d81dd298ab6b89fe72c3b7b05ec7544bdda3b707ddaecff8d25c161"}, + {file = "coverage-7.13.5-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:e092b9499de38ae0fbfbc603a74660eb6ff3e869e507b50d85a13b6db9863e15"}, + {file = "coverage-7.13.5-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:48c39bc4a04d983a54a705a6389512883d4a3b9862991b3617d547940e9f52b1"}, + {file = "coverage-7.13.5-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:2d3807015f138ffea1ed9afeeb8624fd781703f2858b62a8dd8da5a0994c57b6"}, + {file = "coverage-7.13.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ee2aa19e03161671ec964004fb74b2257805d9710bf14a5c704558b9d8dbaf17"}, + {file = "coverage-7.13.5-cp313-cp313-win32.whl", hash = "sha256:ce1998c0483007608c8382f4ff50164bfc5bd07a2246dd272aa4043b75e61e85"}, + {file = "coverage-7.13.5-cp313-cp313-win_amd64.whl", hash = "sha256:631efb83f01569670a5e866ceb80fe483e7c159fac6f167e6571522636104a0b"}, + {file = "coverage-7.13.5-cp313-cp313-win_arm64.whl", hash = "sha256:f4cd16206ad171cbc2470dbea9103cf9a7607d5fe8c242fdf1edf36174020664"}, + {file = "coverage-7.13.5-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0428cbef5783ad91fe240f673cc1f76b25e74bbfe1a13115e4aa30d3f538162d"}, + {file = "coverage-7.13.5-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e0b216a19534b2427cc201a26c25da4a48633f29a487c61258643e89d28200c0"}, + {file = "coverage-7.13.5-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:972a9cd27894afe4bc2b1480107054e062df08e671df7c2f18c205e805ccd806"}, + {file = "coverage-7.13.5-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:4b59148601efcd2bac8c4dbf1f0ad6391693ccf7a74b8205781751637076aee3"}, + {file = "coverage-7.13.5-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:505d7083c8b0c87a8fa8c07370c285847c1f77739b22e299ad75a6af6c32c5c9"}, + {file = "coverage-7.13.5-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:60365289c3741e4db327e7baff2a4aaacf22f788e80fa4683393891b70a89fbd"}, + {file = "coverage-7.13.5-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1b88c69c8ef5d4b6fe7dea66d6636056a0f6a7527c440e890cf9259011f5e606"}, + {file = "coverage-7.13.5-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:5b13955d31d1633cf9376908089b7cebe7d15ddad7aeaabcbe969a595a97e95e"}, + {file = "coverage-7.13.5-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:f70c9ab2595c56f81a89620e22899eea8b212a4041bd728ac6f4a28bf5d3ddd0"}, + {file = "coverage-7.13.5-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:084b84a8c63e8d6fc7e3931b316a9bcafca1458d753c539db82d31ed20091a87"}, + {file = "coverage-7.13.5-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:ad14385487393e386e2ea988b09d62dd42c397662ac2dabc3832d71253eee479"}, + {file = "coverage-7.13.5-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:7f2c47b36fe7709a6e83bfadf4eefb90bd25fbe4014d715224c4316f808e59a2"}, + {file = "coverage-7.13.5-cp313-cp313t-win32.whl", hash = "sha256:67e9bc5449801fad0e5dff329499fb090ba4c5800b86805c80617b4e29809b2a"}, + {file = "coverage-7.13.5-cp313-cp313t-win_amd64.whl", hash = "sha256:da86cdcf10d2519e10cabb8ac2de03da1bcb6e4853790b7fbd48523332e3a819"}, + {file = "coverage-7.13.5-cp313-cp313t-win_arm64.whl", hash = "sha256:0ecf12ecb326fe2c339d93fc131816f3a7367d223db37817208905c89bded911"}, + {file = "coverage-7.13.5-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:fbabfaceaeb587e16f7008f7795cd80d20ec548dc7f94fbb0d4ec2e038ce563f"}, + {file = "coverage-7.13.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:9bb2a28101a443669a423b665939381084412b81c3f8c0fcfbac57f4e30b5b8e"}, + {file = "coverage-7.13.5-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:bd3a2fbc1c6cccb3c5106140d87cc6a8715110373ef42b63cf5aea29df8c217a"}, + {file = "coverage-7.13.5-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:6c36ddb64ed9d7e496028d1d00dfec3e428e0aabf4006583bb1839958d280510"}, + {file = "coverage-7.13.5-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:380e8e9084d8eb38db3a9176a1a4f3c0082c3806fa0dc882d1d87abc3c789247"}, + {file = "coverage-7.13.5-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e808af52a0513762df4d945ea164a24b37f2f518cbe97e03deaa0ee66139b4d6"}, + {file = "coverage-7.13.5-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e301d30dd7e95ae068671d746ba8c34e945a82682e62918e41b2679acd2051a0"}, + {file = "coverage-7.13.5-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:800bc829053c80d240a687ceeb927a94fd108bbdc68dfbe505d0d75ab578a882"}, + {file = "coverage-7.13.5-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:0b67af5492adb31940ee418a5a655c28e48165da5afab8c7fa6fd72a142f8740"}, + {file = "coverage-7.13.5-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:c9136ff29c3a91e25b1d1552b5308e53a1e0653a23e53b6366d7c2dcbbaf8a16"}, + {file = "coverage-7.13.5-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:cff784eef7f0b8f6cb28804fbddcfa99f89efe4cc35fb5627e3ac58f91ed3ac0"}, + {file = "coverage-7.13.5-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:68a4953be99b17ac3c23b6efbc8a38330d99680c9458927491d18700ef23ded0"}, + {file = "coverage-7.13.5-cp314-cp314-win32.whl", hash = "sha256:35a31f2b1578185fbe6aa2e74cea1b1d0bbf4c552774247d9160d29b80ed56cc"}, + {file = "coverage-7.13.5-cp314-cp314-win_amd64.whl", hash = "sha256:2aa055ae1857258f9e0045be26a6d62bdb47a72448b62d7b55f4820f361a2633"}, + {file = "coverage-7.13.5-cp314-cp314-win_arm64.whl", hash = "sha256:1b11eef33edeae9d142f9b4358edb76273b3bfd30bc3df9a4f95d0e49caf94e8"}, + {file = "coverage-7.13.5-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:10a0c37f0b646eaff7cce1874c31d1f1ccb297688d4c747291f4f4c70741cc8b"}, + {file = "coverage-7.13.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b5db73ba3c41c7008037fa731ad5459fc3944cb7452fc0aa9f822ad3533c583c"}, + {file = "coverage-7.13.5-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:750db93a81e3e5a9831b534be7b1229df848b2e125a604fe6651e48aa070e5f9"}, + {file = "coverage-7.13.5-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9ddb4f4a5479f2539644be484da179b653273bca1a323947d48ab107b3ed1f29"}, + {file = "coverage-7.13.5-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8a7a2049c14f413163e2bdabd37e41179b1d1ccb10ffc6ccc4b7a718429c607"}, + {file = "coverage-7.13.5-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e1c85e0b6c05c592ea6d8768a66a254bfb3874b53774b12d4c89c481eb78cb90"}, + {file = "coverage-7.13.5-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:777c4d1eff1b67876139d24288aaf1817f6c03d6bae9c5cc8d27b83bcfe38fe3"}, + {file = "coverage-7.13.5-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:6697e29b93707167687543480a40f0db8f356e86d9f67ddf2e37e2dfd91a9dab"}, + {file = "coverage-7.13.5-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:8fdf453a942c3e4d99bd80088141c4c6960bb232c409d9c3558e2dbaa3998562"}, + {file = "coverage-7.13.5-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:32ca0c0114c9834a43f045a87dcebd69d108d8ffb666957ea65aa132f50332e2"}, + {file = "coverage-7.13.5-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:8769751c10f339021e2638cd354e13adeac54004d1941119b2c96fe5276d45ea"}, + {file = "coverage-7.13.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cec2d83125531bd153175354055cdb7a09987af08a9430bd173c937c6d0fba2a"}, + {file = "coverage-7.13.5-cp314-cp314t-win32.whl", hash = "sha256:0cd9ed7a8b181775459296e402ca4fb27db1279740a24e93b3b41942ebe4b215"}, + {file = "coverage-7.13.5-cp314-cp314t-win_amd64.whl", hash = "sha256:301e3b7dfefecaca37c9f1aa6f0049b7d4ab8dd933742b607765d757aca77d43"}, + {file = "coverage-7.13.5-cp314-cp314t-win_arm64.whl", hash = "sha256:9dacc2ad679b292709e0f5fc1ac74a6d4d5562e424058962c7bb0c658ad25e45"}, + {file = "coverage-7.13.5-py3-none-any.whl", hash = "sha256:34b02417cf070e173989b3db962f7ed56d2f644307b2cf9d5a0f258e13084a61"}, + {file = "coverage-7.13.5.tar.gz", hash = "sha256:c81f6515c4c40141f83f502b07bbfa5c240ba25bbe73da7b33f1e5b6120ff179"}, ] [package.extras] @@ -313,14 +329,14 @@ pyflakes = ">=3.4.0,<3.5.0" [[package]] name = "flask" -version = "3.1.2" +version = "3.1.3" description = "A simple framework for building complex web applications." optional = false python-versions = ">=3.9" groups = ["main"] files = [ - {file = "flask-3.1.2-py3-none-any.whl", hash = "sha256:ca1d8112ec8a6158cc29ea4858963350011b5c846a414cdb7a954aa9e967d03c"}, - {file = "flask-3.1.2.tar.gz", hash = "sha256:bf656c15c80190ed628ad08cdfd3aaa35beb087855e2f494910aa3774cc4fd87"}, + {file = "flask-3.1.3-py3-none-any.whl", hash = "sha256:f4bcbefc124291925f1a26446da31a5178f9483862233b23c0c96a20701f670c"}, + {file = "flask-3.1.3.tar.gz", hash = "sha256:0ef0e52b8a9cd932855379197dd8f94047b359ca0a78695144304cb45f87c9eb"}, ] [package.dependencies] @@ -337,14 +353,14 @@ dotenv = ["python-dotenv"] [[package]] name = "gunicorn" -version = "25.0.3" +version = "25.1.0" description = "WSGI HTTP Server for UNIX" optional = false python-versions = ">=3.10" groups = ["main"] files = [ - {file = "gunicorn-25.0.3-py3-none-any.whl", hash = "sha256:aca364c096c81ca11acd4cede0aaeea91ba76ca74e2c0d7f879154db9d890f35"}, - {file = "gunicorn-25.0.3.tar.gz", hash = "sha256:b53a7fff1a07b825b962af320554de44ae77a26abfa373711ff3f83d57d3506d"}, + {file = "gunicorn-25.1.0-py3-none-any.whl", hash = "sha256:d0b1236ccf27f72cfe14bce7caadf467186f19e865094ca84221424e839b8b8b"}, + {file = "gunicorn-25.1.0.tar.gz", hash = "sha256:1426611d959fa77e7de89f8c0f32eed6aa03ee735f98c01efba3e281b1c47616"}, ] [package.dependencies] @@ -569,6 +585,21 @@ files = [ dev = ["pre-commit", "tox"] testing = ["coverage", "pytest", "pytest-benchmark"] +[[package]] +name = "prometheus-client" +version = "0.23.1" +description = "Python client for the Prometheus monitoring system." +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "prometheus_client-0.23.1-py3-none-any.whl", hash = "sha256:dd1913e6e76b59cfe44e7a4b83e01afc9873c1bdfd2ed8739f1e76aeca115f99"}, + {file = "prometheus_client-0.23.1.tar.gz", hash = "sha256:6ae8f9081eaaaf153a2e959d2e6c4f4fb57b12ef76c8c7980202f1e57b48b2ce"}, +] + +[package.extras] +twisted = ["twisted"] + [[package]] name = "pycodestyle" version = "2.14.0" @@ -692,14 +723,14 @@ zstd = ["backports-zstd (>=1.0.0) ; python_version < \"3.14\""] [[package]] name = "werkzeug" -version = "3.1.5" +version = "3.1.6" description = "The comprehensive WSGI web application library." optional = false python-versions = ">=3.9" groups = ["main"] files = [ - {file = "werkzeug-3.1.5-py3-none-any.whl", hash = "sha256:5111e36e91086ece91f93268bb39b4a35c1e6f1feac762c9c822ded0a4e322dc"}, - {file = "werkzeug-3.1.5.tar.gz", hash = "sha256:6a548b0e88955dd07ccb25539d7d0cc97417ee9e179677d22c7041c8f078ce67"}, + {file = "werkzeug-3.1.6-py3-none-any.whl", hash = "sha256:7ddf3357bb9564e407607f988f683d72038551200c704012bb9a4c523d42f131"}, + {file = "werkzeug-3.1.6.tar.gz", hash = "sha256:210c6bede5a420a913956b4791a7f4d6843a43b6fcee4dfa08a65e93007d0d25"}, ] [package.dependencies] @@ -710,5 +741,5 @@ watchdog = ["watchdog (>=2.3)"] [metadata] lock-version = "2.1" -python-versions = ">=3.13" -content-hash = "5bcb333e951818ca4706d50bae307ab22a95462b6e393691b1a6d0992e4ffc41" +python-versions = ">=3.14" +content-hash = "978605bae0c54f50d967c46bf36e71be1c8baa8f5deab0c54397546aaa573a3a" diff --git a/app_python/pyproject.toml b/app_python/pyproject.toml index 1e8b7fba15..deb962795e 100644 --- a/app_python/pyproject.toml +++ b/app_python/pyproject.toml @@ -1,20 +1,18 @@ -[tool.poetry] +[project] name = "devops-info-service" -version = "0.1.0" +version = "1.8.0" description = "" -authors = ["LocalT0aster"] +authors = [ + {name = "LocalT0aster",email = "90502400+LocalT0aster@users.noreply.github.com"} +] readme = "README.md" -packages = [{ include = "src" }] - -[tool.poetry.dependencies] -python = ">=3.13" -flask = ">=3.1.2,<4.0.0" -requests = ">=2.32.5,<3.0.0" -gunicorn = "^25.0.3" - -[build-system] -requires = ["poetry-core>=2.0.0,<3.0.0"] -build-backend = "poetry.core.masonry.api" +requires-python = ">=3.14" +dependencies = [ + "flask (>=3.1.3,<4.0.0)", + "requests (>=2.32.5,<3.0.0)", + "gunicorn (>=25.1.0,<26.0.0)", + "prometheus-client (==0.23.1)" +] [dependency-groups] dev = [ @@ -23,3 +21,10 @@ dev = [ "flake8 (>=7.3.0,<8.0.0)", "pep8-naming (>=0.15.1,<0.16.0)" ] + +[tool.poetry] +packages = [{ include = "src" }] + +[build-system] +requires = ["poetry-core>=2.0.0,<3.0.0"] +build-backend = "poetry.core.masonry.api" diff --git a/app_python/src/metrics.py b/app_python/src/metrics.py new file mode 100644 index 0000000000..1441b3f8f1 --- /dev/null +++ b/app_python/src/metrics.py @@ -0,0 +1,119 @@ +"""Prometheus metrics and Flask request instrumentation.""" + +from time import perf_counter + +from flask import Response, g, request +from prometheus_client import ( + CONTENT_TYPE_LATEST, + CollectorRegistry, + Counter, + Gauge, + Histogram, + generate_latest, +) + +try: + from .flask_instance import app +except ImportError: # pragma: no cover - allows `python src/main.py` + from flask_instance import app + +METRICS_REGISTRY = CollectorRegistry() + +HTTP_REQUESTS_TOTAL = Counter( + "http_requests_total", + "Total HTTP requests handled by the service.", + ["method", "endpoint", "status_code"], + registry=METRICS_REGISTRY, +) +HTTP_REQUEST_DURATION_SECONDS = Histogram( + "http_request_duration_seconds", + "HTTP request duration in seconds.", + ["method", "endpoint", "status_code"], + registry=METRICS_REGISTRY, +) +HTTP_REQUESTS_IN_PROGRESS = Gauge( + "http_requests_in_progress", + "HTTP requests currently being processed.", + ["method", "endpoint"], + registry=METRICS_REGISTRY, +) +DEVOPS_INFO_ENDPOINT_CALLS_TOTAL = Counter( + "devops_info_endpoint_calls_total", + "Total calls to application endpoints.", + ["endpoint"], + registry=METRICS_REGISTRY, +) +DEVOPS_INFO_SYSTEM_INFO_DURATION_SECONDS = Histogram( + "devops_info_system_info_duration_seconds", + "Time spent collecting system information.", + registry=METRICS_REGISTRY, +) + + +def normalize_endpoint_label() -> str: + """Return a low-cardinality endpoint label for the current request.""" + rule = getattr(request, "url_rule", None) + if rule is not None: + return rule.rule + return "unmatched" + + +def record_endpoint_call(endpoint: str) -> None: + """Increment the app-specific endpoint usage counter.""" + DEVOPS_INFO_ENDPOINT_CALLS_TOTAL.labels(endpoint=endpoint).inc() + + +def generate_metrics_response() -> Response: + """Return the current Prometheus exposition payload.""" + return Response( + generate_latest(METRICS_REGISTRY), + content_type=CONTENT_TYPE_LATEST, + ) + + +@app.before_request +def start_http_request_metrics() -> None: + """Capture request start time and increase the in-flight gauge.""" + endpoint = normalize_endpoint_label() + g.metrics_method = request.method + g.metrics_endpoint = endpoint + g.metrics_start_time = perf_counter() + g.metrics_in_progress = True + HTTP_REQUESTS_IN_PROGRESS.labels( + method=request.method, + endpoint=endpoint, + ).inc() + + +@app.after_request +def record_http_request_metrics(response: Response) -> Response: + """Persist request counter and latency observations.""" + method = getattr(g, "metrics_method", request.method) + endpoint = getattr(g, "metrics_endpoint", normalize_endpoint_label()) + start_time = getattr(g, "metrics_start_time", None) + if start_time is None: + return response + + labels = { + "method": method, + "endpoint": endpoint, + "status_code": str(response.status_code), + } + HTTP_REQUESTS_TOTAL.labels(**labels).inc() + HTTP_REQUEST_DURATION_SECONDS.labels(**labels).observe( + perf_counter() - start_time + ) + return response + + +@app.teardown_request +def finish_http_request_metrics(error: BaseException | None) -> None: # noqa: ARG001 + """Decrease the in-flight gauge after the request finishes.""" + if not getattr(g, "metrics_in_progress", False): + return + + HTTP_REQUESTS_IN_PROGRESS.labels( + method=g.metrics_method, + endpoint=g.metrics_endpoint, + ).dec() + g.metrics_in_progress = False diff --git a/app_python/src/router.py b/app_python/src/router.py index b2590de495..294be6246d 100644 --- a/app_python/src/router.py +++ b/app_python/src/router.py @@ -12,10 +12,20 @@ try: from .flask_instance import START_TIME, app, logger + from .metrics import ( + DEVOPS_INFO_SYSTEM_INFO_DURATION_SECONDS, + generate_metrics_response, + record_endpoint_call, + ) except ImportError: # pragma: no cover - allows `python src/main.py` from flask_instance import START_TIME, app, logger + from metrics import ( + DEVOPS_INFO_SYSTEM_INFO_DURATION_SECONDS, + generate_metrics_response, + record_endpoint_call, + ) -__version__ = "1.7.0" +__version__ = "1.8.0" def get_service_info() -> dict[str, str]: @@ -28,6 +38,7 @@ def get_service_info() -> dict[str, str]: } +@DEVOPS_INFO_SYSTEM_INFO_DURATION_SECONDS.time() def get_platform_info() -> dict[str, str | int]: """Collect system information.""" @@ -120,6 +131,7 @@ def list_routes() -> list[dict[str, str]]: @app.route("/") def index(): """Service information.""" + record_endpoint_call("/") return jsonify( { "service": get_service_info(), @@ -134,6 +146,7 @@ def index(): @app.route("/health") def health(): """Health check.""" + record_endpoint_call("/health") return jsonify( { "status": "healthy", @@ -143,6 +156,13 @@ def health(): ) +@app.route("/metrics") +def metrics(): + """Prometheus metrics.""" + record_endpoint_call("/metrics") + return generate_metrics_response() + + @app.errorhandler(404) def not_found(error): # noqa: ARG001 """Return a JSON 404 payload.""" diff --git a/app_python/tests/test_endpoints.py b/app_python/tests/test_endpoints.py index d0aca40338..97c217b476 100644 --- a/app_python/tests/test_endpoints.py +++ b/app_python/tests/test_endpoints.py @@ -62,6 +62,7 @@ def test_index_returns_expected_json_structure_and_types(client): route_index = {(endpoint["method"], endpoint["path"]) for endpoint in endpoints} assert ("GET", "/") in route_index assert ("GET", "/health") in route_index + assert ("GET", "/metrics") in route_index def test_health_returns_expected_json_structure_and_types(client): diff --git a/app_python/tests/test_metrics.py b/app_python/tests/test_metrics.py new file mode 100644 index 0000000000..ac7da3ad0b --- /dev/null +++ b/app_python/tests/test_metrics.py @@ -0,0 +1,106 @@ +"""Tests for Prometheus metrics exposure and labels.""" + +from collections.abc import Mapping + +from prometheus_client.parser import text_string_to_metric_families + +import src.router as router + + +def _raise_runtime_error() -> None: + raise RuntimeError("simulated failure") + + +def _metric_value( + metrics_text: str, + sample_name: str, + labels: Mapping[str, str] | None = None, +) -> float | None: + expected_labels = labels or {} + + for family in text_string_to_metric_families(metrics_text): + for sample in family.samples: + if sample.name != sample_name: + continue + if all( + sample.labels.get(key) == value + for key, value in expected_labels.items() + ): + return float(sample.value) + return None + + +def _metrics_text(client) -> str: + response = client.get("/metrics") + assert response.status_code == 200 + return response.get_data(as_text=True) + + +def test_metrics_endpoint_exposes_http_and_application_metrics(client): + """Metrics endpoint should expose HTTP RED data and app-specific metrics.""" + client.get("/") + client.get("/health") + client.get("/does-not-exist") + + response = client.get("/metrics") + metrics_text = response.get_data(as_text=True) + + assert response.status_code == 200 + assert response.content_type.startswith("text/plain") + + root_total = _metric_value( + metrics_text, + "http_requests_total", + {"method": "GET", "endpoint": "/", "status_code": "200"}, + ) + health_total = _metric_value( + metrics_text, + "http_requests_total", + {"method": "GET", "endpoint": "/health", "status_code": "200"}, + ) + unmatched_total = _metric_value( + metrics_text, + "http_requests_total", + {"method": "GET", "endpoint": "unmatched", "status_code": "404"}, + ) + root_duration_count = _metric_value( + metrics_text, + "http_request_duration_seconds_count", + {"method": "GET", "endpoint": "/", "status_code": "200"}, + ) + root_in_progress = _metric_value( + metrics_text, + "http_requests_in_progress", + {"method": "GET", "endpoint": "/"}, + ) + endpoint_calls = _metric_value( + metrics_text, + "devops_info_endpoint_calls_total", + {"endpoint": "/"}, + ) + system_info_count = _metric_value( + metrics_text, + "devops_info_system_info_duration_seconds_count", + ) + + assert root_total is not None and root_total >= 1.0 + assert health_total is not None and health_total >= 1.0 + assert unmatched_total is not None and unmatched_total >= 1.0 + assert root_duration_count is not None and root_duration_count >= 1.0 + assert root_in_progress == 0.0 + assert endpoint_calls is not None and endpoint_calls >= 1.0 + assert system_info_count is not None and system_info_count >= 1.0 + + +def test_metrics_count_internal_server_errors_with_status_labels(client, monkeypatch): + """Failed requests should still be counted with a 500 status code label.""" + labels = {"method": "GET", "endpoint": "/", "status_code": "500"} + before = _metric_value(_metrics_text(client), "http_requests_total", labels) or 0.0 + + monkeypatch.setattr(router, "get_platform_info", _raise_runtime_error) + + response = client.get("/") + after = _metric_value(_metrics_text(client), "http_requests_total", labels) + + assert response.status_code == 500 + assert after == before + 1.0 diff --git a/monitoring/docker-compose.yml b/monitoring/docker-compose.yml index ac36c52b2e..8b155f0c50 100644 --- a/monitoring/docker-compose.yml +++ b/monitoring/docker-compose.yml @@ -43,6 +43,17 @@ services: - promtail-data:/run/promtail - /var/run/docker.sock:/var/run/docker.sock:ro - /var/lib/docker/containers:/var/lib/docker/containers:ro + healthcheck: + test: + - CMD-SHELL + - >- + bash -lc 'exec 3<>/dev/tcp/127.0.0.1/9080 + && printf "GET /ready HTTP/1.0\r\nHost: 127.0.0.1\r\n\r\n" >&3 + && grep -q "200 OK" <&3' + interval: 10s + timeout: 5s + retries: 5 + start_period: 10s deploy: resources: limits: @@ -81,7 +92,7 @@ services: deploy: resources: limits: - cpus: "1.0" + cpus: "0.5" memory: 512M reservations: cpus: "0.25" @@ -90,12 +101,39 @@ services: - monitoring restart: unless-stopped + prometheus: + image: prom/prometheus:v3.9.0 + command: + - --config.file=/etc/prometheus/prometheus.yml + - --storage.tsdb.retention.time=15d + - --storage.tsdb.retention.size=10GB + ports: + - "9090:9090" + volumes: + - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml:ro + - prometheus-data:/prometheus + healthcheck: + test: + - CMD-SHELL + - wget --no-verbose --tries=1 --spider http://127.0.0.1:9090/-/healthy || exit 1 + interval: 10s + timeout: 5s + retries: 5 + start_period: 10s + deploy: + resources: + limits: + cpus: "1.0" + memory: 1G + reservations: + cpus: "0.25" + memory: 256M + networks: + - monitoring + restart: unless-stopped + app-python: - image: localt0aster/devops-app-py:1.7.9a42ee5 - # Re-enable local builds if Docker networking breaks behind the tun/VPN setup. - # build: - # context: ../app_python - # network: host + image: localt0aster/devops-app-py:1.8.806c77e environment: HOST: "0.0.0.0" PORT: "8000" @@ -182,6 +220,7 @@ volumes: loki-data: promtail-data: grafana-data: + prometheus-data: networks: monitoring: diff --git a/monitoring/docs/LAB08.md b/monitoring/docs/LAB08.md new file mode 100644 index 0000000000..053664e40b --- /dev/null +++ b/monitoring/docs/LAB08.md @@ -0,0 +1,612 @@ +# LAB08 - Metrics and Monitoring + +## Task 1 — Application Instrumentation + +### Metrics Added + +The Python service was instrumented with Prometheus metrics in `app_python/src/metrics.py` and `app_python/src/router.py`. + +- `http_requests_total` + - Counter for total HTTP requests + - Labels: `method`, `endpoint`, `status_code` +- `http_request_duration_seconds` + - Histogram for request latency + - Labels: `method`, `endpoint`, `status_code` +- `http_requests_in_progress` + - Gauge for active in-flight requests + - Labels: `method`, `endpoint` +- `devops_info_endpoint_calls_total` + - Counter for endpoint usage inside the app + - Labels: `endpoint` +- `devops_info_system_info_duration_seconds` + - Histogram for the platform-info collection path + - No labels + +### Why These Metrics + +The metric set follows the RED method for a request-driven service. + +- Rate: `http_requests_total` +- Errors: `http_requests_total{status_code=~"5.."}` +- Duration: `http_request_duration_seconds` + +Two extra business-level metrics were added so the dashboard shows something specific to this service rather than only generic HTTP traffic. + +### Labeling Choices + +- Matched routes use normalized endpoint labels such as `/`, `/health`, and `/metrics` +- Unknown routes are grouped as `endpoint="unmatched"` to keep cardinality low +- The implementation uses `status_code`, not `status` + +That last point matters because some of the lab examples use `status`, but this service exports `status_code`. + +### Metrics vs Logs + +Metrics and logs solve different problems. + +- Metrics answer trend questions quickly: request rate, latency, error rate, uptime +- Logs answer forensic questions: which request failed, what stack trace occurred, what client sent the request +- Lab 7 kept Loki + Promtail for logs +- Lab 8 adds Prometheus for numeric time-series monitoring + +In practice: + +- Use metrics for dashboards, SLO-style views, and alert conditions +- Use logs for debugging after a metric tells you something is wrong + +## Task 2 — Prometheus Setup + +### Architecture + +```mermaid +flowchart TD + A[app-python:8000
/metrics] + P[prometheus:9090
TSDB + retention] + G[grafana:3000
dashboards + panels] + PT[promtail] + L[loki] + + A -- scrape every 15s --> P + P -- query / visualize --> G + + A -- stdout logs --> PT + PT --> L + L --> G +``` + +### Prometheus Configuration + +Prometheus was added to the existing monitoring stack in `monitoring/docker-compose.yml` and configured with `monitoring/prometheus/prometheus.yml`. + +Current scrape targets: + +- `prometheus` -> `localhost:9090` +- `app` -> `app-python:8000/metrics` +- `loki` -> `loki:3100/metrics` +- `grafana` -> `grafana:3000/metrics` + +Current scrape/evaluation interval: + +- `15s` + +### Task 2 Commands Used + +```bash +PS1="$ " +cd monitoring +docker compose up -d +docker compose ps | tee /tmp/lab08_task2_compose_ps.txt +curl -fSs http://127.0.0.1:9090/api/v1/targets \ + | jq '{status, data: {activeTargets: [.data.activeTargets[] | {labels, scrapeUrl, lastError, health}]}}' \ + | tee /tmp/lab08_task2_targets_final.json +curl -fSsG --data-urlencode 'query=up' http://127.0.0.1:9090/api/v1/query \ + | jq '{status, data: {resultType: .data.resultType, result: .data.result}}' \ + | tee /tmp/lab08_task2_up_final.json +``` + +### Task 2 Evidence + +Prometheus target screenshot: + +![](img/lab08_task2_targets.png) + +PromQL `up` screenshot: + +![](img/lab08_task2_up_query.png) + +
+/api/v1/targets output + +```json +$ curl -fSs http://127.0.0.1:9090/api/v1/targets | jq '{status, data: {activeTargets: [.data.activeTargets[] | {labels, scrapeUrl, lastError, health}]}}' | tee /tmp/lab08_task2_targets_final.json +{ + "status": "success", + "data": { + "activeTargets": [ + { + "labels": { + "instance": "app-python:8000", + "job": "app" + }, + "scrapeUrl": "http://app-python:8000/metrics", + "lastError": "", + "health": "up" + }, + { + "labels": { + "instance": "grafana:3000", + "job": "grafana" + }, + "scrapeUrl": "http://grafana:3000/metrics", + "lastError": "", + "health": "up" + }, + { + "labels": { + "instance": "loki:3100", + "job": "loki" + }, + "scrapeUrl": "http://loki:3100/metrics", + "lastError": "", + "health": "up" + }, + { + "labels": { + "instance": "localhost:9090", + "job": "prometheus" + }, + "scrapeUrl": "http://localhost:9090/metrics", + "lastError": "", + "health": "up" + } + ] + } +} +``` + +
+ +
+query=up output + +```json +$ curl -fSsG --data-urlencode 'query=up' http://127.0.0.1:9090/api/v1/query | jq '{status, data: {resultType: .data.resultType, result: .data.result}}' | tee /tmp/lab08_task2_up_final.json +{ + "status": "success", + "data": { + "resultType": "vector", + "result": [ + { + "metric": { + "__name__": "up", + "instance": "grafana:3000", + "job": "grafana" + }, + "value": [ + 1773967701.736, + "1" + ] + }, + { + "metric": { + "__name__": "up", + "instance": "localhost:9090", + "job": "prometheus" + }, + "value": [ + 1773967701.736, + "1" + ] + }, + { + "metric": { + "__name__": "up", + "instance": "app-python:8000", + "job": "app" + }, + "value": [ + 1773967701.736, + "1" + ] + }, + { + "metric": { + "__name__": "up", + "instance": "loki:3100", + "job": "loki" + }, + "value": [ + 1773967701.736, + "1" + ] + } + ] + } +} +``` + +
+ +## Task 3 — Grafana Dashboards + +### Prometheus Data Source + +The Prometheus data source was added in Grafana with: + +- URL: `http://prometheus:9090` +- access mode: proxy + +### Dashboard Walkthrough + +The exported dashboard is stored in `monitoring/grafana/dashbboard.json`. + +Panels in the current dashboard: + +- `Status Code Distribution` + - Type: `piechart` + - Query: `sum by (status_code) (rate(http_requests_total[5m]))` + - Purpose: show 2xx/4xx/5xx mix +- `Uptime` + - Type: `stat` + - Query: `up{job="app"}` + - Purpose: show whether the app is scrapeable +- `Active Requests` + - Type: `timeseries` + - Query: `http_requests_in_progress` + - Purpose: show in-flight request concurrency +- `Error Rate` + - Type: `timeseries` + - Query: `sum(rate(http_requests_total{status_code=~"5.."}[5m]))` + - Purpose: highlight 5xx traffic +- `Request Rate` + - Type: `timeseries` + - Query: `sum(rate(http_requests_total[5m])) by (endpoint)` + - Purpose: show throughput per endpoint +- `Request Duration p95` + - Type: `timeseries` + - Query: `histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m]))` + - Purpose: track latency percentile +- `Request Duration Heatmap` + - Type: `heatmap` + - Query: `rate(http_request_duration_seconds_bucket[5m])` + - Purpose: visualize latency distribution + +### Task 3 Notes + +Two corrections were made to the exported JSON during the final review: + +- `status` was replaced with `status_code` +- `Request Duration p95` was corrected from `heatmap` to `timeseries` + +These changes align the dashboard with the actual metric schema emitted by the Python app. + +### Task 3 Commands Used + +```bash +PS1="$ " +cd monitoring +jq '{uid, title, panels: [.panels[] | {title, type, expr: .targets[0].expr}]}' monitoring/grafana/dashbboard.json \ + | tee /tmp/lab08_task3_dashboard_summary.json +curl -fSsG --data-urlencode 'query=http_requests_total' http://127.0.0.1:9090/api/v1/query \ + | jq '{status, data: {resultType: .data.resultType, resultCount: (.data.result | length), result: .data.result[0:4]}}' \ + | tee /tmp/lab08_task3_requests_total.json +``` + +### Task 3 Evidence + +Custom dashboard screenshot: + +![](img/lab08_task3_custom_dashboard.png) + +
+dashboard export summary output + +```json +$ jq '{uid, title, panels: [.panels[] | {title, type, expr: .targets[0].expr}]}' monitoring/grafana/dashbboard.json | tee /tmp/lab08_task3_dashboard_summary.json +{ + "uid": "adksq66", + "title": "Custom", + "panels": [ + { + "title": "Status Code Distribution", + "type": "piechart", + "expr": "sum by (status_code) (rate(http_requests_total[5m]))" + }, + { + "title": "Uptime", + "type": "stat", + "expr": "up{job=\"app\"}" + }, + { + "title": "Active Requests", + "type": "timeseries", + "expr": "http_requests_in_progress" + }, + { + "title": "Error Rate", + "type": "timeseries", + "expr": "sum(rate(http_requests_total{status_code=~\"5..\"}[5m]))" + }, + { + "title": "Request Rate", + "type": "timeseries", + "expr": "sum(rate(http_requests_total[5m])) by (endpoint)" + }, + { + "title": "Request Duration p95", + "type": "timeseries", + "expr": "histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m]))" + }, + { + "title": "Request Duration Heatmap", + "type": "heatmap", + "expr": "rate(http_request_duration_seconds_bucket[5m])" + } + ] +} +``` + +
+ +
+http_requests_total query output + +```json +$ curl -fSsG --data-urlencode 'query=http_requests_total' http://127.0.0.1:9090/api/v1/query | jq '{status, data: {resultType: .data.resultType, resultCount: (.data.result | length), result: .data.result[0:4]}}' | tee /tmp/lab08_task3_requests_total.json +{ + "status": "success", + "data": { + "resultType": "vector", + "resultCount": 4, + "result": [ + { + "metric": { + "__name__": "http_requests_total", + "endpoint": "/health", + "instance": "app-python:8000", + "job": "app", + "method": "GET", + "status_code": "200" + }, + "value": [ + 1773967701.768, + "9" + ] + }, + { + "metric": { + "__name__": "http_requests_total", + "endpoint": "/metrics", + "instance": "app-python:8000", + "job": "app", + "method": "GET", + "status_code": "200" + }, + "value": [ + 1773967701.768, + "8" + ] + }, + { + "metric": { + "__name__": "http_requests_total", + "endpoint": "/metrics", + "instance": "app-python:8000", + "job": "app", + "method": "HEAD", + "status_code": "200" + }, + "value": [ + 1773967701.768, + "1" + ] + }, + { + "metric": { + "__name__": "http_requests_total", + "endpoint": "/", + "instance": "app-python:8000", + "job": "app", + "method": "GET", + "status_code": "200" + }, + "value": [ + 1773967701.768, + "5" + ] + } + ] + } +} +``` + +
+ +## Task 4 — Production Configuration + +### Health Checks + +The stack now includes production-style health checks for the services that can reasonably self-test. + +- `loki` + - endpoint: `http://127.0.0.1:3100/ready` +- `grafana` + - endpoint: `http://127.0.0.1:3000/api/health` +- `prometheus` + - endpoint: `http://127.0.0.1:9090/-/healthy` +- `promtail` + - endpoint: `http://127.0.0.1:9080/ready` + - implemented with `bash` + `/dev/tcp` because this image does not include `wget` or `curl` +- `app-python` + - endpoint: `http://127.0.0.1:8000/health` +- `app-go` + - monitored by the existing `app-go-healthcheck` helper container + - reason: the Go image is built `FROM scratch`, so it cannot run an in-container shell-based HTTP probe + +### Resource Limits + +Configured limits in `monitoring/docker-compose.yml`: + +- Prometheus: `1.0` CPU, `1G` memory +- Loki: `1.0` CPU, `1G` memory +- Grafana: `0.5` CPU, `512M` memory +- app-python: `0.5` CPU, `256M` memory +- app-go: `0.5` CPU, `256M` memory +- Promtail: `0.5` CPU, `256M` memory + +### Retention and Persistence + +Prometheus retention is enforced through container flags: + +- `--storage.tsdb.retention.time=15d` +- `--storage.tsdb.retention.size=10GB` + +Persistent volumes in the stack: + +- `prometheus-data` +- `loki-data` +- `grafana-data` +- `promtail-data` + +### Task 4 Commands Used + +```bash +PS1="$ " +cd monitoring +set -a && source .env +curl -fSs -u "$GRAFANA_ADMIN_USER:$GRAFANA_ADMIN_PASSWORD" 'http://127.0.0.1:3000/api/search?query=Custom' \ + | jq '{count: length, dashboards: [.[] | {uid, title, url}]}' \ + | tee /tmp/lab08_task4_grafana_before.json +docker compose down +docker compose up -d +docker compose ps | tee /tmp/lab08_task4_compose_ps_final.txt +curl -fSs -u "$GRAFANA_ADMIN_USER:$GRAFANA_ADMIN_PASSWORD" 'http://127.0.0.1:3000/api/search?query=Custom' \ + | jq '{count: length, dashboards: [.[] | {uid, title, url}]}' \ + | tee /tmp/lab08_task4_grafana_after.json +docker inspect monitoring-prometheus-1 --format '{{json .Config.Healthcheck.Test}} {{json .Config.Cmd}}' \ + | tee /tmp/lab08_task4_prometheus_inspect.txt +``` + +### Task 4 Evidence + +
+docker compose ps after restart + +```text +$ docker compose ps | tee /tmp/lab08_task4_compose_ps_final.txt +NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS +monitoring-app-go-1 localt0aster/devops-app-go:1.7.9a42ee5 "/devops-info-servic…" app-go 2 minutes ago Up 2 minutes 0.0.0.0:8001->8001/tcp, [::]:8001->8001/tcp +monitoring-app-go-healthcheck-1 curlimages/curl:8.18.0 "/entrypoint.sh sh -…" app-go-healthcheck 2 minutes ago Up 2 minutes (healthy) +monitoring-app-python-1 localt0aster/devops-app-py:1.8.806c77e "sh -c 'gunicorn --c…" app-python 2 minutes ago Up 2 minutes (healthy) 0.0.0.0:8000->8000/tcp, [::]:8000->8000/tcp +monitoring-grafana-1 grafana/grafana:12.3.1 "/run.sh" grafana 2 minutes ago Up About a minute (healthy) 0.0.0.0:3000->3000/tcp, [::]:3000->3000/tcp +monitoring-loki-1 grafana/loki:3.0.0 "/usr/bin/loki -conf…" loki 2 minutes ago Up 2 minutes (healthy) 0.0.0.0:3100->3100/tcp, [::]:3100->3100/tcp +monitoring-prometheus-1 prom/prometheus:v3.9.0 "/bin/prometheus --c…" prometheus 2 minutes ago Up 2 minutes (healthy) 0.0.0.0:9090->9090/tcp, [::]:9090->9090/tcp +monitoring-promtail-1 grafana/promtail:3.0.0 "/usr/bin/promtail -…" promtail 23 seconds ago Up 22 seconds (healthy) 0.0.0.0:9080->9080/tcp, [::]:9080->9080/tcp +``` + +
+ +
+Grafana dashboard inventory before restart + +```json +$ curl -fSs -u "$GRAFANA_ADMIN_USER:$GRAFANA_ADMIN_PASSWORD" 'http://127.0.0.1:3000/api/search?query=Custom' | jq '{count: length, dashboards: [.[] | {uid, title, url}]}' | tee /tmp/lab08_task4_grafana_before.json +{ + "count": 2, + "dashboards": [ + { + "uid": "adksq66", + "title": "Custom", + "url": "/d/adksq66/custom" + }, + { + "uid": "adksq661", + "title": "Custom2", + "url": "/d/adksq661/custom2" + } + ] +} +``` + +
+ +
+Grafana dashboard inventory after restart + +```json +$ curl -fSs -u "$GRAFANA_ADMIN_USER:$GRAFANA_ADMIN_PASSWORD" 'http://127.0.0.1:3000/api/search?query=Custom' | jq '{count: length, dashboards: [.[] | {uid, title, url}]}' | tee /tmp/lab08_task4_grafana_after.json +{ + "count": 2, + "dashboards": [ + { + "uid": "adksq66", + "title": "Custom", + "url": "/d/adksq66/custom" + }, + { + "uid": "adksq661", + "title": "Custom2", + "url": "/d/adksq661/custom2" + } + ] +} +``` + +
+ +
+Prometheus healthcheck and retention flags + +```text +$ docker inspect monitoring-prometheus-1 --format '{{json .Config.Healthcheck.Test}} {{json .Config.Cmd}}' | tee /tmp/lab08_task4_prometheus_inspect.txt +["CMD-SHELL","wget --no-verbose --tries=1 --spider http://127.0.0.1:9090/-/healthy || exit 1"] ["--config.file=/etc/prometheus/prometheus.yml","--storage.tsdb.retention.time=15d","--storage.tsdb.retention.size=10GB"] +``` + +
+ +### Persistence Result + +Dashboard persistence was confirmed because the same Grafana dashboard UIDs existed before and after `docker compose down` and `docker compose up -d`. + +## Task 5 — Final Documentation Pass + +### PromQL Examples + +The following queries match the actual exported label names: + +- `up{job="app"}` + - Is the Python app currently scrapeable? +- `sum(rate(http_requests_total[5m])) by (endpoint)` + - Requests per second per endpoint +- `sum(rate(http_requests_total{status_code=~"5.."}[5m]))` + - 5xx error rate +- `sum by (status_code) (rate(http_requests_total[5m]))` + - Status-code distribution for the pie chart +- `http_requests_in_progress` + - Current in-flight requests +- `histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m]))` + - p95 latency estimate +- `devops_info_endpoint_calls_total` + - App-specific endpoint usage counter + +### Testing Results + +What was verified during this lab: + +- the Python app exposes `/metrics` +- Prometheus scrapes the app, Loki, Grafana, and itself successfully +- Grafana dashboard panels render live Prometheus data +- Prometheus retention flags are applied to the running container +- Grafana dashboards persist across `docker compose down` and `up -d` +- Promtail, Loki, Grafana, Prometheus, and the Python app all report healthy status after the final restart + +### Challenges and Solutions + +- Challenge: the branch image tag mattered because the older published Python image did not contain the new `/metrics` endpoint + - Solution: use `localt0aster/devops-app-py:1.8.806c77e` +- Challenge: the lab examples used `status`, while the implemented app uses `status_code` + - Solution: adapt the Grafana and PromQL queries to `status_code` +- Challenge: the Promtail image does not include `wget` or `curl` + - Solution: use a `bash` + `/dev/tcp` healthcheck against `/ready` +- Challenge: the Go service is built from `scratch`, so it cannot run a normal in-container HTTP healthcheck + - Solution: keep the dedicated `app-go-healthcheck` helper container diff --git a/monitoring/docs/img/lab08_task2_targets.png b/monitoring/docs/img/lab08_task2_targets.png new file mode 100644 index 0000000000000000000000000000000000000000..be3c369b91c07a55df1f793a587d708d81fced23 GIT binary patch literal 131121 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

P(v4kl>RlQ;I^dsC|JV)95X{fAP=Ki4L+>(!60 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 OkeH{dpUXO@geCy}=QsEO literal 0 HcmV?d00001 diff --git a/monitoring/docs/img/lab08_task2_up_query.png b/monitoring/docs/img/lab08_task2_up_query.png new file mode 100644 index 0000000000000000000000000000000000000000..dc281d37b659fcc4647100d9b1efa2b61d1f5d80 GIT binary patch literal 21487 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

+Cluster setup verification output + +```text +$ minikube status +minikube +type: Control Plane +host: Running +kubelet: Running +apiserver: Running +kubeconfig: Configured + + +$ kubectl cluster-info +Kubernetes control plane is running at https://192.168.49.2:8443 +CoreDNS is running at https://192.168.49.2:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy + +To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'. + +$ kubectl get nodes -o wide +NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME +minikube Ready control-plane 2m45s v1.35.1 192.168.49.2 Debian GNU/Linux 12 (bookworm) 6.19.10-1-cachyos docker://29.2.1 + +$ kubectl get namespaces +NAME STATUS AGE +default Active 3m9s +kube-node-lease Active 3m9s +kube-public Active 3m9s +kube-system Active 3m9s +``` + +
+ +## Task 2 - Application Deployment + +The initial Task 2 deployment used `localt0aster/devops-app-py:1.9-dev` with 3 replicas, rolling updates, and resource requests and limits. At that stage, the probes were `GET /health` for liveness and `GET /ready` for readiness. Task 4 later scaled the manifest to 5 replicas and tightened the rollout strategy. + +
+Deployment rollout verification output + +```text +$ kubectl delete deployment devops-app-py --cascade=foreground --wait=true +deployment.apps "devops-app-py" deleted from default namespace + +$ kubectl apply -f k8s/deployment.yml +deployment.apps/devops-app-py created + +$ kubectl rollout status deployment/devops-app-py --timeout=180s +Waiting for deployment "devops-app-py" rollout to finish: 0 of 3 updated replicas are available... +Waiting for deployment "devops-app-py" rollout to finish: 1 of 3 updated replicas are available... +Waiting for deployment "devops-app-py" rollout to finish: 2 of 3 updated replicas are available... +deployment "devops-app-py" successfully rolled out + +$ kubectl get deployment devops-app-py +NAME READY UP-TO-DATE AVAILABLE AGE +devops-app-py 3/3 3 3 8s + +$ kubectl get pods -l app.kubernetes.io/name=devops-app-py -o wide +NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES +devops-app-py-76fc7985df-jq2tr 1/1 Running 0 8s 10.244.0.14 minikube +devops-app-py-76fc7985df-jwpsf 1/1 Running 0 8s 10.244.0.13 minikube +devops-app-py-76fc7985df-nwr58 1/1 Running 0 8s 10.244.0.12 minikube + +$ kubectl describe deployment devops-app-py +Name: devops-app-py +Namespace: default +CreationTimestamp: Fri, 27 Mar 2026 05:16:21 +0300 +Labels: app.kubernetes.io/name=devops-app-py + app.kubernetes.io/part-of=devops-core-s26 +Annotations: deployment.kubernetes.io/revision: 1 +Selector: app.kubernetes.io/name=devops-app-py +Replicas: 3 desired | 3 updated | 3 total | 3 available | 0 unavailable +StrategyType: RollingUpdate +MinReadySeconds: 0 +RollingUpdateStrategy: 1 max unavailable, 1 max surge +Pod Template: + Labels: app.kubernetes.io/name=devops-app-py + app.kubernetes.io/part-of=devops-core-s26 + Containers: + devops-app-py: + Image: localt0aster/devops-app-py:1.9-dev + Port: 5000/TCP (http) + Host Port: 0/TCP (http) + Limits: + cpu: 250m + memory: 256Mi + Requests: + cpu: 100m + memory: 128Mi + Liveness: http-get http://:http/health delay=10s timeout=2s period=10s #success=1 #failure=3 + Readiness: http-get http://:http/ready delay=5s timeout=2s period=5s #success=1 #failure=3 + Environment: + HOST: 0.0.0.0 + PORT: 5000 + Mounts: + Volumes: + Node-Selectors: + Tolerations: +Conditions: + Type Status Reason + ---- ------ ------ + Available True MinimumReplicasAvailable + Progressing True NewReplicaSetAvailable +OldReplicaSets: +NewReplicaSet: devops-app-py-76fc7985df (3/3 replicas created) +Events: + Type Reason Age From Message + ---- ------ ---- ---- ------- + Normal ScalingReplicaSet 9s deployment-controller Scaled up replica set devops-app-py-76fc7985df from 0 to 3 +``` + +
+ +## Task 3 - Service Configuration + +The Service uses type `NodePort` and targets the Deployment Pods with the `app.kubernetes.io/name=devops-app-py` label. It exposes service port `80` and forwards traffic to container port `5000` on a fixed NodePort, `30080`. + +For connectivity verification, I used `kubectl port-forward service/devops-app-py-service 8080:80`. I tested `minikube service ... --url` first, but in this Docker-driver setup the returned node IP was not directly reachable from the host, so port-forward was the practical local-access path. + +
+Service verification output + +```text +$ kubectl apply -f k8s/service.yml +service/devops-app-py-service unchanged + +$ kubectl get services +NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE +devops-app-py-service NodePort 10.110.168.128 80:30080/TCP 32s +kubernetes ClusterIP 10.96.0.1 443/TCP 80m + +$ kubectl describe service devops-app-py-service +Name: devops-app-py-service +Namespace: default +Labels: app.kubernetes.io/name=devops-app-py + app.kubernetes.io/part-of=devops-core-s26 +Annotations: +Selector: app.kubernetes.io/name=devops-app-py +Type: NodePort +IP Family Policy: SingleStack +IP Families: IPv4 +IP: 10.110.168.128 +IPs: 10.110.168.128 +Port: http 80/TCP +TargetPort: 5000/TCP +NodePort: http 30080/TCP +Endpoints: 10.244.0.12:5000,10.244.0.13:5000,10.244.0.14:5000 +Session Affinity: None +External Traffic Policy: Cluster +Internal Traffic Policy: Cluster +Events: + +$ kubectl get endpoints devops-app-py-service +Warning: v1 Endpoints is deprecated in v1.33+; use discovery.k8s.io/v1 EndpointSlice +NAME ENDPOINTS AGE +devops-app-py-service 10.244.0.12:5000,10.244.0.13:5000,10.244.0.14:5000 32s + +$ kubectl port-forward service/devops-app-py-service 8080:80 +Forwarding from 127.0.0.1:8080 -> 5000 +Forwarding from [::1]:8080 -> 5000 +Handling connection for 8080 +Handling connection for 8080 +Handling connection for 8080 +Handling connection for 8080 + +$ curl -fsSL 127.0.0.1:8080 | jq .service.name +"devops-info-service" + +$ curl -fsSL 127.0.0.1:8080/health | jq .status +"healthy" + +$ curl -fsSL 127.0.0.1:8080/ready | jq .status +"ready" + +$ curl -fsSL 127.0.0.1:8080/metrics | head -n 12 +# HELP http_requests_total Total HTTP requests handled by the service. +# TYPE http_requests_total counter +http_requests_total{endpoint="/ready",method="GET",status_code="200"} 180.0 +http_requests_total{endpoint="/health",method="GET",status_code="200"} 90.0 +http_requests_total{endpoint="/",method="GET",status_code="200"} 2.0 +http_requests_total{endpoint="/metrics",method="GET",status_code="200"} 1.0 +# HELP http_requests_created Total HTTP requests handled by the service. +# TYPE http_requests_created gauge +http_requests_created{endpoint="/ready",method="GET",status_code="200"} 1.7745777896655755e+09 +http_requests_created{endpoint="/health",method="GET",status_code="200"} 1.7745778018120363e+09 +http_requests_created{endpoint="/",method="GET",status_code="200"} 1.7745779956714542e+09 +http_requests_created{endpoint="/metrics",method="GET",status_code="200"} 1.7745779957933705e+09 +``` + +
+ +## Task 4 - Scaling and Updates + +I scaled the Deployment declaratively to 5 replicas and verified that all 5 Pods were running. For the rolling-update portion, I changed the pod template with a temporary `LOG_LEVEL=DEBUG` environment variable. An in-cluster probe exposed a brief failed request with `maxUnavailable: 1`, so I changed the strategy to `maxUnavailable: 0` and reran the rollout. With that stricter strategy, the Service returned `200` for 35 consecutive `/ready` checks during the rollout. I then used `kubectl rollout undo` and returned the live Deployment to the baseline `1.9-dev` pod template while keeping the safer rollout strategy in the manifest. + +
+Scaling to 5 replicas + +```text +$ kubectl apply -f k8s/deployment.yml +deployment.apps/devops-app-py configured + +$ kubectl rollout status deployment/devops-app-py --timeout=180s +Waiting for deployment "devops-app-py" rollout to finish: 3 of 5 updated replicas are available... +Waiting for deployment "devops-app-py" rollout to finish: 4 of 5 updated replicas are available... +deployment "devops-app-py" successfully rolled out + +$ kubectl get deployment devops-app-py -o wide +NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR +devops-app-py 5/5 5 5 21m devops-app-py localt0aster/devops-app-py:1.9-dev app.kubernetes.io/name=devops-app-py + +$ kubectl get pods -l app.kubernetes.io/name=devops-app-py -o wide +NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES +devops-app-py-76fc7985df-jmnrd 1/1 Running 0 13s 10.244.0.16 minikube +devops-app-py-76fc7985df-jq2tr 1/1 Running 0 21m 10.244.0.14 minikube +devops-app-py-76fc7985df-jrgms 1/1 Running 0 13s 10.244.0.15 minikube +devops-app-py-76fc7985df-jwpsf 1/1 Running 0 21m 10.244.0.13 minikube +devops-app-py-76fc7985df-nwr58 1/1 Running 0 21m 10.244.0.12 minikube +``` + +
+ +
+Rolling update with corrected zero-downtime strategy + +```text +$ kubectl apply -f k8s/deployment.yml +deployment.apps/devops-app-py configured + +$ kubectl rollout status deployment/devops-app-py --timeout=240s +Waiting for deployment "devops-app-py" rollout to finish: 1 out of 5 new replicas have been updated... +Waiting for deployment "devops-app-py" rollout to finish: 1 out of 5 new replicas have been updated... +Waiting for deployment "devops-app-py" rollout to finish: 1 out of 5 new replicas have been updated... +Waiting for deployment "devops-app-py" rollout to finish: 2 out of 5 new replicas have been updated... +Waiting for deployment "devops-app-py" rollout to finish: 2 out of 5 new replicas have been updated... +Waiting for deployment "devops-app-py" rollout to finish: 2 out of 5 new replicas have been updated... +Waiting for deployment "devops-app-py" rollout to finish: 2 out of 5 new replicas have been updated... +Waiting for deployment "devops-app-py" rollout to finish: 3 out of 5 new replicas have been updated... +Waiting for deployment "devops-app-py" rollout to finish: 3 out of 5 new replicas have been updated... +Waiting for deployment "devops-app-py" rollout to finish: 3 out of 5 new replicas have been updated... +Waiting for deployment "devops-app-py" rollout to finish: 3 out of 5 new replicas have been updated... +Waiting for deployment "devops-app-py" rollout to finish: 4 out of 5 new replicas have been updated... +Waiting for deployment "devops-app-py" rollout to finish: 4 out of 5 new replicas have been updated... +Waiting for deployment "devops-app-py" rollout to finish: 4 out of 5 new replicas have been updated... +Waiting for deployment "devops-app-py" rollout to finish: 4 out of 5 new replicas have been updated... +Waiting for deployment "devops-app-py" rollout to finish: 1 old replicas are pending termination... +Waiting for deployment "devops-app-py" rollout to finish: 1 old replicas are pending termination... +Waiting for deployment "devops-app-py" rollout to finish: 1 old replicas are pending termination... +deployment "devops-app-py" successfully rolled out + +$ kubectl get rs -l app.kubernetes.io/name=devops-app-py -o wide +NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR +devops-app-py-65fc658668 5 5 5 6m45s devops-app-py localt0aster/devops-app-py:1.9-dev app.kubernetes.io/name=devops-app-py,pod-template-hash=65fc658668 +devops-app-py-76fc7985df 0 0 0 29m devops-app-py localt0aster/devops-app-py:1.9-dev app.kubernetes.io/name=devops-app-py,pod-template-hash=76fc7985df + +$ kubectl get deployment devops-app-py -o wide +NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR +devops-app-py 5/5 5 5 29m devops-app-py localt0aster/devops-app-py:1.9-dev app.kubernetes.io/name=devops-app-py + +$ kubectl rollout history deployment/devops-app-py +deployment.apps/devops-app-py +REVISION CHANGE-CAUSE +5 +6 +``` + +
+ +
+In-cluster readiness probe during rollout + +```text +$ kubectl run task4-probe-zdt \ + --image=curlimages/curl --rm -i --command -- \ + sh -c ' + for i in $(seq 1 35); do + code=$(curl -sS -o /dev/null -w "%{http_code}" http://devops-app-py-service/ready) + printf "%s %s\n" "$(date +%H:%M:%S)" "$code" + sleep 1 + done + ' +All commands and output from this session will be recorded in container logs, including credentials and sensitive information passed through the command prompt. +If you don't see a command prompt, try pressing enter. +02:44:47 200 +02:44:48 200 +02:44:49 200 +02:44:50 200 +02:44:51 200 +02:44:52 200 +02:44:53 200 +02:44:54 200 +02:44:55 200 +02:44:56 200 +02:44:57 200 +02:44:58 200 +02:44:59 200 +02:45:00 200 +02:45:01 200 +02:45:02 200 +02:45:03 200 +02:45:04 200 +02:45:05 200 +02:45:06 200 +02:45:07 200 +02:45:08 200 +02:45:09 200 +02:45:10 200 +02:45:11 200 +02:45:12 200 +02:45:13 200 +02:45:14 200 +02:45:15 200 +02:45:16 200 +02:45:17 200 +02:45:18 200 +02:45:19 200 +02:45:20 200 +pod "task4-probe-zdt" deleted from default namespace +``` + +
+ +
+Rollback and rollout history + +```text +$ kubectl rollout undo deployment/devops-app-py +deployment.apps/devops-app-py rolled back + +$ kubectl rollout status deployment/devops-app-py --timeout=240s +Waiting for deployment "devops-app-py" rollout to finish: 1 out of 5 new replicas have been updated... +Waiting for deployment "devops-app-py" rollout to finish: 1 out of 5 new replicas have been updated... +Waiting for deployment "devops-app-py" rollout to finish: 1 out of 5 new replicas have been updated... +Waiting for deployment "devops-app-py" rollout to finish: 2 out of 5 new replicas have been updated... +Waiting for deployment "devops-app-py" rollout to finish: 2 out of 5 new replicas have been updated... +Waiting for deployment "devops-app-py" rollout to finish: 2 out of 5 new replicas have been updated... +Waiting for deployment "devops-app-py" rollout to finish: 2 out of 5 new replicas have been updated... +Waiting for deployment "devops-app-py" rollout to finish: 3 out of 5 new replicas have been updated... +Waiting for deployment "devops-app-py" rollout to finish: 3 out of 5 new replicas have been updated... +Waiting for deployment "devops-app-py" rollout to finish: 3 out of 5 new replicas have been updated... +Waiting for deployment "devops-app-py" rollout to finish: 3 out of 5 new replicas have been updated... +Waiting for deployment "devops-app-py" rollout to finish: 4 out of 5 new replicas have been updated... +Waiting for deployment "devops-app-py" rollout to finish: 4 out of 5 new replicas have been updated... +Waiting for deployment "devops-app-py" rollout to finish: 4 out of 5 new replicas have been updated... +Waiting for deployment "devops-app-py" rollout to finish: 4 out of 5 new replicas have been updated... +Waiting for deployment "devops-app-py" rollout to finish: 1 old replicas are pending termination... +Waiting for deployment "devops-app-py" rollout to finish: 1 old replicas are pending termination... +Waiting for deployment "devops-app-py" rollout to finish: 1 old replicas are pending termination... +deployment "devops-app-py" successfully rolled out + +$ kubectl get rs -l app.kubernetes.io/name=devops-app-py -o wide +NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR +devops-app-py-65fc658668 0 0 0 7m45s devops-app-py localt0aster/devops-app-py:1.9-dev app.kubernetes.io/name=devops-app-py,pod-template-hash=65fc658668 +devops-app-py-76fc7985df 5 5 5 30m devops-app-py localt0aster/devops-app-py:1.9-dev app.kubernetes.io/name=devops-app-py,pod-template-hash=76fc7985df + +$ kubectl get deployment devops-app-py -o wide +NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR +devops-app-py 5/5 5 5 30m devops-app-py localt0aster/devops-app-py:1.9-dev app.kubernetes.io/name=devops-app-py + +$ kubectl rollout history deployment/devops-app-py +deployment.apps/devops-app-py +REVISION CHANGE-CAUSE +6 +7 +``` + +
+ +## Task 5 - Documentation + +### Architecture Overview + +The final Kubernetes layout is one `Deployment` and one `NodePort` `Service` in the default namespace. The Deployment runs 5 Flask Pods from `localt0aster/devops-app-py:1.9-dev`, and the Service load-balances traffic from port `80` to container port `5000`. + +```mermaid +flowchart LR + Client[Client] + Service[NodePort Service
devops-app-py-service
80 -> 5000
30080/TCP] + Deployment[Deployment
devops-app-py
5 replicas] + Pod1[Pod
/] + Pod2[Pod
/health] + Pod3[Pod
/ready] + Pod4[Pod
/metrics] + Pod5[Pod
5000/TCP] + + Client --> Service + Service --> Deployment + Deployment --> Pod1 + Deployment --> Pod2 + Deployment --> Pod3 + Deployment --> Pod4 + Deployment --> Pod5 +``` + +The resource strategy is intentionally small and predictable for a local lab cluster: each Pod requests `100m` CPU and `128Mi` memory, with limits of `250m` CPU and `256Mi` memory. For rollouts, the Deployment now uses `maxSurge: 1` and `maxUnavailable: 0` to preserve availability during Pod replacement. + +### Manifest Files + +- `k8s/deployment.yml`: defines the `Deployment`, `5` replicas, the `1.9-dev` Python image, labels/selectors, container port, `HOST` and `PORT` environment variables, resource requests and limits, and liveness/readiness probes. `maxUnavailable: 0` was chosen after testing showed that `1` could still allow a transient failed request during rollout. +- `k8s/service.yml`: defines the `NodePort` `Service`, maps service port `80` to target port `5000`, uses node port `30080`, and selects Pods by `app.kubernetes.io/name=devops-app-py`. + +### Deployment Evidence + +
+Final cluster evidence + +```text +$ kubectl apply -f k8s/deployment.yml +deployment.apps/devops-app-py configured + +$ kubectl get all +NAME READY STATUS RESTARTS AGE +pod/devops-app-py-76fc7985df-6hmn5 1/1 Running 0 52s +pod/devops-app-py-76fc7985df-6rk64 1/1 Running 0 69s +pod/devops-app-py-76fc7985df-hr29v 1/1 Running 0 61s +pod/devops-app-py-76fc7985df-ptjkm 1/1 Running 0 78s +pod/devops-app-py-76fc7985df-t6d7b 1/1 Running 0 44s + +NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE +service/devops-app-py-service NodePort 10.110.168.128 80:30080/TCP 27m +service/kubernetes ClusterIP 10.96.0.1 443/TCP 107m + +NAME READY UP-TO-DATE AVAILABLE AGE +deployment.apps/devops-app-py 5/5 5 5 30m + +NAME DESIRED CURRENT READY AGE +replicaset.apps/devops-app-py-65fc658668 0 0 0 8m20s +replicaset.apps/devops-app-py-76fc7985df 5 5 5 30m + +$ kubectl get pods,svc -o wide +NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES +pod/devops-app-py-76fc7985df-6hmn5 1/1 Running 0 52s 10.244.0.47 minikube +pod/devops-app-py-76fc7985df-6rk64 1/1 Running 0 69s 10.244.0.45 minikube +pod/devops-app-py-76fc7985df-hr29v 1/1 Running 0 61s 10.244.0.46 minikube +pod/devops-app-py-76fc7985df-ptjkm 1/1 Running 0 78s 10.244.0.44 minikube +pod/devops-app-py-76fc7985df-t6d7b 1/1 Running 0 44s 10.244.0.48 minikube + +NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR +service/devops-app-py-service NodePort 10.110.168.128 80:30080/TCP 27m app.kubernetes.io/name=devops-app-py +service/kubernetes ClusterIP 10.96.0.1 443/TCP 107m + +$ kubectl describe deployment devops-app-py +Name: devops-app-py +Namespace: default +CreationTimestamp: Fri, 27 Mar 2026 05:16:21 +0300 +Labels: app.kubernetes.io/name=devops-app-py + app.kubernetes.io/part-of=devops-core-s26 +Annotations: deployment.kubernetes.io/revision: 7 +Selector: app.kubernetes.io/name=devops-app-py +Replicas: 5 desired | 5 updated | 5 total | 5 available | 0 unavailable +StrategyType: RollingUpdate +MinReadySeconds: 0 +RollingUpdateStrategy: 0 max unavailable, 1 max surge +Pod Template: + Labels: app.kubernetes.io/name=devops-app-py + app.kubernetes.io/part-of=devops-core-s26 + Containers: + devops-app-py: + Image: localt0aster/devops-app-py:1.9-dev + Port: 5000/TCP (http) + Host Port: 0/TCP (http) + Limits: + cpu: 250m + memory: 256Mi + Requests: + cpu: 100m + memory: 128Mi + Liveness: http-get http://:http/health delay=10s timeout=2s period=10s #success=1 #failure=3 + Readiness: http-get http://:http/ready delay=5s timeout=2s period=5s #success=1 #failure=3 + Environment: + HOST: 0.0.0.0 + PORT: 5000 + Mounts: + Volumes: + Node-Selectors: + Tolerations: +Conditions: + Type Status Reason + ---- ------ ------ + Available True MinimumReplicasAvailable + Progressing True NewReplicaSetAvailable +OldReplicaSets: devops-app-py-65fc658668 (0/0 replicas created) +NewReplicaSet: devops-app-py-76fc7985df (5/5 replicas created) +Events: + Type Reason Age From Message + ---- ------ ---- ---- ------- + Normal ScalingReplicaSet 30m deployment-controller Scaled up replica set devops-app-py-76fc7985df from 0 to 3 + Normal ScalingReplicaSet 9m21s deployment-controller Scaled up replica set devops-app-py-76fc7985df from 3 to 5 + Normal ScalingReplicaSet 8m20s deployment-controller Scaled up replica set devops-app-py-65fc658668 from 0 to 1 + Normal ScalingReplicaSet 8m20s deployment-controller Scaled up replica set devops-app-py-65fc658668 from 1 to 2 + Normal ScalingReplicaSet 8m12s deployment-controller Scaled down replica set devops-app-py-76fc7985df from 4 to 3 + Normal ScalingReplicaSet 8m12s deployment-controller Scaled up replica set devops-app-py-65fc658668 from 2 to 3 + Normal ScalingReplicaSet 8m12s deployment-controller Scaled down replica set devops-app-py-76fc7985df from 3 to 2 + Normal ScalingReplicaSet 8m12s deployment-controller Scaled up replica set devops-app-py-65fc658668 from 3 to 4 + Normal ScalingReplicaSet 8m3s deployment-controller Scaled down replica set devops-app-py-76fc7985df from 2 to 1 + Normal ScalingReplicaSet 4m58s (x2 over 8m20s) deployment-controller Scaled down replica set devops-app-py-76fc7985df from 5 to 4 + Normal ScalingReplicaSet 3m39s (x22 over 8m3s) deployment-controller (combined from similar events): Scaled up replica set devops-app-py-76fc7985df from 0 to 1 + +$ kubectl run task5-curl \ + --image=curlimages/curl \ + \ + --rm -i \ + --command -- \ + sh -c ' + curl -fsS http://devops-app-py-service + printf "\n\n" + curl -fsS http://devops-app-py-service/health + printf "\n\n" + curl -fsS http://devops-app-py-service/ready + printf "\n\n" + curl -fsS http://devops-app-py-service/metrics | head -n 12 + ' +{ + "endpoints": [ + { + "description": "Service information.", + "method": "GET", + "path": "/" + }, + { + "description": "Health check.", + "method": "GET", + "path": "/health" + }, + { + "description": "Prometheus metrics.", + "method": "GET", + "path": "/metrics" + }, + { + "description": "Readiness check.", + "method": "GET", + "path": "/ready" + } + ], + "request": { + "client_ip": "10.244.0.49", + "method": "GET", + "path": "/", + "user_agent": "curl/8.12.1" + }, + "runtime": { + "human": "0 hours, 1 minutes", + "seconds": 61 + }, + "service": { + "description": "DevOps course info service", + "framework": "Flask", + "name": "devops-info-service", + "version": "1.8.0" + }, + "system": { + "architecture": "x86_64", + "cpu_count": 8, + "hostname": "devops-app-py-76fc7985df-6rk64", + "platform": "Linux", + "platform_version": "Alpine Linux v3.23", + "python_version": "3.14.3" + } +} + + +{ + "status": "healthy", + "timestamp": "2026-03-27T02:47:15.357513+00:00", + "uptime_seconds": 70 +} + + +{ + "status": "ready", + "timestamp": "2026-03-27T02:47:15.363373+00:00", + "uptime_seconds": 53 +} + + +# HELP http_requests_total Total HTTP requests handled by the service. +# TYPE http_requests_total counter +http_requests_total{endpoint="/ready",method="GET",status_code="200"} 13.0 +http_requests_total{endpoint="/health",method="GET",status_code="200"} 5.0 +http_requests_total{endpoint="/",method="GET",status_code="200"} 1.0 +# HELP http_requests_created Total HTTP requests handled by the service. +# TYPE http_requests_created gauge +http_requests_created{endpoint="/ready",method="GET",status_code="200"} 1.7745795737986815e+09 +http_requests_created{endpoint="/health",method="GET",status_code="200"} 1.7745795857890186e+09 +http_requests_created{endpoint="/",method="GET",status_code="200"} 1.774579635349531e+09 +# HELP http_request_duration_seconds HTTP request duration in seconds. +# TYPE http_request_duration_seconds histogram +pod "task5-curl" deleted from default namespace +``` + +
+ +### Operations Performed + +1. Deployment and verification: + + ```bash + kubectl apply -f k8s/deployment.yml + kubectl rollout status deployment/devops-app-py + kubectl get deployment devops-app-py -o wide + kubectl get pods -l app.kubernetes.io/name=devops-app-py -o wide + kubectl describe deployment devops-app-py + ``` + +2. Service setup and access checks: + + ```bash + kubectl apply -f k8s/service.yml + kubectl describe service devops-app-py-service + kubectl port-forward service/devops-app-py-service 8080:80 + kubectl run task5-curl --image=curlimages/curl --rm -i --command -- sh + ``` + +3. Scaling to 5 replicas: + + ```bash + kubectl apply -f k8s/deployment.yml + kubectl rollout status deployment/devops-app-py --timeout=180s + kubectl get pods -l app.kubernetes.io/name=devops-app-py -o wide + ``` + +4. Rolling updates and rollback: + + ```bash + kubectl apply -f k8s/deployment.yml + kubectl rollout status deployment/devops-app-py --timeout=240s + kubectl rollout history deployment/devops-app-py + kubectl rollout undo deployment/devops-app-py + ``` + +### Production Considerations + +- Health checks: `/health` is used for liveness and `/ready` is used for readiness so Kubernetes only sends traffic to Pods that are actually prepared to serve requests. +- Rollout safety: `maxUnavailable: 0` and `maxSurge: 1` were chosen to keep capacity available during updates. This was not just theoretical; the strategy was tightened after observing a transient failed request with `maxUnavailable: 1`. +- Resource limits: `100m/128Mi` requests and `250m/256Mi` limits are reasonable for a lab environment and protect the single-node cluster from noisy-neighbor behavior. +- Observability: the app exposes `/metrics`, which is ready for Prometheus scraping. `kubectl describe`, rollout history, and event inspection were enough for this lab, but production should add centralized logs and dashboards. +- Further improvements: use image digests instead of mutable tags, add a `PodDisruptionBudget`, enable `HorizontalPodAutoscaler`, isolate workloads in a dedicated namespace, and place an Ingress with TLS in front of the NodePort service. + +### Challenges & Solutions + +- `minikube service devops-app-py-service --url` returned a valid NodePort URL, but with the Docker driver that node IP was not directly reachable from the host. I used `kubectl port-forward` for local testing and an in-cluster curl Pod for authoritative service verification. +- The first zero-downtime test with `maxUnavailable: 1` produced a brief failed request during rollout. Instead of papering over it, I changed the Deployment strategy to `maxUnavailable: 0` and reran the test until the probe showed a clean `200` sequence. +- Host-side port-forward tests can introduce their own connection artifacts during fast backend replacement. The more reliable method here was probing the Kubernetes Service from inside the cluster. diff --git a/k8s/deployment.yml b/k8s/deployment.yml new file mode 100644 index 0000000000..d54bc202ff --- /dev/null +++ b/k8s/deployment.yml @@ -0,0 +1,59 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: devops-app-py + labels: + app.kubernetes.io/name: devops-app-py + app.kubernetes.io/part-of: devops-core-s26 +spec: + replicas: 5 + revisionHistoryLimit: 5 + strategy: + type: RollingUpdate + rollingUpdate: + maxSurge: 1 + maxUnavailable: 0 + selector: + matchLabels: + app.kubernetes.io/name: devops-app-py + template: + metadata: + labels: + app.kubernetes.io/name: devops-app-py + app.kubernetes.io/part-of: devops-core-s26 + spec: + containers: + - name: devops-app-py + image: localt0aster/devops-app-py:1.9-dev + imagePullPolicy: IfNotPresent + ports: + - name: http + containerPort: 5000 + env: + - name: HOST + value: "0.0.0.0" + - name: PORT + value: "5000" + livenessProbe: + httpGet: + path: /health + port: http + initialDelaySeconds: 10 + periodSeconds: 10 + timeoutSeconds: 2 + failureThreshold: 3 + readinessProbe: + httpGet: + path: /ready + port: http + initialDelaySeconds: 5 + periodSeconds: 5 + timeoutSeconds: 2 + failureThreshold: 3 + resources: + requests: + cpu: 100m + memory: 128Mi + limits: + cpu: 250m + memory: 256Mi diff --git a/k8s/service.yml b/k8s/service.yml new file mode 100644 index 0000000000..a6ebff9108 --- /dev/null +++ b/k8s/service.yml @@ -0,0 +1,17 @@ +apiVersion: v1 +kind: Service +metadata: + name: devops-app-py-service + labels: + app.kubernetes.io/name: devops-app-py + app.kubernetes.io/part-of: devops-core-s26 +spec: + type: NodePort + selector: + app.kubernetes.io/name: devops-app-py + ports: + - name: http + protocol: TCP + port: 80 + targetPort: 5000 + nodePort: 30080 diff --git a/monitoring/docker-compose.yml b/monitoring/docker-compose.yml index 8b155f0c50..17e5da4e4d 100644 --- a/monitoring/docker-compose.yml +++ b/monitoring/docker-compose.yml @@ -133,7 +133,7 @@ services: restart: unless-stopped app-python: - image: localt0aster/devops-app-py:1.8.806c77e + image: localt0aster/devops-app-py:1.8 environment: HOST: "0.0.0.0" PORT: "8000" From b9f231351ce1b868afaea613cfe0893fe31dd77b Mon Sep 17 00:00:00 2001 From: LocalT0aster Dan <90502400+LocalT0aster@users.noreply.github.com> Date: Fri, 3 Apr 2026 10:13:34 +0300 Subject: [PATCH 10/21] Lab10 Complete (#10) * upd: version string * lab10 --- app_go/.dockerignore | 1 + app_go/Dockerfile | 4 +- app_go/go.mod | 2 +- app_go/main.go | 2 +- app_python/pyproject.toml | 2 +- app_python/src/router.py | 2 +- k8s/HELM.md | 16 + k8s/README.md | 656 +--------- k8s/deployment.yml | 2 +- k8s/devops-app-py/.helmignore | 23 + k8s/devops-app-py/Chart.yaml | 11 + k8s/devops-app-py/templates/NOTES.txt | 9 + k8s/devops-app-py/templates/_helpers.tpl | 73 ++ k8s/devops-app-py/templates/deployment.yaml | 55 + .../templates/hooks/post-install-job.yaml | 47 + .../templates/hooks/pre-install-job.yaml | 37 + k8s/devops-app-py/templates/service.yaml | 18 + k8s/devops-app-py/values-dev.yaml | 50 + k8s/devops-app-py/values-prod.yaml | 50 + k8s/devops-app-py/values.yaml | 79 ++ k8s/docs/LAB09.md | 651 ++++++++++ k8s/docs/LAB10.md | 1064 +++++++++++++++++ 22 files changed, 2202 insertions(+), 652 deletions(-) create mode 100644 k8s/HELM.md create mode 100644 k8s/devops-app-py/.helmignore create mode 100644 k8s/devops-app-py/Chart.yaml create mode 100644 k8s/devops-app-py/templates/NOTES.txt create mode 100644 k8s/devops-app-py/templates/_helpers.tpl create mode 100644 k8s/devops-app-py/templates/deployment.yaml create mode 100644 k8s/devops-app-py/templates/hooks/post-install-job.yaml create mode 100644 k8s/devops-app-py/templates/hooks/pre-install-job.yaml create mode 100644 k8s/devops-app-py/templates/service.yaml create mode 100644 k8s/devops-app-py/values-dev.yaml create mode 100644 k8s/devops-app-py/values-prod.yaml create mode 100644 k8s/devops-app-py/values.yaml create mode 100644 k8s/docs/LAB09.md create mode 100644 k8s/docs/LAB10.md diff --git a/app_go/.dockerignore b/app_go/.dockerignore index 6f1931b7cd..64ce80193c 100644 --- a/app_go/.dockerignore +++ b/app_go/.dockerignore @@ -2,3 +2,4 @@ !go.mod !go.sum !*.go +main_test.go diff --git a/app_go/Dockerfile b/app_go/Dockerfile index 09e812af80..e8e9d0dedd 100644 --- a/app_go/Dockerfile +++ b/app_go/Dockerfile @@ -1,8 +1,8 @@ -FROM golang:1.25-alpine AS build +FROM golang:1.26-alpine AS build WORKDIR /app COPY go.mod go.sum ./ RUN go mod download -COPY *.go ./ +COPY main.go ./ RUN CGO_ENABLED=0 GOOS=linux go build -o devops-info-service.out FROM scratch diff --git a/app_go/go.mod b/app_go/go.mod index 364c72ba68..1e5f872dad 100644 --- a/app_go/go.mod +++ b/app_go/go.mod @@ -1,6 +1,6 @@ module example.com/devops-info-service -go 1.25.0 +go 1.26.1 require github.com/prometheus/client_golang v1.23.2 diff --git a/app_go/main.go b/app_go/main.go index 898f940d7b..7e482b4e80 100644 --- a/app_go/main.go +++ b/app_go/main.go @@ -20,7 +20,7 @@ import ( const ( serviceName = "devops-info-service" - serviceVersion = "1.8.0" + serviceVersion = "1.10.0" serviceDescription = "DevOps course info service" serviceFramework = "Go net/http" serviceLoggerName = "devops_info_service" diff --git a/app_python/pyproject.toml b/app_python/pyproject.toml index deb962795e..ca312b1657 100644 --- a/app_python/pyproject.toml +++ b/app_python/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "devops-info-service" -version = "1.8.0" +version = "1.10.0" description = "" authors = [ {name = "LocalT0aster",email = "90502400+LocalT0aster@users.noreply.github.com"} diff --git a/app_python/src/router.py b/app_python/src/router.py index bd9315d8b5..35b32270f6 100644 --- a/app_python/src/router.py +++ b/app_python/src/router.py @@ -25,7 +25,7 @@ record_endpoint_call, ) -__version__ = "1.8.0" +__version__ = "1.10.0" def get_service_info() -> dict[str, str]: diff --git a/k8s/HELM.md b/k8s/HELM.md new file mode 100644 index 0000000000..43b7c1d2cd --- /dev/null +++ b/k8s/HELM.md @@ -0,0 +1,16 @@ +# Helm Notes + +This file exists to satisfy the Lab 10 requirement for a dedicated Helm document without forcing the entire Kubernetes module back into a flat documentation layout. + +## Lab 10 Documentation + +The full Helm lab write-up, command transcripts, and verification logs are kept in [docs/LAB10.md](docs/LAB10.md). The Task 5 documentation section that covers chart overview, configuration, hooks, operations, and validation is here: [docs/LAB10.md#task-5-documentation](docs/LAB10.md#task-5-documentation). + +## Why This Structure Is Better + +- `k8s/README.md` stays short and works as the module entry point instead of becoming a 50 kB transcript dump. +- `k8s/docs/LAB09.md` and `k8s/docs/LAB10.md` keep each lab self-contained, which scales better as more Kubernetes labs are added. +- Raw manifests and Helm chart files remain easy to find because documentation is separated from implementation files. +- `k8s/HELM.md` provides the explicit Helm-facing document name the lab expects, while the detailed content stays in the more maintainable `docs/` hierarchy. + +In short, `HELM.md` is the compatibility layer, and `k8s/docs/` is the maintainable structure. diff --git a/k8s/README.md b/k8s/README.md index 01f5ed71a6..28a4c6df35 100644 --- a/k8s/README.md +++ b/k8s/README.md @@ -1,650 +1,16 @@ -# Kubernetes Lab 9 +# Kubernetes Module -## Task 1 - Local Kubernetes Setup +This directory contains the Kubernetes deliverables for the course application. It includes the raw Kubernetes manifests used in Lab 9, the Helm chart created in Lab 10, and the lab write-ups moved into `k8s/docs/` so the module root stays readable. -I used `minikube` because it was in Arch Linux extra repo (`kind` is only in AUR), integrates cleanly with the Docker driver, and has more features. +The main deployment assets are: -
-Cluster setup verification output +- `deployment.yml`: baseline Kubernetes `Deployment` manifest for the Python app. +- `service.yml`: baseline Kubernetes `Service` manifest exposing the app inside the cluster and via `NodePort`. +- `devops-app-py/`: Helm chart version of the application deployment. +- `docs/`: lab documentation split by assignment. -```text -$ minikube status -minikube -type: Control Plane -host: Running -kubelet: Running -apiserver: Running -kubeconfig: Configured +## Documentation - -$ kubectl cluster-info -Kubernetes control plane is running at https://192.168.49.2:8443 -CoreDNS is running at https://192.168.49.2:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy - -To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'. - -$ kubectl get nodes -o wide -NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME -minikube Ready control-plane 2m45s v1.35.1 192.168.49.2 Debian GNU/Linux 12 (bookworm) 6.19.10-1-cachyos docker://29.2.1 - -$ kubectl get namespaces -NAME STATUS AGE -default Active 3m9s -kube-node-lease Active 3m9s -kube-public Active 3m9s -kube-system Active 3m9s -``` - -
- -## Task 2 - Application Deployment - -The initial Task 2 deployment used `localt0aster/devops-app-py:1.9-dev` with 3 replicas, rolling updates, and resource requests and limits. At that stage, the probes were `GET /health` for liveness and `GET /ready` for readiness. Task 4 later scaled the manifest to 5 replicas and tightened the rollout strategy. - -
-Deployment rollout verification output - -```text -$ kubectl delete deployment devops-app-py --cascade=foreground --wait=true -deployment.apps "devops-app-py" deleted from default namespace - -$ kubectl apply -f k8s/deployment.yml -deployment.apps/devops-app-py created - -$ kubectl rollout status deployment/devops-app-py --timeout=180s -Waiting for deployment "devops-app-py" rollout to finish: 0 of 3 updated replicas are available... -Waiting for deployment "devops-app-py" rollout to finish: 1 of 3 updated replicas are available... -Waiting for deployment "devops-app-py" rollout to finish: 2 of 3 updated replicas are available... -deployment "devops-app-py" successfully rolled out - -$ kubectl get deployment devops-app-py -NAME READY UP-TO-DATE AVAILABLE AGE -devops-app-py 3/3 3 3 8s - -$ kubectl get pods -l app.kubernetes.io/name=devops-app-py -o wide -NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES -devops-app-py-76fc7985df-jq2tr 1/1 Running 0 8s 10.244.0.14 minikube -devops-app-py-76fc7985df-jwpsf 1/1 Running 0 8s 10.244.0.13 minikube -devops-app-py-76fc7985df-nwr58 1/1 Running 0 8s 10.244.0.12 minikube - -$ kubectl describe deployment devops-app-py -Name: devops-app-py -Namespace: default -CreationTimestamp: Fri, 27 Mar 2026 05:16:21 +0300 -Labels: app.kubernetes.io/name=devops-app-py - app.kubernetes.io/part-of=devops-core-s26 -Annotations: deployment.kubernetes.io/revision: 1 -Selector: app.kubernetes.io/name=devops-app-py -Replicas: 3 desired | 3 updated | 3 total | 3 available | 0 unavailable -StrategyType: RollingUpdate -MinReadySeconds: 0 -RollingUpdateStrategy: 1 max unavailable, 1 max surge -Pod Template: - Labels: app.kubernetes.io/name=devops-app-py - app.kubernetes.io/part-of=devops-core-s26 - Containers: - devops-app-py: - Image: localt0aster/devops-app-py:1.9-dev - Port: 5000/TCP (http) - Host Port: 0/TCP (http) - Limits: - cpu: 250m - memory: 256Mi - Requests: - cpu: 100m - memory: 128Mi - Liveness: http-get http://:http/health delay=10s timeout=2s period=10s #success=1 #failure=3 - Readiness: http-get http://:http/ready delay=5s timeout=2s period=5s #success=1 #failure=3 - Environment: - HOST: 0.0.0.0 - PORT: 5000 - Mounts: - Volumes: - Node-Selectors: - Tolerations: -Conditions: - Type Status Reason - ---- ------ ------ - Available True MinimumReplicasAvailable - Progressing True NewReplicaSetAvailable -OldReplicaSets: -NewReplicaSet: devops-app-py-76fc7985df (3/3 replicas created) -Events: - Type Reason Age From Message - ---- ------ ---- ---- ------- - Normal ScalingReplicaSet 9s deployment-controller Scaled up replica set devops-app-py-76fc7985df from 0 to 3 -``` - -
- -## Task 3 - Service Configuration - -The Service uses type `NodePort` and targets the Deployment Pods with the `app.kubernetes.io/name=devops-app-py` label. It exposes service port `80` and forwards traffic to container port `5000` on a fixed NodePort, `30080`. - -For connectivity verification, I used `kubectl port-forward service/devops-app-py-service 8080:80`. I tested `minikube service ... --url` first, but in this Docker-driver setup the returned node IP was not directly reachable from the host, so port-forward was the practical local-access path. - -
-Service verification output - -```text -$ kubectl apply -f k8s/service.yml -service/devops-app-py-service unchanged - -$ kubectl get services -NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE -devops-app-py-service NodePort 10.110.168.128 80:30080/TCP 32s -kubernetes ClusterIP 10.96.0.1 443/TCP 80m - -$ kubectl describe service devops-app-py-service -Name: devops-app-py-service -Namespace: default -Labels: app.kubernetes.io/name=devops-app-py - app.kubernetes.io/part-of=devops-core-s26 -Annotations: -Selector: app.kubernetes.io/name=devops-app-py -Type: NodePort -IP Family Policy: SingleStack -IP Families: IPv4 -IP: 10.110.168.128 -IPs: 10.110.168.128 -Port: http 80/TCP -TargetPort: 5000/TCP -NodePort: http 30080/TCP -Endpoints: 10.244.0.12:5000,10.244.0.13:5000,10.244.0.14:5000 -Session Affinity: None -External Traffic Policy: Cluster -Internal Traffic Policy: Cluster -Events: - -$ kubectl get endpoints devops-app-py-service -Warning: v1 Endpoints is deprecated in v1.33+; use discovery.k8s.io/v1 EndpointSlice -NAME ENDPOINTS AGE -devops-app-py-service 10.244.0.12:5000,10.244.0.13:5000,10.244.0.14:5000 32s - -$ kubectl port-forward service/devops-app-py-service 8080:80 -Forwarding from 127.0.0.1:8080 -> 5000 -Forwarding from [::1]:8080 -> 5000 -Handling connection for 8080 -Handling connection for 8080 -Handling connection for 8080 -Handling connection for 8080 - -$ curl -fsSL 127.0.0.1:8080 | jq .service.name -"devops-info-service" - -$ curl -fsSL 127.0.0.1:8080/health | jq .status -"healthy" - -$ curl -fsSL 127.0.0.1:8080/ready | jq .status -"ready" - -$ curl -fsSL 127.0.0.1:8080/metrics | head -n 12 -# HELP http_requests_total Total HTTP requests handled by the service. -# TYPE http_requests_total counter -http_requests_total{endpoint="/ready",method="GET",status_code="200"} 180.0 -http_requests_total{endpoint="/health",method="GET",status_code="200"} 90.0 -http_requests_total{endpoint="/",method="GET",status_code="200"} 2.0 -http_requests_total{endpoint="/metrics",method="GET",status_code="200"} 1.0 -# HELP http_requests_created Total HTTP requests handled by the service. -# TYPE http_requests_created gauge -http_requests_created{endpoint="/ready",method="GET",status_code="200"} 1.7745777896655755e+09 -http_requests_created{endpoint="/health",method="GET",status_code="200"} 1.7745778018120363e+09 -http_requests_created{endpoint="/",method="GET",status_code="200"} 1.7745779956714542e+09 -http_requests_created{endpoint="/metrics",method="GET",status_code="200"} 1.7745779957933705e+09 -``` - -
- -## Task 4 - Scaling and Updates - -I scaled the Deployment declaratively to 5 replicas and verified that all 5 Pods were running. For the rolling-update portion, I changed the pod template with a temporary `LOG_LEVEL=DEBUG` environment variable. An in-cluster probe exposed a brief failed request with `maxUnavailable: 1`, so I changed the strategy to `maxUnavailable: 0` and reran the rollout. With that stricter strategy, the Service returned `200` for 35 consecutive `/ready` checks during the rollout. I then used `kubectl rollout undo` and returned the live Deployment to the baseline `1.9-dev` pod template while keeping the safer rollout strategy in the manifest. - -
-Scaling to 5 replicas - -```text -$ kubectl apply -f k8s/deployment.yml -deployment.apps/devops-app-py configured - -$ kubectl rollout status deployment/devops-app-py --timeout=180s -Waiting for deployment "devops-app-py" rollout to finish: 3 of 5 updated replicas are available... -Waiting for deployment "devops-app-py" rollout to finish: 4 of 5 updated replicas are available... -deployment "devops-app-py" successfully rolled out - -$ kubectl get deployment devops-app-py -o wide -NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR -devops-app-py 5/5 5 5 21m devops-app-py localt0aster/devops-app-py:1.9-dev app.kubernetes.io/name=devops-app-py - -$ kubectl get pods -l app.kubernetes.io/name=devops-app-py -o wide -NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES -devops-app-py-76fc7985df-jmnrd 1/1 Running 0 13s 10.244.0.16 minikube -devops-app-py-76fc7985df-jq2tr 1/1 Running 0 21m 10.244.0.14 minikube -devops-app-py-76fc7985df-jrgms 1/1 Running 0 13s 10.244.0.15 minikube -devops-app-py-76fc7985df-jwpsf 1/1 Running 0 21m 10.244.0.13 minikube -devops-app-py-76fc7985df-nwr58 1/1 Running 0 21m 10.244.0.12 minikube -``` - -
- -
-Rolling update with corrected zero-downtime strategy - -```text -$ kubectl apply -f k8s/deployment.yml -deployment.apps/devops-app-py configured - -$ kubectl rollout status deployment/devops-app-py --timeout=240s -Waiting for deployment "devops-app-py" rollout to finish: 1 out of 5 new replicas have been updated... -Waiting for deployment "devops-app-py" rollout to finish: 1 out of 5 new replicas have been updated... -Waiting for deployment "devops-app-py" rollout to finish: 1 out of 5 new replicas have been updated... -Waiting for deployment "devops-app-py" rollout to finish: 2 out of 5 new replicas have been updated... -Waiting for deployment "devops-app-py" rollout to finish: 2 out of 5 new replicas have been updated... -Waiting for deployment "devops-app-py" rollout to finish: 2 out of 5 new replicas have been updated... -Waiting for deployment "devops-app-py" rollout to finish: 2 out of 5 new replicas have been updated... -Waiting for deployment "devops-app-py" rollout to finish: 3 out of 5 new replicas have been updated... -Waiting for deployment "devops-app-py" rollout to finish: 3 out of 5 new replicas have been updated... -Waiting for deployment "devops-app-py" rollout to finish: 3 out of 5 new replicas have been updated... -Waiting for deployment "devops-app-py" rollout to finish: 3 out of 5 new replicas have been updated... -Waiting for deployment "devops-app-py" rollout to finish: 4 out of 5 new replicas have been updated... -Waiting for deployment "devops-app-py" rollout to finish: 4 out of 5 new replicas have been updated... -Waiting for deployment "devops-app-py" rollout to finish: 4 out of 5 new replicas have been updated... -Waiting for deployment "devops-app-py" rollout to finish: 4 out of 5 new replicas have been updated... -Waiting for deployment "devops-app-py" rollout to finish: 1 old replicas are pending termination... -Waiting for deployment "devops-app-py" rollout to finish: 1 old replicas are pending termination... -Waiting for deployment "devops-app-py" rollout to finish: 1 old replicas are pending termination... -deployment "devops-app-py" successfully rolled out - -$ kubectl get rs -l app.kubernetes.io/name=devops-app-py -o wide -NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR -devops-app-py-65fc658668 5 5 5 6m45s devops-app-py localt0aster/devops-app-py:1.9-dev app.kubernetes.io/name=devops-app-py,pod-template-hash=65fc658668 -devops-app-py-76fc7985df 0 0 0 29m devops-app-py localt0aster/devops-app-py:1.9-dev app.kubernetes.io/name=devops-app-py,pod-template-hash=76fc7985df - -$ kubectl get deployment devops-app-py -o wide -NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR -devops-app-py 5/5 5 5 29m devops-app-py localt0aster/devops-app-py:1.9-dev app.kubernetes.io/name=devops-app-py - -$ kubectl rollout history deployment/devops-app-py -deployment.apps/devops-app-py -REVISION CHANGE-CAUSE -5 -6 -``` - -
- -
-In-cluster readiness probe during rollout - -```text -$ kubectl run task4-probe-zdt \ - --image=curlimages/curl --rm -i --command -- \ - sh -c ' - for i in $(seq 1 35); do - code=$(curl -sS -o /dev/null -w "%{http_code}" http://devops-app-py-service/ready) - printf "%s %s\n" "$(date +%H:%M:%S)" "$code" - sleep 1 - done - ' -All commands and output from this session will be recorded in container logs, including credentials and sensitive information passed through the command prompt. -If you don't see a command prompt, try pressing enter. -02:44:47 200 -02:44:48 200 -02:44:49 200 -02:44:50 200 -02:44:51 200 -02:44:52 200 -02:44:53 200 -02:44:54 200 -02:44:55 200 -02:44:56 200 -02:44:57 200 -02:44:58 200 -02:44:59 200 -02:45:00 200 -02:45:01 200 -02:45:02 200 -02:45:03 200 -02:45:04 200 -02:45:05 200 -02:45:06 200 -02:45:07 200 -02:45:08 200 -02:45:09 200 -02:45:10 200 -02:45:11 200 -02:45:12 200 -02:45:13 200 -02:45:14 200 -02:45:15 200 -02:45:16 200 -02:45:17 200 -02:45:18 200 -02:45:19 200 -02:45:20 200 -pod "task4-probe-zdt" deleted from default namespace -``` - -
- -
-Rollback and rollout history - -```text -$ kubectl rollout undo deployment/devops-app-py -deployment.apps/devops-app-py rolled back - -$ kubectl rollout status deployment/devops-app-py --timeout=240s -Waiting for deployment "devops-app-py" rollout to finish: 1 out of 5 new replicas have been updated... -Waiting for deployment "devops-app-py" rollout to finish: 1 out of 5 new replicas have been updated... -Waiting for deployment "devops-app-py" rollout to finish: 1 out of 5 new replicas have been updated... -Waiting for deployment "devops-app-py" rollout to finish: 2 out of 5 new replicas have been updated... -Waiting for deployment "devops-app-py" rollout to finish: 2 out of 5 new replicas have been updated... -Waiting for deployment "devops-app-py" rollout to finish: 2 out of 5 new replicas have been updated... -Waiting for deployment "devops-app-py" rollout to finish: 2 out of 5 new replicas have been updated... -Waiting for deployment "devops-app-py" rollout to finish: 3 out of 5 new replicas have been updated... -Waiting for deployment "devops-app-py" rollout to finish: 3 out of 5 new replicas have been updated... -Waiting for deployment "devops-app-py" rollout to finish: 3 out of 5 new replicas have been updated... -Waiting for deployment "devops-app-py" rollout to finish: 3 out of 5 new replicas have been updated... -Waiting for deployment "devops-app-py" rollout to finish: 4 out of 5 new replicas have been updated... -Waiting for deployment "devops-app-py" rollout to finish: 4 out of 5 new replicas have been updated... -Waiting for deployment "devops-app-py" rollout to finish: 4 out of 5 new replicas have been updated... -Waiting for deployment "devops-app-py" rollout to finish: 4 out of 5 new replicas have been updated... -Waiting for deployment "devops-app-py" rollout to finish: 1 old replicas are pending termination... -Waiting for deployment "devops-app-py" rollout to finish: 1 old replicas are pending termination... -Waiting for deployment "devops-app-py" rollout to finish: 1 old replicas are pending termination... -deployment "devops-app-py" successfully rolled out - -$ kubectl get rs -l app.kubernetes.io/name=devops-app-py -o wide -NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR -devops-app-py-65fc658668 0 0 0 7m45s devops-app-py localt0aster/devops-app-py:1.9-dev app.kubernetes.io/name=devops-app-py,pod-template-hash=65fc658668 -devops-app-py-76fc7985df 5 5 5 30m devops-app-py localt0aster/devops-app-py:1.9-dev app.kubernetes.io/name=devops-app-py,pod-template-hash=76fc7985df - -$ kubectl get deployment devops-app-py -o wide -NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR -devops-app-py 5/5 5 5 30m devops-app-py localt0aster/devops-app-py:1.9-dev app.kubernetes.io/name=devops-app-py - -$ kubectl rollout history deployment/devops-app-py -deployment.apps/devops-app-py -REVISION CHANGE-CAUSE -6 -7 -``` - -
- -## Task 5 - Documentation - -### Architecture Overview - -The final Kubernetes layout is one `Deployment` and one `NodePort` `Service` in the default namespace. The Deployment runs 5 Flask Pods from `localt0aster/devops-app-py:1.9-dev`, and the Service load-balances traffic from port `80` to container port `5000`. - -```mermaid -flowchart LR - Client[Client] - Service[NodePort Service
devops-app-py-service
80 -> 5000
30080/TCP] - Deployment[Deployment
devops-app-py
5 replicas] - Pod1[Pod
/] - Pod2[Pod
/health] - Pod3[Pod
/ready] - Pod4[Pod
/metrics] - Pod5[Pod
5000/TCP] - - Client --> Service - Service --> Deployment - Deployment --> Pod1 - Deployment --> Pod2 - Deployment --> Pod3 - Deployment --> Pod4 - Deployment --> Pod5 -``` - -The resource strategy is intentionally small and predictable for a local lab cluster: each Pod requests `100m` CPU and `128Mi` memory, with limits of `250m` CPU and `256Mi` memory. For rollouts, the Deployment now uses `maxSurge: 1` and `maxUnavailable: 0` to preserve availability during Pod replacement. - -### Manifest Files - -- `k8s/deployment.yml`: defines the `Deployment`, `5` replicas, the `1.9-dev` Python image, labels/selectors, container port, `HOST` and `PORT` environment variables, resource requests and limits, and liveness/readiness probes. `maxUnavailable: 0` was chosen after testing showed that `1` could still allow a transient failed request during rollout. -- `k8s/service.yml`: defines the `NodePort` `Service`, maps service port `80` to target port `5000`, uses node port `30080`, and selects Pods by `app.kubernetes.io/name=devops-app-py`. - -### Deployment Evidence - -
-Final cluster evidence - -```text -$ kubectl apply -f k8s/deployment.yml -deployment.apps/devops-app-py configured - -$ kubectl get all -NAME READY STATUS RESTARTS AGE -pod/devops-app-py-76fc7985df-6hmn5 1/1 Running 0 52s -pod/devops-app-py-76fc7985df-6rk64 1/1 Running 0 69s -pod/devops-app-py-76fc7985df-hr29v 1/1 Running 0 61s -pod/devops-app-py-76fc7985df-ptjkm 1/1 Running 0 78s -pod/devops-app-py-76fc7985df-t6d7b 1/1 Running 0 44s - -NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE -service/devops-app-py-service NodePort 10.110.168.128 80:30080/TCP 27m -service/kubernetes ClusterIP 10.96.0.1 443/TCP 107m - -NAME READY UP-TO-DATE AVAILABLE AGE -deployment.apps/devops-app-py 5/5 5 5 30m - -NAME DESIRED CURRENT READY AGE -replicaset.apps/devops-app-py-65fc658668 0 0 0 8m20s -replicaset.apps/devops-app-py-76fc7985df 5 5 5 30m - -$ kubectl get pods,svc -o wide -NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES -pod/devops-app-py-76fc7985df-6hmn5 1/1 Running 0 52s 10.244.0.47 minikube -pod/devops-app-py-76fc7985df-6rk64 1/1 Running 0 69s 10.244.0.45 minikube -pod/devops-app-py-76fc7985df-hr29v 1/1 Running 0 61s 10.244.0.46 minikube -pod/devops-app-py-76fc7985df-ptjkm 1/1 Running 0 78s 10.244.0.44 minikube -pod/devops-app-py-76fc7985df-t6d7b 1/1 Running 0 44s 10.244.0.48 minikube - -NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR -service/devops-app-py-service NodePort 10.110.168.128 80:30080/TCP 27m app.kubernetes.io/name=devops-app-py -service/kubernetes ClusterIP 10.96.0.1 443/TCP 107m - -$ kubectl describe deployment devops-app-py -Name: devops-app-py -Namespace: default -CreationTimestamp: Fri, 27 Mar 2026 05:16:21 +0300 -Labels: app.kubernetes.io/name=devops-app-py - app.kubernetes.io/part-of=devops-core-s26 -Annotations: deployment.kubernetes.io/revision: 7 -Selector: app.kubernetes.io/name=devops-app-py -Replicas: 5 desired | 5 updated | 5 total | 5 available | 0 unavailable -StrategyType: RollingUpdate -MinReadySeconds: 0 -RollingUpdateStrategy: 0 max unavailable, 1 max surge -Pod Template: - Labels: app.kubernetes.io/name=devops-app-py - app.kubernetes.io/part-of=devops-core-s26 - Containers: - devops-app-py: - Image: localt0aster/devops-app-py:1.9-dev - Port: 5000/TCP (http) - Host Port: 0/TCP (http) - Limits: - cpu: 250m - memory: 256Mi - Requests: - cpu: 100m - memory: 128Mi - Liveness: http-get http://:http/health delay=10s timeout=2s period=10s #success=1 #failure=3 - Readiness: http-get http://:http/ready delay=5s timeout=2s period=5s #success=1 #failure=3 - Environment: - HOST: 0.0.0.0 - PORT: 5000 - Mounts: - Volumes: - Node-Selectors: - Tolerations: -Conditions: - Type Status Reason - ---- ------ ------ - Available True MinimumReplicasAvailable - Progressing True NewReplicaSetAvailable -OldReplicaSets: devops-app-py-65fc658668 (0/0 replicas created) -NewReplicaSet: devops-app-py-76fc7985df (5/5 replicas created) -Events: - Type Reason Age From Message - ---- ------ ---- ---- ------- - Normal ScalingReplicaSet 30m deployment-controller Scaled up replica set devops-app-py-76fc7985df from 0 to 3 - Normal ScalingReplicaSet 9m21s deployment-controller Scaled up replica set devops-app-py-76fc7985df from 3 to 5 - Normal ScalingReplicaSet 8m20s deployment-controller Scaled up replica set devops-app-py-65fc658668 from 0 to 1 - Normal ScalingReplicaSet 8m20s deployment-controller Scaled up replica set devops-app-py-65fc658668 from 1 to 2 - Normal ScalingReplicaSet 8m12s deployment-controller Scaled down replica set devops-app-py-76fc7985df from 4 to 3 - Normal ScalingReplicaSet 8m12s deployment-controller Scaled up replica set devops-app-py-65fc658668 from 2 to 3 - Normal ScalingReplicaSet 8m12s deployment-controller Scaled down replica set devops-app-py-76fc7985df from 3 to 2 - Normal ScalingReplicaSet 8m12s deployment-controller Scaled up replica set devops-app-py-65fc658668 from 3 to 4 - Normal ScalingReplicaSet 8m3s deployment-controller Scaled down replica set devops-app-py-76fc7985df from 2 to 1 - Normal ScalingReplicaSet 4m58s (x2 over 8m20s) deployment-controller Scaled down replica set devops-app-py-76fc7985df from 5 to 4 - Normal ScalingReplicaSet 3m39s (x22 over 8m3s) deployment-controller (combined from similar events): Scaled up replica set devops-app-py-76fc7985df from 0 to 1 - -$ kubectl run task5-curl \ - --image=curlimages/curl \ - \ - --rm -i \ - --command -- \ - sh -c ' - curl -fsS http://devops-app-py-service - printf "\n\n" - curl -fsS http://devops-app-py-service/health - printf "\n\n" - curl -fsS http://devops-app-py-service/ready - printf "\n\n" - curl -fsS http://devops-app-py-service/metrics | head -n 12 - ' -{ - "endpoints": [ - { - "description": "Service information.", - "method": "GET", - "path": "/" - }, - { - "description": "Health check.", - "method": "GET", - "path": "/health" - }, - { - "description": "Prometheus metrics.", - "method": "GET", - "path": "/metrics" - }, - { - "description": "Readiness check.", - "method": "GET", - "path": "/ready" - } - ], - "request": { - "client_ip": "10.244.0.49", - "method": "GET", - "path": "/", - "user_agent": "curl/8.12.1" - }, - "runtime": { - "human": "0 hours, 1 minutes", - "seconds": 61 - }, - "service": { - "description": "DevOps course info service", - "framework": "Flask", - "name": "devops-info-service", - "version": "1.8.0" - }, - "system": { - "architecture": "x86_64", - "cpu_count": 8, - "hostname": "devops-app-py-76fc7985df-6rk64", - "platform": "Linux", - "platform_version": "Alpine Linux v3.23", - "python_version": "3.14.3" - } -} - - -{ - "status": "healthy", - "timestamp": "2026-03-27T02:47:15.357513+00:00", - "uptime_seconds": 70 -} - - -{ - "status": "ready", - "timestamp": "2026-03-27T02:47:15.363373+00:00", - "uptime_seconds": 53 -} - - -# HELP http_requests_total Total HTTP requests handled by the service. -# TYPE http_requests_total counter -http_requests_total{endpoint="/ready",method="GET",status_code="200"} 13.0 -http_requests_total{endpoint="/health",method="GET",status_code="200"} 5.0 -http_requests_total{endpoint="/",method="GET",status_code="200"} 1.0 -# HELP http_requests_created Total HTTP requests handled by the service. -# TYPE http_requests_created gauge -http_requests_created{endpoint="/ready",method="GET",status_code="200"} 1.7745795737986815e+09 -http_requests_created{endpoint="/health",method="GET",status_code="200"} 1.7745795857890186e+09 -http_requests_created{endpoint="/",method="GET",status_code="200"} 1.774579635349531e+09 -# HELP http_request_duration_seconds HTTP request duration in seconds. -# TYPE http_request_duration_seconds histogram -pod "task5-curl" deleted from default namespace -``` - -
- -### Operations Performed - -1. Deployment and verification: - - ```bash - kubectl apply -f k8s/deployment.yml - kubectl rollout status deployment/devops-app-py - kubectl get deployment devops-app-py -o wide - kubectl get pods -l app.kubernetes.io/name=devops-app-py -o wide - kubectl describe deployment devops-app-py - ``` - -2. Service setup and access checks: - - ```bash - kubectl apply -f k8s/service.yml - kubectl describe service devops-app-py-service - kubectl port-forward service/devops-app-py-service 8080:80 - kubectl run task5-curl --image=curlimages/curl --rm -i --command -- sh - ``` - -3. Scaling to 5 replicas: - - ```bash - kubectl apply -f k8s/deployment.yml - kubectl rollout status deployment/devops-app-py --timeout=180s - kubectl get pods -l app.kubernetes.io/name=devops-app-py -o wide - ``` - -4. Rolling updates and rollback: - - ```bash - kubectl apply -f k8s/deployment.yml - kubectl rollout status deployment/devops-app-py --timeout=240s - kubectl rollout history deployment/devops-app-py - kubectl rollout undo deployment/devops-app-py - ``` - -### Production Considerations - -- Health checks: `/health` is used for liveness and `/ready` is used for readiness so Kubernetes only sends traffic to Pods that are actually prepared to serve requests. -- Rollout safety: `maxUnavailable: 0` and `maxSurge: 1` were chosen to keep capacity available during updates. This was not just theoretical; the strategy was tightened after observing a transient failed request with `maxUnavailable: 1`. -- Resource limits: `100m/128Mi` requests and `250m/256Mi` limits are reasonable for a lab environment and protect the single-node cluster from noisy-neighbor behavior. -- Observability: the app exposes `/metrics`, which is ready for Prometheus scraping. `kubectl describe`, rollout history, and event inspection were enough for this lab, but production should add centralized logs and dashboards. -- Further improvements: use image digests instead of mutable tags, add a `PodDisruptionBudget`, enable `HorizontalPodAutoscaler`, isolate workloads in a dedicated namespace, and place an Ingress with TLS in front of the NodePort service. - -### Challenges & Solutions - -- `minikube service devops-app-py-service --url` returned a valid NodePort URL, but with the Docker driver that node IP was not directly reachable from the host. I used `kubectl port-forward` for local testing and an in-cluster curl Pod for authoritative service verification. -- The first zero-downtime test with `maxUnavailable: 1` produced a brief failed request during rollout. Instead of papering over it, I changed the Deployment strategy to `maxUnavailable: 0` and reran the test until the probe showed a clean `200` sequence. -- Host-side port-forward tests can introduce their own connection artifacts during fast backend replacement. The more reliable method here was probing the Kubernetes Service from inside the cluster. +- [Helm Notes](HELM.md) +- [Lab 09 - Kubernetes Basics](docs/LAB09.md) +- [Lab 10 - Helm Package Manager](docs/LAB10.md) diff --git a/k8s/deployment.yml b/k8s/deployment.yml index d54bc202ff..362ce70e04 100644 --- a/k8s/deployment.yml +++ b/k8s/deployment.yml @@ -24,7 +24,7 @@ spec: spec: containers: - name: devops-app-py - image: localt0aster/devops-app-py:1.9-dev + image: localt0aster/devops-app-py:1.9 imagePullPolicy: IfNotPresent ports: - name: http diff --git a/k8s/devops-app-py/.helmignore b/k8s/devops-app-py/.helmignore new file mode 100644 index 0000000000..0e8a0eb36f --- /dev/null +++ b/k8s/devops-app-py/.helmignore @@ -0,0 +1,23 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*.orig +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ diff --git a/k8s/devops-app-py/Chart.yaml b/k8s/devops-app-py/Chart.yaml new file mode 100644 index 0000000000..27bec28eb8 --- /dev/null +++ b/k8s/devops-app-py/Chart.yaml @@ -0,0 +1,11 @@ +apiVersion: v2 +name: devops-app-py +description: Helm chart for the DevOps Core Python application +type: application +version: 0.2.0 +appVersion: "1.9" +keywords: + - python + - flask + - kubernetes + - helm diff --git a/k8s/devops-app-py/templates/NOTES.txt b/k8s/devops-app-py/templates/NOTES.txt new file mode 100644 index 0000000000..7919c1775c --- /dev/null +++ b/k8s/devops-app-py/templates/NOTES.txt @@ -0,0 +1,9 @@ +1. Review the release: + helm status {{ .Release.Name }} -n {{ .Release.Namespace }} + +2. Forward the service locally: + kubectl port-forward svc/{{ include "devops-app-py.serviceName" . }} 8080:{{ .Values.service.port }} -n {{ .Release.Namespace }} + +3. Verify the application: + curl -fsSL http://127.0.0.1:8080/health | jq + curl -fsSL http://127.0.0.1:8080/ready | jq diff --git a/k8s/devops-app-py/templates/_helpers.tpl b/k8s/devops-app-py/templates/_helpers.tpl new file mode 100644 index 0000000000..80d7509c6b --- /dev/null +++ b/k8s/devops-app-py/templates/_helpers.tpl @@ -0,0 +1,73 @@ +{{/* +Expand the name of the chart. +*/}} +{{- define "devops-app-py.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "devops-app-py.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "devops-app-py.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "devops-app-py.labels" -}} +helm.sh/chart: {{ include "devops-app-py.chart" . }} +{{ include "devops-app-py.selectorLabels" . }} +{{- if (or .Values.image.tag .Chart.AppVersion) }} +app.kubernetes.io/version: {{ .Values.image.tag | default .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +app.kubernetes.io/part-of: {{ .Values.partOf }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "devops-app-py.selectorLabels" -}} +app.kubernetes.io/name: {{ include "devops-app-py.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} + +{{/* +Create the service name. +*/}} +{{- define "devops-app-py.serviceName" -}} +{{- printf "%s-service" (include "devops-app-py.fullname" .) | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create the pre-install hook job name. +*/}} +{{- define "devops-app-py.preInstallJobName" -}} +{{- printf "%s-pre-install" (include "devops-app-py.fullname" .) | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create the post-install hook job name. +*/}} +{{- define "devops-app-py.postInstallJobName" -}} +{{- printf "%s-post-install" (include "devops-app-py.fullname" .) | trunc 63 | trimSuffix "-" }} +{{- end }} diff --git a/k8s/devops-app-py/templates/deployment.yaml b/k8s/devops-app-py/templates/deployment.yaml new file mode 100644 index 0000000000..d77904e81b --- /dev/null +++ b/k8s/devops-app-py/templates/deployment.yaml @@ -0,0 +1,55 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "devops-app-py.fullname" . }} + labels: + {{- include "devops-app-py.labels" . | nindent 4 }} +spec: + replicas: {{ .Values.replicaCount }} + revisionHistoryLimit: {{ .Values.deployment.revisionHistoryLimit }} + strategy: + type: RollingUpdate + rollingUpdate: + maxSurge: {{ .Values.deployment.strategy.maxSurge }} + maxUnavailable: {{ .Values.deployment.strategy.maxUnavailable }} + selector: + matchLabels: + {{- include "devops-app-py.selectorLabels" . | nindent 6 }} + template: + metadata: + {{- with .Values.podAnnotations }} + annotations: + {{- toYaml . | nindent 8 }} + {{- end }} + labels: + {{- include "devops-app-py.selectorLabels" . | nindent 8 }} + app.kubernetes.io/part-of: {{ .Values.partOf }} + {{- with .Values.podLabels }} + {{- toYaml . | nindent 8 }} + {{- end }} + spec: + containers: + - name: {{ include "devops-app-py.name" . }} + image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" + imagePullPolicy: {{ .Values.image.pullPolicy }} + ports: + - name: http + containerPort: {{ .Values.containerPort }} + protocol: TCP + env: + {{- range .Values.env }} + - name: {{ .name }} + value: {{ .value | quote }} + {{- end }} + {{- with .Values.livenessProbe }} + livenessProbe: + {{- toYaml . | nindent 12 }} + {{- end }} + {{- with .Values.readinessProbe }} + readinessProbe: + {{- toYaml . | nindent 12 }} + {{- end }} + {{- with .Values.resources }} + resources: + {{- toYaml . | nindent 12 }} + {{- end }} diff --git a/k8s/devops-app-py/templates/hooks/post-install-job.yaml b/k8s/devops-app-py/templates/hooks/post-install-job.yaml new file mode 100644 index 0000000000..80c10d64b2 --- /dev/null +++ b/k8s/devops-app-py/templates/hooks/post-install-job.yaml @@ -0,0 +1,47 @@ +{{- if .Values.hooks.postInstall.enabled }} +apiVersion: batch/v1 +kind: Job +metadata: + name: {{ include "devops-app-py.postInstallJobName" . }} + labels: + {{- include "devops-app-py.labels" . | nindent 4 }} + app.kubernetes.io/component: hook + annotations: + "helm.sh/hook": post-install + "helm.sh/hook-weight": {{ .Values.hooks.postInstall.weight | quote }} + "helm.sh/hook-delete-policy": {{ .Values.hooks.postInstall.deletePolicy | quote }} +spec: + backoffLimit: 0 + template: + metadata: + labels: + {{- include "devops-app-py.selectorLabels" . | nindent 8 }} + app.kubernetes.io/component: hook + spec: + restartPolicy: Never + containers: + - name: post-install-smoke-test + image: "{{ .Values.hooks.postInstall.image.repository }}:{{ .Values.hooks.postInstall.image.tag }}" + imagePullPolicy: {{ .Values.hooks.postInstall.image.pullPolicy }} + command: + - sh + - -c + - | + set -eu + url="http://{{ include "devops-app-py.serviceName" . }}:{{ .Values.service.port }}/ready" + attempt=1 + while [ "$attempt" -le {{ .Values.hooks.postInstall.maxAttempts }} ]; do + code="$(curl -sS -o /tmp/ready.json -w "%{http_code}" "$url" || true)" + if [ "$code" = "200" ]; then + echo "Smoke test passed on attempt ${attempt}" + cat /tmp/ready.json + sleep 3 + exit 0 + fi + echo "Attempt ${attempt} returned ${code}" + attempt=$((attempt + 1)) + sleep {{ .Values.hooks.postInstall.retryIntervalSeconds }} + done + echo "Smoke test failed for ${url}" + exit 1 +{{- end }} diff --git a/k8s/devops-app-py/templates/hooks/pre-install-job.yaml b/k8s/devops-app-py/templates/hooks/pre-install-job.yaml new file mode 100644 index 0000000000..5493e472b5 --- /dev/null +++ b/k8s/devops-app-py/templates/hooks/pre-install-job.yaml @@ -0,0 +1,37 @@ +{{- if .Values.hooks.preInstall.enabled }} +apiVersion: batch/v1 +kind: Job +metadata: + name: {{ include "devops-app-py.preInstallJobName" . }} + labels: + {{- include "devops-app-py.labels" . | nindent 4 }} + app.kubernetes.io/component: hook + annotations: + "helm.sh/hook": pre-install + "helm.sh/hook-weight": {{ .Values.hooks.preInstall.weight | quote }} + "helm.sh/hook-delete-policy": {{ .Values.hooks.preInstall.deletePolicy | quote }} +spec: + backoffLimit: 0 + template: + metadata: + labels: + {{- include "devops-app-py.selectorLabels" . | nindent 8 }} + app.kubernetes.io/component: hook + spec: + restartPolicy: Never + containers: + - name: pre-install-validation + image: "{{ .Values.hooks.preInstall.image.repository }}:{{ .Values.hooks.preInstall.image.tag }}" + imagePullPolicy: {{ .Values.hooks.preInstall.image.pullPolicy }} + command: + - sh + - -c + - | + set -eu + echo "Pre-install validation for {{ .Release.Name }}" + echo "Namespace: {{ .Release.Namespace }}" + echo "Image tag: {{ .Values.image.tag | default .Chart.AppVersion }}" + echo "Replica count: {{ .Values.replicaCount }}" + sleep 3 + echo "Pre-install validation completed" +{{- end }} diff --git a/k8s/devops-app-py/templates/service.yaml b/k8s/devops-app-py/templates/service.yaml new file mode 100644 index 0000000000..03a7ec5675 --- /dev/null +++ b/k8s/devops-app-py/templates/service.yaml @@ -0,0 +1,18 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ include "devops-app-py.serviceName" . }} + labels: + {{- include "devops-app-py.labels" . | nindent 4 }} +spec: + type: {{ .Values.service.type }} + ports: + - name: http + protocol: TCP + port: {{ .Values.service.port }} + targetPort: {{ .Values.service.targetPort }} + {{- if and (or (eq .Values.service.type "NodePort") (eq .Values.service.type "LoadBalancer")) .Values.service.nodePort }} + nodePort: {{ .Values.service.nodePort }} + {{- end }} + selector: + {{- include "devops-app-py.selectorLabels" . | nindent 4 }} diff --git a/k8s/devops-app-py/values-dev.yaml b/k8s/devops-app-py/values-dev.yaml new file mode 100644 index 0000000000..f2d401a344 --- /dev/null +++ b/k8s/devops-app-py/values-dev.yaml @@ -0,0 +1,50 @@ +replicaCount: 1 + +image: + tag: "1.9-dev" + +deployment: + revisionHistoryLimit: 2 + +env: + - name: HOST + value: "0.0.0.0" + - name: PORT + value: "5000" + - name: APP_ENV + value: "development" + +podLabels: + environment: dev + +service: + type: NodePort + port: 80 + targetPort: 5000 + nodePort: 30081 + +resources: + requests: + cpu: 50m + memory: 64Mi + limits: + cpu: 100m + memory: 128Mi + +livenessProbe: + httpGet: + path: /health + port: http + initialDelaySeconds: 5 + periodSeconds: 10 + timeoutSeconds: 2 + failureThreshold: 3 + +readinessProbe: + httpGet: + path: /ready + port: http + initialDelaySeconds: 3 + periodSeconds: 5 + timeoutSeconds: 2 + failureThreshold: 3 diff --git a/k8s/devops-app-py/values-prod.yaml b/k8s/devops-app-py/values-prod.yaml new file mode 100644 index 0000000000..cca4fee171 --- /dev/null +++ b/k8s/devops-app-py/values-prod.yaml @@ -0,0 +1,50 @@ +replicaCount: 3 + +image: + tag: "1.9" + +deployment: + revisionHistoryLimit: 10 + +env: + - name: HOST + value: "0.0.0.0" + - name: PORT + value: "5000" + - name: APP_ENV + value: "production" + +podLabels: + environment: prod + +service: + type: LoadBalancer + port: 80 + targetPort: 5000 + nodePort: 30081 + +resources: + requests: + cpu: 200m + memory: 256Mi + limits: + cpu: 500m + memory: 512Mi + +livenessProbe: + httpGet: + path: /health + port: http + initialDelaySeconds: 30 + periodSeconds: 5 + timeoutSeconds: 2 + failureThreshold: 3 + +readinessProbe: + httpGet: + path: /ready + port: http + initialDelaySeconds: 10 + periodSeconds: 3 + timeoutSeconds: 2 + failureThreshold: 3 diff --git a/k8s/devops-app-py/values.yaml b/k8s/devops-app-py/values.yaml new file mode 100644 index 0000000000..251caf59d7 --- /dev/null +++ b/k8s/devops-app-py/values.yaml @@ -0,0 +1,79 @@ +replicaCount: 5 +partOf: devops-core-s26 + +image: + repository: localt0aster/devops-app-py + tag: "1.9" + pullPolicy: IfNotPresent + +containerPort: 5000 + +nameOverride: "" +fullnameOverride: "" + +podAnnotations: {} +podLabels: {} + +deployment: + revisionHistoryLimit: 5 + strategy: + maxSurge: 1 + maxUnavailable: 0 + +env: + - name: HOST + value: "0.0.0.0" + - name: PORT + value: "5000" + +service: + type: NodePort + port: 80 + targetPort: 5000 + nodePort: 30080 + +resources: + requests: + cpu: 100m + memory: 128Mi + limits: + cpu: 250m + memory: 256Mi + +livenessProbe: + httpGet: + path: /health + port: http + initialDelaySeconds: 10 + periodSeconds: 10 + timeoutSeconds: 2 + failureThreshold: 3 + +readinessProbe: + httpGet: + path: /ready + port: http + initialDelaySeconds: 5 + periodSeconds: 5 + timeoutSeconds: 2 + failureThreshold: 3 + +hooks: + preInstall: + enabled: true + weight: -5 + deletePolicy: before-hook-creation,hook-succeeded + image: + repository: busybox + tag: "1.37.0" + pullPolicy: IfNotPresent + postInstall: + enabled: true + weight: 5 + deletePolicy: before-hook-creation,hook-succeeded + image: + repository: curlimages/curl + tag: "8.12.1" + pullPolicy: IfNotPresent + maxAttempts: 20 + retryIntervalSeconds: 3 diff --git a/k8s/docs/LAB09.md b/k8s/docs/LAB09.md new file mode 100644 index 0000000000..b20187c999 --- /dev/null +++ b/k8s/docs/LAB09.md @@ -0,0 +1,651 @@ +# Kubernetes Lab 9 + +## Task 1 - Local Kubernetes Setup + +I used `minikube` because it was in Arch Linux extra repo (`kind` is only in AUR), integrates cleanly with the Docker driver, and has more features. + +
+Cluster setup verification output + +```text +$ minikube status +minikube +type: Control Plane +host: Running +kubelet: Running +apiserver: Running +kubeconfig: Configured + + +$ kubectl cluster-info +Kubernetes control plane is running at https://192.168.49.2:8443 +CoreDNS is running at https://192.168.49.2:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy + +To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'. + +$ kubectl get nodes -o wide +NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME +minikube Ready control-plane 2m45s v1.35.1 192.168.49.2 Debian GNU/Linux 12 (bookworm) 6.19.10-1-cachyos docker://29.2.1 + +$ kubectl get namespaces +NAME STATUS AGE +default Active 3m9s +kube-node-lease Active 3m9s +kube-public Active 3m9s +kube-system Active 3m9s +``` + +
+ +## Task 2 - Application Deployment + +The initial Task 2 deployment used `localt0aster/devops-app-py:1.9` with 3 replicas, rolling updates, and resource requests and limits. At that stage, the probes were `GET /health` for liveness and `GET /ready` for readiness. Task 4 later scaled the manifest to 5 replicas and tightened the rollout strategy. + +
+Deployment rollout verification output + +```text +$ kubectl delete deployment devops-app-py --cascade=foreground --wait=true +deployment.apps "devops-app-py" deleted from default namespace + +$ kubectl apply -f k8s/deployment.yml +deployment.apps/devops-app-py created + +$ kubectl rollout status deployment/devops-app-py --timeout=180s +Waiting for deployment "devops-app-py" rollout to finish: 0 of 3 updated replicas are available... +Waiting for deployment "devops-app-py" rollout to finish: 1 of 3 updated replicas are available... +Waiting for deployment "devops-app-py" rollout to finish: 2 of 3 updated replicas are available... +deployment "devops-app-py" successfully rolled out + +$ kubectl get deployment devops-app-py +NAME READY UP-TO-DATE AVAILABLE AGE +devops-app-py 3/3 3 3 8s + +$ kubectl get pods -l app.kubernetes.io/name=devops-app-py -o wide +NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES +devops-app-py-76fc7985df-jq2tr 1/1 Running 0 8s 10.244.0.14 minikube +devops-app-py-76fc7985df-jwpsf 1/1 Running 0 8s 10.244.0.13 minikube +devops-app-py-76fc7985df-nwr58 1/1 Running 0 8s 10.244.0.12 minikube + +$ kubectl describe deployment devops-app-py +Name: devops-app-py +Namespace: default +CreationTimestamp: Fri, 27 Mar 2026 05:16:21 +0300 +Labels: app.kubernetes.io/name=devops-app-py + app.kubernetes.io/part-of=devops-core-s26 +Annotations: deployment.kubernetes.io/revision: 1 +Selector: app.kubernetes.io/name=devops-app-py +Replicas: 3 desired | 3 updated | 3 total | 3 available | 0 unavailable +StrategyType: RollingUpdate +MinReadySeconds: 0 +RollingUpdateStrategy: 1 max unavailable, 1 max surge +Pod Template: + Labels: app.kubernetes.io/name=devops-app-py + app.kubernetes.io/part-of=devops-core-s26 + Containers: + devops-app-py: + Image: localt0aster/devops-app-py:1.9 + Port: 5000/TCP (http) + Host Port: 0/TCP (http) + Limits: + cpu: 250m + memory: 256Mi + Requests: + cpu: 100m + memory: 128Mi + Liveness: http-get http://:http/health delay=10s timeout=2s period=10s #success=1 #failure=3 + Readiness: http-get http://:http/ready delay=5s timeout=2s period=5s #success=1 #failure=3 + Environment: + HOST: 0.0.0.0 + PORT: 5000 + Mounts: + Volumes: + Node-Selectors: + Tolerations: +Conditions: + Type Status Reason + ---- ------ ------ + Available True MinimumReplicasAvailable + Progressing True NewReplicaSetAvailable +OldReplicaSets: +NewReplicaSet: devops-app-py-76fc7985df (3/3 replicas created) +Events: + Type Reason Age From Message + ---- ------ ---- ---- ------- + Normal ScalingReplicaSet 9s deployment-controller Scaled up replica set devops-app-py-76fc7985df from 0 to 3 +``` + +
+ +## Task 3 - Service Configuration + +The Service uses type `NodePort` and targets the Deployment Pods with the `app.kubernetes.io/name=devops-app-py` label. It exposes service port `80` and forwards traffic to container port `5000` on a fixed NodePort, `30080`. + +For connectivity verification, I used `kubectl port-forward service/devops-app-py-service 8080:80`. I tested `minikube service ... --url` first, but in this Docker-driver setup the returned node IP was not directly reachable from the host, so port-forward was the practical local-access path. + +
+Service verification output + +```text +$ kubectl apply -f k8s/service.yml +service/devops-app-py-service unchanged + +$ kubectl get services +NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE +devops-app-py-service NodePort 10.110.168.128 80:30080/TCP 32s +kubernetes ClusterIP 10.96.0.1 443/TCP 80m + +$ kubectl describe service devops-app-py-service +Name: devops-app-py-service +Namespace: default +Labels: app.kubernetes.io/name=devops-app-py + app.kubernetes.io/part-of=devops-core-s26 +Annotations: +Selector: app.kubernetes.io/name=devops-app-py +Type: NodePort +IP Family Policy: SingleStack +IP Families: IPv4 +IP: 10.110.168.128 +IPs: 10.110.168.128 +Port: http 80/TCP +TargetPort: 5000/TCP +NodePort: http 30080/TCP +Endpoints: 10.244.0.12:5000,10.244.0.13:5000,10.244.0.14:5000 +Session Affinity: None +External Traffic Policy: Cluster +Internal Traffic Policy: Cluster +Events: + +$ kubectl get endpoints devops-app-py-service +Warning: v1 Endpoints is deprecated in v1.33+; use discovery.k8s.io/v1 EndpointSlice +NAME ENDPOINTS AGE +devops-app-py-service 10.244.0.12:5000,10.244.0.13:5000,10.244.0.14:5000 32s + +$ kubectl port-forward service/devops-app-py-service 8080:80 +Forwarding from 127.0.0.1:8080 -> 5000 +Forwarding from [::1]:8080 -> 5000 +Handling connection for 8080 +Handling connection for 8080 +Handling connection for 8080 +Handling connection for 8080 + +$ curl -fsSL 127.0.0.1:8080 | jq .service.name +"devops-info-service" + +$ curl -fsSL 127.0.0.1:8080/health | jq .status +"healthy" + +$ curl -fsSL 127.0.0.1:8080/ready | jq .status +"ready" + +$ curl -fsSL 127.0.0.1:8080/metrics | head -n 12 +# HELP http_requests_total Total HTTP requests handled by the service. +# TYPE http_requests_total counter +http_requests_total{endpoint="/ready",method="GET",status_code="200"} 180.0 +http_requests_total{endpoint="/health",method="GET",status_code="200"} 90.0 +http_requests_total{endpoint="/",method="GET",status_code="200"} 2.0 +http_requests_total{endpoint="/metrics",method="GET",status_code="200"} 1.0 +# HELP http_requests_created Total HTTP requests handled by the service. +# TYPE http_requests_created gauge +http_requests_created{endpoint="/ready",method="GET",status_code="200"} 1.7745777896655755e+09 +http_requests_created{endpoint="/health",method="GET",status_code="200"} 1.7745778018120363e+09 +http_requests_created{endpoint="/",method="GET",status_code="200"} 1.7745779956714542e+09 +http_requests_created{endpoint="/metrics",method="GET",status_code="200"} 1.7745779957933705e+09 +``` + +
+ +## Task 4 - Scaling and Updates + +I scaled the Deployment declaratively to 5 replicas and verified that all 5 Pods were running. For the rolling-update portion, I changed the pod template with a temporary `LOG_LEVEL=DEBUG` environment variable. An in-cluster probe exposed a brief failed request with `maxUnavailable: 1`, so I changed the strategy to `maxUnavailable: 0` and reran the rollout. With that stricter strategy, the Service returned `200` for 35 consecutive `/ready` checks during the rollout. I then used `kubectl rollout undo` and returned the live Deployment to the baseline `1.9` pod template while keeping the safer rollout strategy in the manifest. + +
+Scaling to 5 replicas + +```text +$ kubectl apply -f k8s/deployment.yml +deployment.apps/devops-app-py configured + +$ kubectl rollout status deployment/devops-app-py --timeout=180s +Waiting for deployment "devops-app-py" rollout to finish: 3 of 5 updated replicas are available... +Waiting for deployment "devops-app-py" rollout to finish: 4 of 5 updated replicas are available... +deployment "devops-app-py" successfully rolled out + +$ kubectl get deployment devops-app-py -o wide +NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR +devops-app-py 5/5 5 5 21m devops-app-py localt0aster/devops-app-py:1.9 app.kubernetes.io/name=devops-app-py + +$ kubectl get pods -l app.kubernetes.io/name=devops-app-py -o wide +NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES +devops-app-py-76fc7985df-jmnrd 1/1 Running 0 13s 10.244.0.16 minikube +devops-app-py-76fc7985df-jq2tr 1/1 Running 0 21m 10.244.0.14 minikube +devops-app-py-76fc7985df-jrgms 1/1 Running 0 13s 10.244.0.15 minikube +devops-app-py-76fc7985df-jwpsf 1/1 Running 0 21m 10.244.0.13 minikube +devops-app-py-76fc7985df-nwr58 1/1 Running 0 21m 10.244.0.12 minikube +``` + +
+ +
+Rolling update with corrected zero-downtime strategy + +```text +$ kubectl apply -f k8s/deployment.yml +deployment.apps/devops-app-py configured + +$ kubectl rollout status deployment/devops-app-py --timeout=240s +Waiting for deployment "devops-app-py" rollout to finish: 1 out of 5 new replicas have been updated... +Waiting for deployment "devops-app-py" rollout to finish: 1 out of 5 new replicas have been updated... +Waiting for deployment "devops-app-py" rollout to finish: 1 out of 5 new replicas have been updated... +Waiting for deployment "devops-app-py" rollout to finish: 2 out of 5 new replicas have been updated... +Waiting for deployment "devops-app-py" rollout to finish: 2 out of 5 new replicas have been updated... +Waiting for deployment "devops-app-py" rollout to finish: 2 out of 5 new replicas have been updated... +Waiting for deployment "devops-app-py" rollout to finish: 2 out of 5 new replicas have been updated... +Waiting for deployment "devops-app-py" rollout to finish: 3 out of 5 new replicas have been updated... +Waiting for deployment "devops-app-py" rollout to finish: 3 out of 5 new replicas have been updated... +Waiting for deployment "devops-app-py" rollout to finish: 3 out of 5 new replicas have been updated... +Waiting for deployment "devops-app-py" rollout to finish: 3 out of 5 new replicas have been updated... +Waiting for deployment "devops-app-py" rollout to finish: 4 out of 5 new replicas have been updated... +Waiting for deployment "devops-app-py" rollout to finish: 4 out of 5 new replicas have been updated... +Waiting for deployment "devops-app-py" rollout to finish: 4 out of 5 new replicas have been updated... +Waiting for deployment "devops-app-py" rollout to finish: 4 out of 5 new replicas have been updated... +Waiting for deployment "devops-app-py" rollout to finish: 1 old replicas are pending termination... +Waiting for deployment "devops-app-py" rollout to finish: 1 old replicas are pending termination... +Waiting for deployment "devops-app-py" rollout to finish: 1 old replicas are pending termination... +deployment "devops-app-py" successfully rolled out + +$ kubectl get rs -l app.kubernetes.io/name=devops-app-py -o wide +NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR +devops-app-py-65fc658668 5 5 5 6m45s devops-app-py localt0aster/devops-app-py:1.9 app.kubernetes.io/name=devops-app-py,pod-template-hash=65fc658668 +devops-app-py-76fc7985df 0 0 0 29m devops-app-py localt0aster/devops-app-py:1.9 app.kubernetes.io/name=devops-app-py,pod-template-hash=76fc7985df + +$ kubectl get deployment devops-app-py -o wide +NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR +devops-app-py 5/5 5 5 29m devops-app-py localt0aster/devops-app-py:1.9 app.kubernetes.io/name=devops-app-py + +$ kubectl rollout history deployment/devops-app-py +deployment.apps/devops-app-py +REVISION CHANGE-CAUSE +5 +6 +``` + +
+ +
+In-cluster readiness probe during rollout + +```text +$ kubectl run task4-probe-zdt \ + --image=curlimages/curl --rm -i --command -- \ + sh -c ' + for i in $(seq 1 35); do + code=$(curl -sS -o /dev/null -w "%{http_code}" http://devops-app-py-service/ready) + printf "%s %s\n" "$(date +%H:%M:%S)" "$code" + sleep 1 + done + ' +All commands and output from this session will be recorded in container logs, including credentials and sensitive information passed through the command prompt. +If you don't see a command prompt, try pressing enter. +02:44:47 200 +02:44:48 200 +02:44:49 200 +02:44:50 200 +02:44:51 200 +02:44:52 200 +02:44:53 200 +02:44:54 200 +02:44:55 200 +02:44:56 200 +02:44:57 200 +02:44:58 200 +02:44:59 200 +02:45:00 200 +02:45:01 200 +02:45:02 200 +02:45:03 200 +02:45:04 200 +02:45:05 200 +02:45:06 200 +02:45:07 200 +02:45:08 200 +02:45:09 200 +02:45:10 200 +02:45:11 200 +02:45:12 200 +02:45:13 200 +02:45:14 200 +02:45:15 200 +02:45:16 200 +02:45:17 200 +02:45:18 200 +02:45:19 200 +02:45:20 200 +pod "task4-probe-zdt" deleted from default namespace +``` + +
+ +
+Rollback and rollout history + +```text +$ kubectl rollout undo deployment/devops-app-py +deployment.apps/devops-app-py rolled back + +$ kubectl rollout status deployment/devops-app-py --timeout=240s +Waiting for deployment "devops-app-py" rollout to finish: 1 out of 5 new replicas have been updated... +Waiting for deployment "devops-app-py" rollout to finish: 1 out of 5 new replicas have been updated... +Waiting for deployment "devops-app-py" rollout to finish: 1 out of 5 new replicas have been updated... +Waiting for deployment "devops-app-py" rollout to finish: 2 out of 5 new replicas have been updated... +Waiting for deployment "devops-app-py" rollout to finish: 2 out of 5 new replicas have been updated... +Waiting for deployment "devops-app-py" rollout to finish: 2 out of 5 new replicas have been updated... +Waiting for deployment "devops-app-py" rollout to finish: 2 out of 5 new replicas have been updated... +Waiting for deployment "devops-app-py" rollout to finish: 3 out of 5 new replicas have been updated... +Waiting for deployment "devops-app-py" rollout to finish: 3 out of 5 new replicas have been updated... +Waiting for deployment "devops-app-py" rollout to finish: 3 out of 5 new replicas have been updated... +Waiting for deployment "devops-app-py" rollout to finish: 3 out of 5 new replicas have been updated... +Waiting for deployment "devops-app-py" rollout to finish: 4 out of 5 new replicas have been updated... +Waiting for deployment "devops-app-py" rollout to finish: 4 out of 5 new replicas have been updated... +Waiting for deployment "devops-app-py" rollout to finish: 4 out of 5 new replicas have been updated... +Waiting for deployment "devops-app-py" rollout to finish: 4 out of 5 new replicas have been updated... +Waiting for deployment "devops-app-py" rollout to finish: 1 old replicas are pending termination... +Waiting for deployment "devops-app-py" rollout to finish: 1 old replicas are pending termination... +Waiting for deployment "devops-app-py" rollout to finish: 1 old replicas are pending termination... +deployment "devops-app-py" successfully rolled out + +$ kubectl get rs -l app.kubernetes.io/name=devops-app-py -o wide +NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR +devops-app-py-65fc658668 0 0 0 7m45s devops-app-py localt0aster/devops-app-py:1.9 app.kubernetes.io/name=devops-app-py,pod-template-hash=65fc658668 +devops-app-py-76fc7985df 5 5 5 30m devops-app-py localt0aster/devops-app-py:1.9 app.kubernetes.io/name=devops-app-py,pod-template-hash=76fc7985df + +$ kubectl get deployment devops-app-py -o wide +NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR +devops-app-py 5/5 5 5 30m devops-app-py localt0aster/devops-app-py:1.9 app.kubernetes.io/name=devops-app-py + +$ kubectl rollout history deployment/devops-app-py +deployment.apps/devops-app-py +REVISION CHANGE-CAUSE +6 +7 +``` + +
+ +## Task 5 - Documentation + +### Architecture Overview + +The final Kubernetes layout is one `Deployment` and one `NodePort` `Service` in the default namespace. The Deployment runs 5 Flask Pods from `localt0aster/devops-app-py:1.9`, and the Service load-balances traffic from port `80` to container port `5000`. + +```mermaid +flowchart LR + Client[Client] + Service[NodePort Service
devops-app-py-service
80 -> 5000
30080/TCP] + Deployment[Deployment
devops-app-py
5 replicas] + Pod1[Pod
/] + Pod2[Pod
/health] + Pod3[Pod
/ready] + Pod4[Pod
/metrics] + Pod5[Pod
5000/TCP] + + Client --> Service + Service --> Deployment + Deployment --> Pod1 + Deployment --> Pod2 + Deployment --> Pod3 + Deployment --> Pod4 + Deployment --> Pod5 +``` + +The resource strategy is intentionally small and predictable for a local lab cluster: each Pod requests `100m` CPU and `128Mi` memory, with limits of `250m` CPU and `256Mi` memory. For rollouts, the Deployment now uses `maxSurge: 1` and `maxUnavailable: 0` to preserve availability during Pod replacement. + +### Manifest Files + +- `k8s/deployment.yml`: defines the `Deployment`, `5` replicas, the `1.9` Python image, labels/selectors, container port, `HOST` and `PORT` environment variables, resource requests and limits, and liveness/readiness probes. `maxUnavailable: 0` was chosen after testing showed that `1` could still allow a transient failed request during rollout. +- `k8s/service.yml`: defines the `NodePort` `Service`, maps service port `80` to target port `5000`, uses node port `30080`, and selects Pods by `app.kubernetes.io/name=devops-app-py`. + +### Deployment Evidence + +
+Final cluster evidence + +```text +$ kubectl apply -f k8s/deployment.yml +deployment.apps/devops-app-py configured + +$ kubectl get all +NAME READY STATUS RESTARTS AGE +pod/devops-app-py-76fc7985df-6hmn5 1/1 Running 0 52s +pod/devops-app-py-76fc7985df-6rk64 1/1 Running 0 69s +pod/devops-app-py-76fc7985df-hr29v 1/1 Running 0 61s +pod/devops-app-py-76fc7985df-ptjkm 1/1 Running 0 78s +pod/devops-app-py-76fc7985df-t6d7b 1/1 Running 0 44s + +NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE +service/devops-app-py-service NodePort 10.110.168.128 80:30080/TCP 27m +service/kubernetes ClusterIP 10.96.0.1 443/TCP 107m + +NAME READY UP-TO-DATE AVAILABLE AGE +deployment.apps/devops-app-py 5/5 5 5 30m + +NAME DESIRED CURRENT READY AGE +replicaset.apps/devops-app-py-65fc658668 0 0 0 8m20s +replicaset.apps/devops-app-py-76fc7985df 5 5 5 30m + +$ kubectl get pods,svc -o wide +NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES +pod/devops-app-py-76fc7985df-6hmn5 1/1 Running 0 52s 10.244.0.47 minikube +pod/devops-app-py-76fc7985df-6rk64 1/1 Running 0 69s 10.244.0.45 minikube +pod/devops-app-py-76fc7985df-hr29v 1/1 Running 0 61s 10.244.0.46 minikube +pod/devops-app-py-76fc7985df-ptjkm 1/1 Running 0 78s 10.244.0.44 minikube +pod/devops-app-py-76fc7985df-t6d7b 1/1 Running 0 44s 10.244.0.48 minikube + +NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR +service/devops-app-py-service NodePort 10.110.168.128 80:30080/TCP 27m app.kubernetes.io/name=devops-app-py +service/kubernetes ClusterIP 10.96.0.1 443/TCP 107m + +$ kubectl describe deployment devops-app-py +Name: devops-app-py +Namespace: default +CreationTimestamp: Fri, 27 Mar 2026 05:16:21 +0300 +Labels: app.kubernetes.io/name=devops-app-py + app.kubernetes.io/part-of=devops-core-s26 +Annotations: deployment.kubernetes.io/revision: 7 +Selector: app.kubernetes.io/name=devops-app-py +Replicas: 5 desired | 5 updated | 5 total | 5 available | 0 unavailable +StrategyType: RollingUpdate +MinReadySeconds: 0 +RollingUpdateStrategy: 0 max unavailable, 1 max surge +Pod Template: + Labels: app.kubernetes.io/name=devops-app-py + app.kubernetes.io/part-of=devops-core-s26 + Containers: + devops-app-py: + Image: localt0aster/devops-app-py:1.9 + Port: 5000/TCP (http) + Host Port: 0/TCP (http) + Limits: + cpu: 250m + memory: 256Mi + Requests: + cpu: 100m + memory: 128Mi + Liveness: http-get http://:http/health delay=10s timeout=2s period=10s #success=1 #failure=3 + Readiness: http-get http://:http/ready delay=5s timeout=2s period=5s #success=1 #failure=3 + Environment: + HOST: 0.0.0.0 + PORT: 5000 + Mounts: + Volumes: + Node-Selectors: + Tolerations: +Conditions: + Type Status Reason + ---- ------ ------ + Available True MinimumReplicasAvailable + Progressing True NewReplicaSetAvailable +OldReplicaSets: devops-app-py-65fc658668 (0/0 replicas created) +NewReplicaSet: devops-app-py-76fc7985df (5/5 replicas created) +Events: + Type Reason Age From Message + ---- ------ ---- ---- ------- + Normal ScalingReplicaSet 30m deployment-controller Scaled up replica set devops-app-py-76fc7985df from 0 to 3 + Normal ScalingReplicaSet 9m21s deployment-controller Scaled up replica set devops-app-py-76fc7985df from 3 to 5 + Normal ScalingReplicaSet 8m20s deployment-controller Scaled up replica set devops-app-py-65fc658668 from 0 to 1 + Normal ScalingReplicaSet 8m20s deployment-controller Scaled up replica set devops-app-py-65fc658668 from 1 to 2 + Normal ScalingReplicaSet 8m12s deployment-controller Scaled down replica set devops-app-py-76fc7985df from 4 to 3 + Normal ScalingReplicaSet 8m12s deployment-controller Scaled up replica set devops-app-py-65fc658668 from 2 to 3 + Normal ScalingReplicaSet 8m12s deployment-controller Scaled down replica set devops-app-py-76fc7985df from 3 to 2 + Normal ScalingReplicaSet 8m12s deployment-controller Scaled up replica set devops-app-py-65fc658668 from 3 to 4 + Normal ScalingReplicaSet 8m3s deployment-controller Scaled down replica set devops-app-py-76fc7985df from 2 to 1 + Normal ScalingReplicaSet 4m58s (x2 over 8m20s) deployment-controller Scaled down replica set devops-app-py-76fc7985df from 5 to 4 + Normal ScalingReplicaSet 3m39s (x22 over 8m3s) deployment-controller (combined from similar events): Scaled up replica set devops-app-py-76fc7985df from 0 to 1 + +$ kubectl run task5-curl \ + --image=curlimages/curl \ + \ + --rm -i \ + --command -- \ + sh -c ' + curl -fsS http://devops-app-py-service + printf "\n\n" + curl -fsS http://devops-app-py-service/health + printf "\n\n" + curl -fsS http://devops-app-py-service/ready + printf "\n\n" + curl -fsS http://devops-app-py-service/metrics | head -n 12 + ' +{ + "endpoints": [ + { + "description": "Service information.", + "method": "GET", + "path": "/" + }, + { + "description": "Health check.", + "method": "GET", + "path": "/health" + }, + { + "description": "Prometheus metrics.", + "method": "GET", + "path": "/metrics" + }, + { + "description": "Readiness check.", + "method": "GET", + "path": "/ready" + } + ], + "request": { + "client_ip": "10.244.0.49", + "method": "GET", + "path": "/", + "user_agent": "curl/8.12.1" + }, + "runtime": { + "human": "0 hours, 1 minutes", + "seconds": 61 + }, + "service": { + "description": "DevOps course info service", + "framework": "Flask", + "name": "devops-info-service", + "version": "1.8.0" + }, + "system": { + "architecture": "x86_64", + "cpu_count": 8, + "hostname": "devops-app-py-76fc7985df-6rk64", + "platform": "Linux", + "platform_version": "Alpine Linux v3.23", + "python_version": "3.14.3" + } +} + + +{ + "status": "healthy", + "timestamp": "2026-03-27T02:47:15.357513+00:00", + "uptime_seconds": 70 +} + + +{ + "status": "ready", + "timestamp": "2026-03-27T02:47:15.363373+00:00", + "uptime_seconds": 53 +} + + +# HELP http_requests_total Total HTTP requests handled by the service. +# TYPE http_requests_total counter +http_requests_total{endpoint="/ready",method="GET",status_code="200"} 13.0 +http_requests_total{endpoint="/health",method="GET",status_code="200"} 5.0 +http_requests_total{endpoint="/",method="GET",status_code="200"} 1.0 +# HELP http_requests_created Total HTTP requests handled by the service. +# TYPE http_requests_created gauge +http_requests_created{endpoint="/ready",method="GET",status_code="200"} 1.7745795737986815e+09 +http_requests_created{endpoint="/health",method="GET",status_code="200"} 1.7745795857890186e+09 +http_requests_created{endpoint="/",method="GET",status_code="200"} 1.774579635349531e+09 +# HELP http_request_duration_seconds HTTP request duration in seconds. +# TYPE http_request_duration_seconds histogram +pod "task5-curl" deleted from default namespace +``` + +
+ +### Operations Performed + +1. Deployment and verification: + + ```bash + kubectl apply -f k8s/deployment.yml + kubectl rollout status deployment/devops-app-py + kubectl get deployment devops-app-py -o wide + kubectl get pods -l app.kubernetes.io/name=devops-app-py -o wide + kubectl describe deployment devops-app-py + ``` + +2. Service setup and access checks: + + ```bash + kubectl apply -f k8s/service.yml + kubectl describe service devops-app-py-service + kubectl port-forward service/devops-app-py-service 8080:80 + kubectl run task5-curl --image=curlimages/curl --rm -i --command -- sh + ``` + +3. Scaling to 5 replicas: + + ```bash + kubectl apply -f k8s/deployment.yml + kubectl rollout status deployment/devops-app-py --timeout=180s + kubectl get pods -l app.kubernetes.io/name=devops-app-py -o wide + ``` + +4. Rolling updates and rollback: + + ```bash + kubectl apply -f k8s/deployment.yml + kubectl rollout status deployment/devops-app-py --timeout=240s + kubectl rollout history deployment/devops-app-py + kubectl rollout undo deployment/devops-app-py + ``` + +### Production Considerations + +- Health checks: `/health` is used for liveness and `/ready` is used for readiness so Kubernetes only sends traffic to Pods that are actually prepared to serve requests. +- Rollout safety: `maxUnavailable: 0` and `maxSurge: 1` were chosen to keep capacity available during updates. This was not just theoretical; the strategy was tightened after observing a transient failed request with `maxUnavailable: 1`. +- Resource limits: `100m/128Mi` requests and `250m/256Mi` limits are reasonable for a lab environment and protect the single-node cluster from noisy-neighbor behavior. +- Observability: the app exposes `/metrics`, which is ready for Prometheus scraping. `kubectl describe`, rollout history, and event inspection were enough for this lab, but production should add centralized logs and dashboards. +- Further improvements: use image digests instead of mutable tags, add a `PodDisruptionBudget`, enable `HorizontalPodAutoscaler`, isolate workloads in a dedicated namespace, and place an Ingress with TLS in front of the NodePort service. + +### Challenges & Solutions + +- `minikube service devops-app-py-service --url` returned a valid NodePort URL, but with the Docker driver that node IP was not directly reachable from the host. I used `kubectl port-forward` for local testing and an in-cluster curl Pod for authoritative service verification. +- The first zero-downtime test with `maxUnavailable: 1` produced a brief failed request during rollout. Instead of papering over it, I changed the Deployment strategy to `maxUnavailable: 0` and reran the test until the probe showed a clean `200` sequence. +- Host-side port-forward tests can introduce their own connection artifacts during fast backend replacement. The more reliable method here was probing the Kubernetes Service from inside the cluster. + diff --git a/k8s/docs/LAB10.md b/k8s/docs/LAB10.md new file mode 100644 index 0000000000..f2bbd951b7 --- /dev/null +++ b/k8s/docs/LAB10.md @@ -0,0 +1,1064 @@ +# Kubernetes Lab 10 - Helm Package Manager + +## Task 1 - Helm Fundamentals + +Helm is a package manager for Kubernetes. In practical terms, a chart bundles templates, defaults, and metadata so the same application can be installed as reusable releases instead of copying raw YAML by hand. Repositories distribute those charts, and `values.yaml` provides the layer where environment-specific settings are changed without rewriting templates. + +For the fundamentals task, I verified the local Helm installation, refreshed public repositories, searched available Prometheus-related charts, inspected the metadata of the public `prometheus-community/prometheus` chart, and pulled it locally to review the typical chart structure. The public chart layout confirmed the core Helm pattern: `Chart.yaml` for metadata, `values.yaml` and `values.schema.json` for configuration, `_helpers.tpl` for naming/label helpers, and `templates/` for rendered Kubernetes manifests. + +
+Task 1 command output + +```bash +$ helm version +version.BuildInfo{Version:"v4.1.3", GitCommit:"c94d381b03be117e7e57908edbf642104e00eb8f", GitTreeState:"", GoVersion:"go1.26.1-X:nodwarf5", KubeClientVersion:"v1.35"} + +$ helm repo add bitnami https://charts.bitnami.com/bitnami +"bitnami" has been added to your repositories + +$ helm repo update +Hang tight while we grab the latest from your chart repositories... +...Successfully got an update from the "prometheus-community" chart repository +...Successfully got an update from the "bitnami" chart repository +Update Complete. ⎈Happy Helming!⎈ + +$ helm search repo prometheus +NAME CHART VERSION APP VERSION DESCRIPTION +bitnami/kube-prometheus 11.3.10 0.85.0 Prometheus Operator provides easy monitoring de... +bitnami/prometheus 2.1.23 3.5.0 Prometheus is an open source monitoring and ale... +bitnami/wavefront-prometheus-storage-adapter 2.3.3 1.0.7 DEPRECATED Wavefront Storage Adapter is a Prome... +prometheus-community/kube-prometheus-stack 82.16.1 v0.89.0 kube-prometheus-stack collects Kubernetes manif... +prometheus-community/prometheus 28.15.0 v3.11.0 Prometheus is a monitoring system and time seri... +prometheus-community/prometheus-adapter 5.3.0 v0.12.0 A Helm chart for k8s prometheus adapter +prometheus-community/prometheus-blackbox-exporter 11.9.1 v0.28.0 Prometheus Blackbox Exporter +prometheus-community/prometheus-cloudwatch-expo... 0.28.1 0.16.0 A Helm chart for prometheus cloudwatch-exporter +prometheus-community/prometheus-conntrack-stats... 0.5.35 v0.4.42 A Helm chart for conntrack-stats-exporter +prometheus-community/prometheus-consul-exporter 1.1.1 v0.13.0 A Helm chart for the Prometheus Consul Exporter +prometheus-community/prometheus-couchdb-exporter 1.0.1 1.0 A Helm chart to export the metrics from couchdb... +prometheus-community/prometheus-druid-exporter 1.2.0 v0.11.0 Druid exporter to monitor druid metrics with Pr... +prometheus-community/prometheus-elasticsearch-e... 7.2.1 v1.10.0 Elasticsearch stats exporter for Prometheus +prometheus-community/prometheus-fastly-exporter 0.11.0 v10.2.0 A Helm chart for the Prometheus Fastly Exporter +prometheus-community/prometheus-ipmi-exporter 0.8.0 v1.10.1 This is an IPMI exporter for Prometheus. +prometheus-community/prometheus-json-exporter 0.19.2 v0.7.0 Install prometheus-json-exporter +prometheus-community/prometheus-kafka-exporter 3.0.1 v1.9.0 A Helm chart to export metrics from Kafka in Pr... +prometheus-community/prometheus-memcached-exporter 0.4.5 v0.15.5 Prometheus exporter for Memcached metrics +prometheus-community/prometheus-modbus-exporter 0.1.4 0.4.1 A Helm chart for prometheus-modbus-exporter +prometheus-community/prometheus-mongodb-exporter 3.18.0 0.49.0 A Prometheus exporter for MongoDB metrics +prometheus-community/prometheus-mysql-exporter 2.13.0 v0.19.0 A Helm chart for prometheus mysql exporter with... +prometheus-community/prometheus-nats-exporter 2.22.1 0.19.2 A Helm chart for prometheus-nats-exporter +prometheus-community/prometheus-nginx-exporter 1.20.8 1.5.1 A Helm chart for NGINX Prometheus Exporter +prometheus-community/prometheus-node-exporter 4.52.2 1.10.2 A Helm chart for prometheus node-exporter +prometheus-community/prometheus-opencost-exporter 0.1.2 1.108.0 Prometheus OpenCost Exporter +prometheus-community/prometheus-operator 9.3.2 0.38.1 DEPRECATED - This chart will be renamed. See ht... +prometheus-community/prometheus-operator-admiss... 0.38.0 0.90.1 Prometheus Operator Admission Webhook +prometheus-community/prometheus-operator-crds 28.0.1 v0.90.1 A Helm chart that collects custom resource defi... +prometheus-community/prometheus-pgbouncer-exporter 0.10.0 v0.12.0 A Helm chart for prometheus pgbouncer-exporter +prometheus-community/prometheus-pingdom-exporter 3.4.2 v0.5.6 A Helm chart for Prometheus Pingdom Exporter +prometheus-community/prometheus-pingmesh-exporter 0.4.3 v1.2.2 Prometheus Pingmesh Exporter +prometheus-community/prometheus-postgres-exporter 7.5.2 v0.19.1 A Helm chart for prometheus postgres-exporter +prometheus-community/prometheus-pushgateway 3.6.0 v1.11.2 A Helm chart for prometheus pushgateway +prometheus-community/prometheus-rabbitmq-exporter 2.1.2 1.0.0 Rabbitmq metrics exporter for prometheus +prometheus-community/prometheus-redis-exporter 6.22.0 v1.82.0 Prometheus exporter for Redis metrics +prometheus-community/prometheus-smartctl-exporter 0.16.0 v0.14.0 A Helm chart for Kubernetes +prometheus-community/prometheus-snmp-exporter 9.13.1 v0.30.1 Prometheus SNMP Exporter +prometheus-community/prometheus-sql-exporter 0.5.0 v0.8 Prometheus SQL Exporter +prometheus-community/prometheus-stackdriver-exp... 4.12.2 v0.18.0 Stackdriver exporter for Prometheus +prometheus-community/prometheus-statsd-exporter 1.0.0 v0.28.0 A Helm chart for prometheus stats-exporter +prometheus-community/prometheus-systemd-exporter 0.5.2 0.7.0 A Helm chart for prometheus systemd-exporter +prometheus-community/prometheus-to-sd 0.5.1 v0.9.2 Scrape metrics stored in prometheus format and ... +prometheus-community/prometheus-windows-exporter 0.12.6 0.31.6 A Helm chart for prometheus windows-exporter +prometheus-community/prometheus-yet-another-clo... 0.43.0 v0.64.0 Yace - Yet Another CloudWatch Exporter +prometheus-community/alertmanager 1.34.0 v0.31.1 The Alertmanager handles alerts sent by client ... +prometheus-community/alertmanager-snmp-notifier 2.1.0 v2.1.0 The SNMP Notifier handles alerts coming from Pr... +prometheus-community/jiralert 1.8.2 v1.3.0 A Helm chart for Kubernetes to install jiralert +prometheus-community/kube-state-metrics 7.2.2 2.18.0 Install kube-state-metrics to generate and expo... +prometheus-community/prom-label-proxy 0.18.0 v0.12.1 A proxy that enforces a given label in a given ... +prometheus-community/yet-another-cloudwatch-exp... 0.39.1 v0.62.1 Yace - Yet Another CloudWatch Exporter +bitnami/grafana-alloy 1.0.7 1.10.2 Grafana Alloy is an open source OpenTelemetry C... +bitnami/grafana-mimir 3.0.18 2.17.0 Grafana Mimir is an open source, horizontally s... +bitnami/node-exporter 4.5.19 1.9.1 Prometheus exporter for hardware and OS metrics... +bitnami/thanos 17.3.1 0.39.2 Thanos is a highly available metrics system tha... +bitnami/victoriametrics 0.1.31 1.124.0 VictoriaMetrics is a fast, cost-effective, and ... +bitnami/kube-state-metrics 5.1.0 2.16.0 kube-state-metrics is a simple service that lis... +bitnami/mariadb 25.0.6 12.2.2 MariaDB is an open source, community-developed ... +bitnami/mariadb-galera 16.0.1 12.0.2 MariaDB Galera is a multi-primary database clus... + +$ helm show chart prometheus-community/prometheus +annotations: + artifacthub.io/license: Apache-2.0 + artifacthub.io/links: | + - name: Chart Source + url: https://github.com/prometheus-community/helm-charts + - name: Upstream Project + url: https://github.com/prometheus/prometheus +apiVersion: v2 +appVersion: v3.11.0 +dependencies: +- condition: alertmanager.enabled + name: alertmanager + repository: https://prometheus-community.github.io/helm-charts + version: 1.34.* +- condition: kube-state-metrics.enabled + name: kube-state-metrics + repository: https://prometheus-community.github.io/helm-charts + version: 7.2.* +- condition: prometheus-node-exporter.enabled + name: prometheus-node-exporter + repository: https://prometheus-community.github.io/helm-charts + version: 4.52.* +- condition: prometheus-pushgateway.enabled + name: prometheus-pushgateway + repository: https://prometheus-community.github.io/helm-charts + version: 3.6.* +description: Prometheus is a monitoring system and time series database. +home: https://prometheus.io/ +icon: https://raw.githubusercontent.com/prometheus/prometheus.github.io/master/assets/prometheus_logo-cb55bb5c346.png +keywords: +- monitoring +- prometheus +kubeVersion: '>=1.19.0-0' +maintainers: +- email: gianrubio@gmail.com + name: gianrubio + url: https://github.com/gianrubio +- email: zanhsieh@gmail.com + name: zanhsieh + url: https://github.com/zanhsieh +- email: miroslav.hadzhiev@gmail.com + name: Xtigyro + url: https://github.com/Xtigyro +- email: naseem@transit.app + name: naseemkullah + url: https://github.com/naseemkullah +- email: rootsandtrees@posteo.de + name: zeritti + url: https://github.com/zeritti +name: prometheus +sources: +- https://github.com/prometheus/alertmanager +- https://github.com/prometheus/prometheus +- https://github.com/prometheus/pushgateway +- https://github.com/prometheus/node_exporter +- https://github.com/kubernetes/kube-state-metrics +type: application +version: 28.15.0 + + +$ helm pull prometheus-community/prometheus --untar --untardir /tmp/lab10-public-chart + +$ find /tmp/lab10-public-chart/prometheus -maxdepth 2 -type f +/tmp/lab10-public-chart/prometheus/README.md +/tmp/lab10-public-chart/prometheus/.helmignore +/tmp/lab10-public-chart/prometheus/templates/vpa.yaml +/tmp/lab10-public-chart/prometheus/templates/serviceaccount.yaml +/tmp/lab10-public-chart/prometheus/templates/service.yaml +/tmp/lab10-public-chart/prometheus/templates/rolebinding.yaml +/tmp/lab10-public-chart/prometheus/templates/pvc.yaml +/tmp/lab10-public-chart/prometheus/templates/pdb.yaml +/tmp/lab10-public-chart/prometheus/templates/network-policy.yaml +/tmp/lab10-public-chart/prometheus/templates/ingress.yaml +/tmp/lab10-public-chart/prometheus/templates/httproute.yaml +/tmp/lab10-public-chart/prometheus/templates/headless-svc.yaml +/tmp/lab10-public-chart/prometheus/templates/extra-manifests.yaml +/tmp/lab10-public-chart/prometheus/templates/deploy.yaml +/tmp/lab10-public-chart/prometheus/templates/cm.yaml +/tmp/lab10-public-chart/prometheus/templates/clusterrolebinding.yaml +/tmp/lab10-public-chart/prometheus/templates/clusterrole.yaml +/tmp/lab10-public-chart/prometheus/templates/_helpers.tpl +/tmp/lab10-public-chart/prometheus/templates/NOTES.txt +/tmp/lab10-public-chart/prometheus/values.schema.json +/tmp/lab10-public-chart/prometheus/values.yaml +/tmp/lab10-public-chart/prometheus/Chart.lock +/tmp/lab10-public-chart/prometheus/Chart.yaml +``` + +
+ +## Task 2 - Create Your Helm Chart + +I created the application chart in `k8s/devops-app-py` with the standard Helm structure and converted the existing Lab 9 Deployment and Service into templates. The chart keeps the same application behavior while moving the changeable parts into values: image repository and tag, replica count, rollout strategy, environment variables, resource requests and limits, service settings, and both probes. Naming and labels are centralized in `_helpers.tpl` so the Deployment and Service stay consistent across installs. + +The chart was deliberately trimmed to what the lab actually uses. I removed the default scaffold templates for ingress, autoscaling, service accounts, test hooks, and HTTPRoute because they were noise for this app and would have made the chart look more generic than intentional. One practical detail mattered during real installation: the raw Lab 9 service was still occupying `30080`, so I kept the chart default at `30080` but installed the Lab 10 release with `--set service.nodePort=30081` to avoid a collision while preserving the chart defaults required by the lab. + +
+Task 2 command output + +```bash +$ helm lint k8s/devops-app-py +==> Linting k8s/devops-app-py +[INFO] Chart.yaml: icon is recommended + +1 chart(s) linted, 0 chart(s) failed + +$ helm template devops-app-py k8s/devops-app-py +--- +# Source: devops-app-py/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + name: devops-app-py-service + labels: + helm.sh/chart: devops-app-py-0.1.0 + app.kubernetes.io/name: devops-app-py + app.kubernetes.io/instance: devops-app-py + app.kubernetes.io/version: "1.9" + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/part-of: devops-core-s26 +spec: + type: NodePort + ports: + - name: http + protocol: TCP + port: 80 + targetPort: 5000 + nodePort: 30080 + selector: + app.kubernetes.io/name: devops-app-py + app.kubernetes.io/instance: devops-app-py +--- +# Source: devops-app-py/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: devops-app-py + labels: + helm.sh/chart: devops-app-py-0.1.0 + app.kubernetes.io/name: devops-app-py + app.kubernetes.io/instance: devops-app-py + app.kubernetes.io/version: "1.9" + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/part-of: devops-core-s26 +spec: + replicas: 5 + revisionHistoryLimit: 5 + strategy: + type: RollingUpdate + rollingUpdate: + maxSurge: 1 + maxUnavailable: 0 + selector: + matchLabels: + app.kubernetes.io/name: devops-app-py + app.kubernetes.io/instance: devops-app-py + template: + metadata: + labels: + app.kubernetes.io/name: devops-app-py + app.kubernetes.io/instance: devops-app-py + app.kubernetes.io/part-of: devops-core-s26 + spec: + containers: + - name: devops-app-py + image: "localt0aster/devops-app-py:1.9" + imagePullPolicy: IfNotPresent + ports: + - name: http + containerPort: 5000 + protocol: TCP + env: + - name: HOST + value: "0.0.0.0" + - name: PORT + value: "5000" + livenessProbe: + failureThreshold: 3 + httpGet: + path: /health + port: http + initialDelaySeconds: 10 + periodSeconds: 10 + timeoutSeconds: 2 + readinessProbe: + failureThreshold: 3 + httpGet: + path: /ready + port: http + initialDelaySeconds: 5 + periodSeconds: 5 + timeoutSeconds: 2 + resources: + limits: + cpu: 250m + memory: 256Mi + requests: + cpu: 100m + memory: 128Mi + +$ helm install --dry-run --debug test-release k8s/devops-app-py --set service.nodePort=30081 +level=WARN msg="--dry-run is deprecated and should be replaced with '--dry-run=client'" +level=DEBUG msg="Original chart version" version="" +level=DEBUG msg="Chart path" path=/home/t0ast/Repos/DevOps-Core-S26/k8s/devops-app-py +level=DEBUG msg="number of dependencies in the chart" chart=devops-app-py dependencies=0 +NAME: test-release +LAST DEPLOYED: Thu Apr 2 23:09:12 2026 +NAMESPACE: default +STATUS: pending-install +REVISION: 1 +DESCRIPTION: Dry run complete +TEST SUITE: None +USER-SUPPLIED VALUES: +service: + nodePort: 30081 + +COMPUTED VALUES: +containerPort: 5000 +deployment: + revisionHistoryLimit: 5 + strategy: + maxSurge: 1 + maxUnavailable: 0 +env: +- name: HOST + value: 0.0.0.0 +- name: PORT + value: "5000" +fullnameOverride: "" +image: + pullPolicy: IfNotPresent + repository: localt0aster/devops-app-py + tag: 1.9 +livenessProbe: + failureThreshold: 3 + httpGet: + path: /health + port: http + initialDelaySeconds: 10 + periodSeconds: 10 + timeoutSeconds: 2 +nameOverride: "" +partOf: devops-core-s26 +podAnnotations: {} +podLabels: {} +readinessProbe: + failureThreshold: 3 + httpGet: + path: /ready + port: http + initialDelaySeconds: 5 + periodSeconds: 5 + timeoutSeconds: 2 +replicaCount: 5 +resources: + limits: + cpu: 250m + memory: 256Mi + requests: + cpu: 100m + memory: 128Mi +service: + nodePort: 30081 + port: 80 + targetPort: 5000 + type: NodePort + +HOOKS: +MANIFEST: +--- +# Source: devops-app-py/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + name: test-release-devops-app-py-service + labels: + helm.sh/chart: devops-app-py-0.1.0 + app.kubernetes.io/name: devops-app-py + app.kubernetes.io/instance: test-release + app.kubernetes.io/version: "1.9" + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/part-of: devops-core-s26 +spec: + type: NodePort + ports: + - name: http + protocol: TCP + port: 80 + targetPort: 5000 + nodePort: 30081 + selector: + app.kubernetes.io/name: devops-app-py + app.kubernetes.io/instance: test-release +--- +# Source: devops-app-py/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: test-release-devops-app-py + labels: + helm.sh/chart: devops-app-py-0.1.0 + app.kubernetes.io/name: devops-app-py + app.kubernetes.io/instance: test-release + app.kubernetes.io/version: "1.9" + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/part-of: devops-core-s26 +spec: + replicas: 5 + revisionHistoryLimit: 5 + strategy: + type: RollingUpdate + rollingUpdate: + maxSurge: 1 + maxUnavailable: 0 + selector: + matchLabels: + app.kubernetes.io/name: devops-app-py + app.kubernetes.io/instance: test-release + template: + metadata: + labels: + app.kubernetes.io/name: devops-app-py + app.kubernetes.io/instance: test-release + app.kubernetes.io/part-of: devops-core-s26 + spec: + containers: + - name: devops-app-py + image: "localt0aster/devops-app-py:1.9" + imagePullPolicy: IfNotPresent + ports: + - name: http + containerPort: 5000 + protocol: TCP + env: + - name: HOST + value: "0.0.0.0" + - name: PORT + value: "5000" + livenessProbe: + failureThreshold: 3 + httpGet: + path: /health + port: http + initialDelaySeconds: 10 + periodSeconds: 10 + timeoutSeconds: 2 + readinessProbe: + failureThreshold: 3 + httpGet: + path: /ready + port: http + initialDelaySeconds: 5 + periodSeconds: 5 + timeoutSeconds: 2 + resources: + limits: + cpu: 250m + memory: 256Mi + requests: + cpu: 100m + memory: 128Mi + +NOTES: +1. Review the release: + helm status test-release -n default + +2. Forward the service locally: + kubectl port-forward svc/test-release-devops-app-py-service 8080:80 -n default + +3. Verify the application: + curl -fsSL http://127.0.0.1:8080/health + curl -fsSL http://127.0.0.1:8080/ready + +$ helm install lab10-devops-app-py k8s/devops-app-py --set service.nodePort=30081 +NAME: lab10-devops-app-py +LAST DEPLOYED: Thu Apr 2 23:09:12 2026 +NAMESPACE: default +STATUS: deployed +REVISION: 1 +DESCRIPTION: Install complete +TEST SUITE: None +NOTES: +1. Review the release: + helm status lab10-devops-app-py -n default + +2. Forward the service locally: + kubectl port-forward svc/lab10-devops-app-py-service 8080:80 -n default + +3. Verify the application: + curl -fsSL http://127.0.0.1:8080/health + curl -fsSL http://127.0.0.1:8080/ready + +$ kubectl rollout status deployment/lab10-devops-app-py --timeout=240s +Waiting for deployment "lab10-devops-app-py" rollout to finish: 0 of 5 updated replicas are available... +Waiting for deployment "lab10-devops-app-py" rollout to finish: 1 of 5 updated replicas are available... +Waiting for deployment "lab10-devops-app-py" rollout to finish: 2 of 5 updated replicas are available... +Waiting for deployment "lab10-devops-app-py" rollout to finish: 3 of 5 updated replicas are available... +Waiting for deployment "lab10-devops-app-py" rollout to finish: 4 of 5 updated replicas are available... +deployment "lab10-devops-app-py" successfully rolled out + +$ helm list -A +NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION +lab10-devops-app-py default 1 2026-04-02 23:09:12.132768347 +0300 +03 deployed devops-app-py-0.1.0 1.9 + +$ kubectl get deploy,svc,pods -l app.kubernetes.io/instance=lab10-devops-app-py -o wide +NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR +deployment.apps/lab10-devops-app-py 5/5 5 5 7s devops-app-py localt0aster/devops-app-py:1.9 app.kubernetes.io/instance=lab10-devops-app-py,app.kubernetes.io/name=devops-app-py + +NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR +service/lab10-devops-app-py-service NodePort 10.96.60.48 80:30081/TCP 7s app.kubernetes.io/instance=lab10-devops-app-py,app.kubernetes.io/name=devops-app-py + +NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES +pod/lab10-devops-app-py-7b7dbf4648-6k55b 1/1 Running 0 7s 10.244.0.60 minikube +pod/lab10-devops-app-py-7b7dbf4648-fz8j2 1/1 Running 0 7s 10.244.0.58 minikube +pod/lab10-devops-app-py-7b7dbf4648-l5fdj 1/1 Running 0 7s 10.244.0.56 minikube +pod/lab10-devops-app-py-7b7dbf4648-sdklz 1/1 Running 0 7s 10.244.0.57 minikube +pod/lab10-devops-app-py-7b7dbf4648-zp9dt 1/1 Running 0 7s 10.244.0.59 minikube + +$ kubectl port-forward svc/lab10-devops-app-py-service 18082:80 +Forwarding from 127.0.0.1:18082 -> 5000 +Forwarding from [::1]:18082 -> 5000 + +$ curl -fsSL http://127.0.0.1:18082 | jq . +{ + "endpoints": [ + { + "description": "Service information.", + "method": "GET", + "path": "/" + }, + { + "description": "Health check.", + "method": "GET", + "path": "/health" + }, + { + "description": "Prometheus metrics.", + "method": "GET", + "path": "/metrics" + }, + { + "description": "Readiness check.", + "method": "GET", + "path": "/ready" + } + ], + "request": { + "client_ip": "127.0.0.1", + "method": "GET", + "path": "/", + "user_agent": "curl/8.19.0" + }, + "runtime": { + "human": "0 hours, 0 minutes", + "seconds": 12 + }, + "service": { + "description": "DevOps course info service", + "framework": "Flask", + "name": "devops-info-service", + "version": "1.8.0" + }, + "system": { + "architecture": "x86_64", + "cpu_count": 8, + "hostname": "lab10-devops-app-py-7b7dbf4648-6k55b", + "platform": "Linux", + "platform_version": "Alpine Linux v3.23", + "python_version": "3.14.3" + } +} + +$ curl -fsSL http://127.0.0.1:18082/health | jq . +{ + "status": "healthy", + "timestamp": "2026-04-02T20:09:31.062442+00:00", + "uptime_seconds": 12 +} + +$ curl -fsSL http://127.0.0.1:18082/ready | jq . +{ + "status": "ready", + "timestamp": "2026-04-02T20:09:31.100199+00:00", + "uptime_seconds": 13 +} +``` + +
+ +## Task 3 - Multi-Environment Support + +I added two environment-specific values files to the chart: `values-dev.yaml` for a lightweight local deployment and `values-prod.yaml` for a more production-shaped configuration. The dev profile uses a single replica, smaller CPU and memory reservations, `APP_ENV=development`, and the `localt0aster/devops-app-py:1.9-dev` image on a `NodePort` service. The prod profile raises the deployment to 3 replicas, increases resource requests and limits, switches `APP_ENV=production`, uses the `localt0aster/devops-app-py:1.9` image, and changes the service type to `LoadBalancer`. + +I tested the environment flow on the real release instead of only rendering templates. First I reinstalled `lab10-devops-app-py` with the dev values, verified the single-replica `1.9-dev` deployment, and then upgraded the same release with the prod values. The service type changed to `LoadBalancer` and the Deployment converged to 3 ready Pods. In this minikube setup the external IP stayed ``, which is expected without cloud load-balancer integration, so I verified the upgraded release with `kubectl port-forward` and `curl ... | jq .` against `/ready`. + +
+Task 3 command output + +```bash +$ helm uninstall lab10-devops-app-py +release "lab10-devops-app-py" uninstalled + +$ helm install lab10-devops-app-py k8s/devops-app-py -f k8s/devops-app-py/values-dev.yaml --wait=watcher --wait-for-jobs --timeout 240s +NAME: lab10-devops-app-py +LAST DEPLOYED: Fri Apr 3 01:40:19 2026 +NAMESPACE: default +STATUS: deployed +REVISION: 1 +DESCRIPTION: Install complete +TEST SUITE: None +NOTES: +1. Review the release: + helm status lab10-devops-app-py -n default + +2. Forward the service locally: + kubectl port-forward svc/lab10-devops-app-py-service 8080:80 -n default + +3. Verify the application: + curl -fsSL http://127.0.0.1:8080/health | jq + curl -fsSL http://127.0.0.1:8080/ready | jq + +$ helm get values lab10-devops-app-py --all +COMPUTED VALUES: +containerPort: 5000 +deployment: + revisionHistoryLimit: 2 + strategy: + maxSurge: 1 + maxUnavailable: 0 +env: +- name: HOST + value: 0.0.0.0 +- name: PORT + value: "5000" +- name: APP_ENV + value: development +fullnameOverride: "" +hooks: + postInstall: + deletePolicy: before-hook-creation,hook-succeeded + enabled: true + image: + pullPolicy: IfNotPresent + repository: curlimages/curl + tag: 8.12.1 + maxAttempts: 20 + retryIntervalSeconds: 3 + weight: 5 + preInstall: + deletePolicy: before-hook-creation,hook-succeeded + enabled: true + image: + pullPolicy: IfNotPresent + repository: busybox + tag: 1.37.0 + weight: -5 +image: + pullPolicy: IfNotPresent + repository: localt0aster/devops-app-py + tag: 1.9-dev +livenessProbe: + failureThreshold: 3 + httpGet: + path: /health + port: http + initialDelaySeconds: 5 + periodSeconds: 10 + timeoutSeconds: 2 +nameOverride: "" +partOf: devops-core-s26 +podAnnotations: {} +podLabels: + environment: dev +readinessProbe: + failureThreshold: 3 + httpGet: + path: /ready + port: http + initialDelaySeconds: 3 + periodSeconds: 5 + timeoutSeconds: 2 +replicaCount: 1 +resources: + limits: + cpu: 100m + memory: 128Mi + requests: + cpu: 50m + memory: 64Mi +service: + nodePort: 30081 + port: 80 + targetPort: 5000 + type: NodePort + +$ kubectl get deploy,svc,pods -l app.kubernetes.io/instance=lab10-devops-app-py -o wide +NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR +deployment.apps/lab10-devops-app-py 1/1 1 1 23s devops-app-py localt0aster/devops-app-py:1.9-dev app.kubernetes.io/instance=lab10-devops-app-py,app.kubernetes.io/name=devops-app-py + +NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR +service/lab10-devops-app-py-service NodePort 10.102.64.255 80:30081/TCP 23s app.kubernetes.io/instance=lab10-devops-app-py,app.kubernetes.io/name=devops-app-py + +NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES +pod/lab10-devops-app-py-7fd54dc44b-5lndl 1/1 Running 0 23s 10.244.0.62 minikube + +$ helm upgrade lab10-devops-app-py k8s/devops-app-py -f k8s/devops-app-py/values-prod.yaml --wait=watcher --timeout 240s +Release "lab10-devops-app-py" has been upgraded. Happy Helming! +NAME: lab10-devops-app-py +LAST DEPLOYED: Fri Apr 3 01:40:53 2026 +NAMESPACE: default +STATUS: deployed +REVISION: 2 +DESCRIPTION: Upgrade complete +TEST SUITE: None +NOTES: +1. Review the release: + helm status lab10-devops-app-py -n default + +2. Forward the service locally: + kubectl port-forward svc/lab10-devops-app-py-service 8080:80 -n default + +3. Verify the application: + curl -fsSL http://127.0.0.1:8080/health | jq + curl -fsSL http://127.0.0.1:8080/ready | jq + +$ kubectl rollout status deployment/lab10-devops-app-py --timeout=240s +deployment "lab10-devops-app-py" successfully rolled out + +$ helm get values lab10-devops-app-py --all +COMPUTED VALUES: +containerPort: 5000 +deployment: + revisionHistoryLimit: 10 + strategy: + maxSurge: 1 + maxUnavailable: 0 +env: +- name: HOST + value: 0.0.0.0 +- name: PORT + value: "5000" +- name: APP_ENV + value: production +fullnameOverride: "" +hooks: + postInstall: + deletePolicy: before-hook-creation,hook-succeeded + enabled: true + image: + pullPolicy: IfNotPresent + repository: curlimages/curl + tag: 8.12.1 + maxAttempts: 20 + retryIntervalSeconds: 3 + weight: 5 + preInstall: + deletePolicy: before-hook-creation,hook-succeeded + enabled: true + image: + pullPolicy: IfNotPresent + repository: busybox + tag: 1.37.0 + weight: -5 +image: + pullPolicy: IfNotPresent + repository: localt0aster/devops-app-py + tag: "1.9" +livenessProbe: + failureThreshold: 3 + httpGet: + path: /health + port: http + initialDelaySeconds: 30 + periodSeconds: 5 + timeoutSeconds: 2 +nameOverride: "" +partOf: devops-core-s26 +podAnnotations: {} +podLabels: + environment: prod +readinessProbe: + failureThreshold: 3 + httpGet: + path: /ready + port: http + initialDelaySeconds: 10 + periodSeconds: 3 + timeoutSeconds: 2 +replicaCount: 3 +resources: + limits: + cpu: 500m + memory: 512Mi + requests: + cpu: 200m + memory: 256Mi +service: + nodePort: 30081 + port: 80 + targetPort: 5000 + type: LoadBalancer + +$ kubectl get deploy,svc,pods -l app.kubernetes.io/instance=lab10-devops-app-py -o wide +NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR +deployment.apps/lab10-devops-app-py 3/3 3 3 65s devops-app-py localt0aster/devops-app-py:1.9 app.kubernetes.io/instance=lab10-devops-app-py,app.kubernetes.io/name=devops-app-py + +NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR +service/lab10-devops-app-py-service LoadBalancer 10.102.64.255 80:30081/TCP 65s app.kubernetes.io/instance=lab10-devops-app-py,app.kubernetes.io/name=devops-app-py + +NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES +pod/lab10-devops-app-py-67694d9f5c-57h24 1/1 Running 0 22s 10.244.0.67 minikube +pod/lab10-devops-app-py-67694d9f5c-7scvn 1/1 Running 0 41s 10.244.0.64 minikube +pod/lab10-devops-app-py-67694d9f5c-tk2kt 1/1 Running 0 11s 10.244.0.68 minikube +pod/lab10-devops-app-py-7fd54dc44b-5lndl 1/1 Terminating 0 65s 10.244.0.62 minikube + +$ kubectl port-forward svc/lab10-devops-app-py-service 18083:80 +Forwarding from 127.0.0.1:18083 -> 5000 +Forwarding from [::1]:18083 -> 5000 + +$ curl -fsSL http://127.0.0.1:18083/ready | jq . +{ + "status": "ready", + "timestamp": "2026-04-02T22:41:38.602170+00:00", + "uptime_seconds": 33 +} +``` + +
+ +## Task 4 - Chart Hooks + +I added two lifecycle hook Jobs under `templates/hooks/`. The pre-install hook is a small validation job based on `busybox`, and the post-install hook is a smoke test based on `curlimages/curl` that checks the release-local Service on `/ready`. Their weights are `-5` and `5` respectively, so the validation step runs first and the smoke test runs after the workload is installed. Both hooks use the deletion policy `before-hook-creation,hook-succeeded` so repeated installs do not accumulate stale Jobs. + +Verification happened in two layers. First, a dry run showed both hook manifests rendering under Helm’s `HOOKS:` section with the expected annotations. Then the real dev installation produced the expected Kubernetes events for both Jobs, including `Completed` on pre-install and post-install. After completion, `kubectl get jobs -A` returned no resources and no hook pods remained, which confirmed the cleanup policy worked in practice. + +
+Task 4 command output + +```bash +$ helm lint k8s/devops-app-py +==> Linting k8s/devops-app-py +[INFO] Chart.yaml: icon is recommended + +1 chart(s) linted, 0 chart(s) failed + +$ helm install --dry-run=client --debug hook-preview k8s/devops-app-py -f k8s/devops-app-py/values-dev.yaml | rg -n -C 3 'Source: devops-app-py/templates/hooks|kind: Job|name: hook-preview-devops-app-py-(pre-install|post-install)|helm.sh/hook|helm.sh/hook-weight|helm.sh/hook-delete-policy' +124- +125-HOOKS: +126---- +127:# Source: devops-app-py/templates/hooks/post-install-job.yaml +128-apiVersion: batch/v1 +129:kind: Job +130-metadata: +131: name: hook-preview-devops-app-py-post-install +132- labels: +133- helm.sh/chart: devops-app-py-0.2.0 +134- app.kubernetes.io/name: devops-app-py +-- +138- app.kubernetes.io/part-of: devops-core-s26 +139- app.kubernetes.io/component: hook +140- annotations: +141: "helm.sh/hook": post-install +142: "helm.sh/hook-weight": "5" +143: "helm.sh/hook-delete-policy": "before-hook-creation,hook-succeeded" +144-spec: +145- backoffLimit: 0 +146- template: +-- +177- echo "Smoke test failed for ${url}" +178- exit 1 +179---- +180:# Source: devops-app-py/templates/hooks/pre-install-job.yaml +181-apiVersion: batch/v1 +182:kind: Job +183-metadata: +184: name: hook-preview-devops-app-py-pre-install +185- labels: +186- helm.sh/chart: devops-app-py-0.2.0 +187- app.kubernetes.io/name: devops-app-py +-- +191- app.kubernetes.io/part-of: devops-core-s26 +192- app.kubernetes.io/component: hook +193- annotations: +194: "helm.sh/hook": pre-install +195: "helm.sh/hook-weight": "-5" +196: "helm.sh/hook-delete-policy": "before-hook-creation,hook-succeeded" +197-spec: +198- backoffLimit: 0 +199- template: + +$ kubectl get events -A --sort-by=.metadata.creationTimestamp | rg 'lab10-devops-app-py-(pre-install|post-install)|Job completed|Created pod: lab10-devops-app-py-(pre-install|post-install)' +default 112s Normal SuccessfulCreate job/lab10-devops-app-py-pre-install Created pod: lab10-devops-app-py-pre-install-gl882 +default 111s Normal Scheduled pod/lab10-devops-app-py-pre-install-gl882 Successfully assigned default/lab10-devops-app-py-pre-install-gl882 to minikube +default 111s Normal Pulling pod/lab10-devops-app-py-pre-install-gl882 Pulling image "busybox:1.37.0" +default 107s Normal Pulled pod/lab10-devops-app-py-pre-install-gl882 Successfully pulled image "busybox:1.37.0" in 4.711s (4.711s including waiting). Image size: 4421246 bytes. +default 107s Normal Created pod/lab10-devops-app-py-pre-install-gl882 Container created +default 106s Normal Started pod/lab10-devops-app-py-pre-install-gl882 Container started +default 101s Normal Completed job/lab10-devops-app-py-pre-install Job completed +default 84s Normal SuccessfulCreate job/lab10-devops-app-py-post-install Created pod: lab10-devops-app-py-post-install-9jpjt +default 83s Normal Scheduled pod/lab10-devops-app-py-post-install-9jpjt Successfully assigned default/lab10-devops-app-py-post-install-9jpjt to minikube +default 83s Normal Pulled pod/lab10-devops-app-py-post-install-9jpjt Container image "curlimages/curl:8.12.1" already present on machine and can be accessed by the pod +default 83s Normal Created pod/lab10-devops-app-py-post-install-9jpjt Container created +default 83s Normal Started pod/lab10-devops-app-py-post-install-9jpjt Container started +default 78s Normal Completed job/lab10-devops-app-py-post-install Job completed + +$ kubectl get jobs -A 2>&1 +No resources found + +$ kubectl get pods -A | rg 'lab10-devops-app-py-(pre-install|post-install)' || true +``` + +
+ +## Task 5 - Documentation + +This section completes the documentation requirement for the Helm chart itself. The course asks for `k8s/HELM.md`; in this repo that file is kept as a compatibility entry point, while the detailed write-up lives here in `k8s/docs/LAB10.md` so the module root does not turn into a transcript dump. + +### Chart Overview + +The chart lives in `k8s/devops-app-py` and is split into a small set of focused files: + +- `Chart.yaml`: chart metadata, chart version, and app version. +- `values.yaml`: common defaults shared by all environments. +- `values-dev.yaml`: local development override with `1` replica, smaller resources, `NodePort`, and `1.9-dev`. +- `values-prod.yaml`: production-shaped override with `3` replicas, larger resources, `LoadBalancer`, and `1.9`. +- `templates/_helpers.tpl`: shared naming and label helpers, including service and hook job names. +- `templates/deployment.yaml`: the main application Deployment template. +- `templates/service.yaml`: the Service template, supporting both `NodePort` and `LoadBalancer`. +- `templates/hooks/pre-install-job.yaml`: validation job that runs before install. +- `templates/hooks/post-install-job.yaml`: smoke test job that runs after install. +- `templates/NOTES.txt`: post-install usage hints. + +The values strategy is layered: keep sensible defaults in `values.yaml`, then use environment overlays to change only what differs between dev and prod. That keeps templates stable and pushes configuration changes to values files instead of templating conditionals everywhere. + +### Configuration Guide + +The most important values are: + +- `replicaCount`: controls pod count for each environment. +- `image.repository` and `image.tag`: define which application image is deployed. +- `service.type`, `service.port`, `service.targetPort`, and `service.nodePort`: define exposure strategy. +- `resources.requests` and `resources.limits`: shape scheduling and runtime ceilings. +- `livenessProbe` and `readinessProbe`: keep health checks configurable without removing them. +- `env`: injects runtime environment variables like `HOST`, `PORT`, and `APP_ENV`. +- `hooks.preInstall.*` and `hooks.postInstall.*`: configure hook enablement, weight, deletion policy, image, and retry behavior. + +Example usage: + +```bash +# Development installation +helm install lab10-devops-app-py k8s/devops-app-py \ + -f k8s/devops-app-py/values-dev.yaml \ + --wait=watcher \ + --wait-for-jobs + +# Upgrade the same release to the production profile +helm upgrade lab10-devops-app-py k8s/devops-app-py \ + -f k8s/devops-app-py/values-prod.yaml \ + --wait=watcher + +# Override a specific value without editing files +helm upgrade lab10-devops-app-py k8s/devops-app-py \ + -f k8s/devops-app-py/values-prod.yaml \ + --set replicaCount=4 +``` + +### Hook Implementation + +Two hooks are implemented: + +- Pre-install hook: a `busybox` validation job that records the release name, namespace, image tag, and replica count before installation proceeds. +- Post-install hook: a `curlimages/curl` smoke test job that polls `http:///ready` until it gets HTTP `200` or times out. + +Execution order is controlled by weights: + +- `pre-install`: weight `-5` +- `post-install`: weight `5` + +Deletion is handled by `before-hook-creation,hook-succeeded`, which means Helm removes old hook resources before recreating them and cleans up successful Jobs afterward. The cluster evidence below confirms that no hook Jobs remain after completion. + +### Installation Evidence + +
+Current chart and release evidence + +```bash +$ find k8s/devops-app-py -maxdepth 3 -type f | sort +k8s/devops-app-py/.helmignore +k8s/devops-app-py/Chart.yaml +k8s/devops-app-py/templates/NOTES.txt +k8s/devops-app-py/templates/_helpers.tpl +k8s/devops-app-py/templates/deployment.yaml +k8s/devops-app-py/templates/hooks/post-install-job.yaml +k8s/devops-app-py/templates/hooks/pre-install-job.yaml +k8s/devops-app-py/templates/service.yaml +k8s/devops-app-py/values-dev.yaml +k8s/devops-app-py/values-prod.yaml +k8s/devops-app-py/values.yaml + +$ helm list -A +NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION +lab10-devops-app-py default 2 2026-04-03 01:40:53.968813438 +0300 +03 deployed devops-app-py-0.2.0 1.9 + +$ helm history lab10-devops-app-py +REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION +1 Fri Apr 3 01:40:19 2026 superseded devops-app-py-0.2.0 1.9 Install complete +2 Fri Apr 3 01:40:53 2026 deployed devops-app-py-0.2.0 1.9 Upgrade complete + +$ kubectl get all -l app.kubernetes.io/instance=lab10-devops-app-py -o wide +NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES +pod/lab10-devops-app-py-67694d9f5c-57h24 1/1 Running 0 14m 10.244.0.67 minikube +pod/lab10-devops-app-py-67694d9f5c-7scvn 1/1 Running 0 14m 10.244.0.64 minikube +pod/lab10-devops-app-py-67694d9f5c-tk2kt 1/1 Running 0 14m 10.244.0.68 minikube + +NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR +service/lab10-devops-app-py-service LoadBalancer 10.102.64.255 80:30081/TCP 15m app.kubernetes.io/instance=lab10-devops-app-py,app.kubernetes.io/name=devops-app-py + +NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR +deployment.apps/lab10-devops-app-py 3/3 3 3 15m devops-app-py localt0aster/devops-app-py:1.9 app.kubernetes.io/instance=lab10-devops-app-py,app.kubernetes.io/name=devops-app-py + +NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR +replicaset.apps/lab10-devops-app-py-67694d9f5c 3 3 3 14m devops-app-py localt0aster/devops-app-py:1.9 app.kubernetes.io/instance=lab10-devops-app-py,app.kubernetes.io/name=devops-app-py,pod-template-hash=67694d9f5c +replicaset.apps/lab10-devops-app-py-7fd54dc44b 0 0 0 15m devops-app-py localt0aster/devops-app-py:1.9-dev app.kubernetes.io/instance=lab10-devops-app-py,app.kubernetes.io/name=devops-app-py,pod-template-hash=7fd54dc44b + +$ kubectl get jobs -A 2>&1 +No resources found +``` + +
+ +### Operations + +1. Install the development profile: + + ```bash + helm install lab10-devops-app-py k8s/devops-app-py \ + -f k8s/devops-app-py/values-dev.yaml \ + --wait=watcher \ + --wait-for-jobs \ + --timeout 240s + ``` + +2. Upgrade to the production profile: + + ```bash + helm upgrade lab10-devops-app-py k8s/devops-app-py \ + -f k8s/devops-app-py/values-prod.yaml \ + --wait=watcher \ + --timeout 240s + ``` + +3. Inspect and troubleshoot the release: + + ```bash + helm list -A + helm history lab10-devops-app-py + helm get values lab10-devops-app-py --all + kubectl get all -l app.kubernetes.io/instance=lab10-devops-app-py -o wide + ``` + +4. Roll back or remove the release: + + ```bash + helm rollback lab10-devops-app-py 1 + helm uninstall lab10-devops-app-py + ``` + +### Testing & Validation + +Validation was performed at several levels: + +- Static validation: `helm lint` passed with only the non-blocking `icon is recommended` note. +- Render validation: `helm template ... -f values-prod.yaml` showed `Service`, `Deployment`, and both hook `Job` resources, with `type: LoadBalancer`, `replicas: 3`, and the expected hook annotations. +- Dry-run validation: Task 4’s `helm install --dry-run=client --debug` output showed both hooks under the `HOOKS:` section before any cluster changes were applied. +- Runtime validation: Task 3 verified the dev install, the prod upgrade, and service accessibility via `kubectl port-forward` and `curl ... | jq .`. +- Hook validation: Task 4 confirmed both Jobs completed and were deleted afterward. + +One limitation is specific to the local minikube environment: after the prod upgrade, the `LoadBalancer` service stayed at `EXTERNAL-IP `. That is expected on this cluster without an additional load-balancer implementation, so the authoritative accessibility check remained `kubectl port-forward` instead of a cloud-style public IP. From 0c8e1057222cd23ebcafa4d0e66c4fd4bb63ccab Mon Sep 17 00:00:00 2001 From: LocalT0aster Dan <90502400+LocalT0aster@users.noreply.github.com> Date: Fri, 10 Apr 2026 02:24:30 +0300 Subject: [PATCH 11/21] Lab11 Complete (#11) * lab11 --- k8s/README.md | 2 + k8s/SECRETS.md | 16 + k8s/devops-app-py/Chart.yaml | 2 +- k8s/devops-app-py/templates/_helpers.tpl | 46 ++ k8s/devops-app-py/templates/deployment.yaml | 22 +- k8s/devops-app-py/templates/secrets.yaml | 12 + .../templates/serviceaccount.yaml | 8 + k8s/devops-app-py/values.yaml | 16 + k8s/docs/LAB11.md | 671 ++++++++++++++++++ 9 files changed, 789 insertions(+), 6 deletions(-) create mode 100644 k8s/SECRETS.md create mode 100644 k8s/devops-app-py/templates/secrets.yaml create mode 100644 k8s/devops-app-py/templates/serviceaccount.yaml create mode 100644 k8s/docs/LAB11.md diff --git a/k8s/README.md b/k8s/README.md index 28a4c6df35..805a36dbcd 100644 --- a/k8s/README.md +++ b/k8s/README.md @@ -12,5 +12,7 @@ The main deployment assets are: ## Documentation - [Helm Notes](HELM.md) +- [Secrets Notes](SECRETS.md) - [Lab 09 - Kubernetes Basics](docs/LAB09.md) - [Lab 10 - Helm Package Manager](docs/LAB10.md) +- [Lab 11 - Kubernetes Secrets and Vault](docs/LAB11.md) diff --git a/k8s/SECRETS.md b/k8s/SECRETS.md new file mode 100644 index 0000000000..cc3d5ce001 --- /dev/null +++ b/k8s/SECRETS.md @@ -0,0 +1,16 @@ +# Secrets Notes + +This file exists to satisfy the Lab 11 requirement for a dedicated secrets document without flattening the Kubernetes module back into one large documentation directory. + +## Lab 11 Documentation + +The full Lab 11 write-up, command transcripts, verification logs, and sanitized Vault evidence are kept in [docs/LAB11.md](docs/LAB11.md). + +## Why This Structure Is Better + +- `k8s/README.md` stays short and usable as the module entry point. +- `k8s/docs/LAB09.md`, [docs/LAB10.md](docs/LAB10.md), and [docs/LAB11.md](docs/LAB11.md) keep each Kubernetes lab self-contained. +- Raw manifests, Helm chart files, and documentation stay separated, which makes the implementation files easier to navigate. +- `k8s/SECRETS.md` provides the compatibility filename the lab expects while the actual report remains in the `docs/` hierarchy. + +In short, `SECRETS.md` is the compatibility layer, and `k8s/docs/` remains the maintainable long-term structure. diff --git a/k8s/devops-app-py/Chart.yaml b/k8s/devops-app-py/Chart.yaml index 27bec28eb8..9c6a6c21c2 100644 --- a/k8s/devops-app-py/Chart.yaml +++ b/k8s/devops-app-py/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: devops-app-py description: Helm chart for the DevOps Core Python application type: application -version: 0.2.0 +version: 0.3.0 appVersion: "1.9" keywords: - python diff --git a/k8s/devops-app-py/templates/_helpers.tpl b/k8s/devops-app-py/templates/_helpers.tpl index 80d7509c6b..68a3b20d88 100644 --- a/k8s/devops-app-py/templates/_helpers.tpl +++ b/k8s/devops-app-py/templates/_helpers.tpl @@ -58,6 +58,52 @@ Create the service name. {{- printf "%s-service" (include "devops-app-py.fullname" .) | trunc 63 | trimSuffix "-" }} {{- end }} +{{/* +Create the secret name. +*/}} +{{- define "devops-app-py.secretName" -}} +{{- printf "%s-secret" (include "devops-app-py.fullname" .) | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create the service account name. +*/}} +{{- define "devops-app-py.serviceAccountName" -}} +{{- if .Values.serviceAccount.create }} +{{- default (include "devops-app-py.fullname" .) .Values.serviceAccount.name }} +{{- else }} +{{- default "default" .Values.serviceAccount.name }} +{{- end }} +{{- end }} + +{{/* +Render non-secret environment variables. +*/}} +{{- define "devops-app-py.envVars" -}} +{{- range .Values.env }} +- name: {{ .name }} + value: {{ .value | quote }} +{{- end }} +{{- end }} + +{{/* +Render Vault injector annotations. +*/}} +{{- define "devops-app-py.vaultAnnotations" -}} +{{- if .Values.vault.enabled }} +vault.hashicorp.com/agent-inject: "true" +vault.hashicorp.com/role: {{ .Values.vault.role | quote }} +vault.hashicorp.com/agent-inject-secret-config: {{ .Values.vault.secretPath | quote }} +vault.hashicorp.com/agent-inject-file-config: {{ .Values.vault.templateFile | quote }} +vault.hashicorp.com/agent-inject-template-config: | + {{ "{{- with secret \"" }}{{ .Values.vault.secretPath }}{{ "\" -}}" }} + APP_USERNAME={{ "{{ .Data.data.APP_USERNAME }}" }} + APP_PASSWORD={{ "{{ .Data.data.APP_PASSWORD }}" }} + APP_API_KEY={{ "{{ .Data.data.APP_API_KEY }}" }} + {{ "{{- end }}" }} +{{- end }} +{{- end }} + {{/* Create the pre-install hook job name. */}} diff --git a/k8s/devops-app-py/templates/deployment.yaml b/k8s/devops-app-py/templates/deployment.yaml index d77904e81b..607c604237 100644 --- a/k8s/devops-app-py/templates/deployment.yaml +++ b/k8s/devops-app-py/templates/deployment.yaml @@ -1,5 +1,7 @@ apiVersion: apps/v1 kind: Deployment +{{- $envVars := include "devops-app-py.envVars" . | trim }} +{{- $vaultAnnotations := include "devops-app-py.vaultAnnotations" . | trim }} metadata: name: {{ include "devops-app-py.fullname" . }} labels: @@ -17,9 +19,14 @@ spec: {{- include "devops-app-py.selectorLabels" . | nindent 6 }} template: metadata: - {{- with .Values.podAnnotations }} + {{- if or $vaultAnnotations .Values.podAnnotations }} annotations: + {{- if $vaultAnnotations }} + {{- $vaultAnnotations | nindent 8 }} + {{- end }} + {{- with .Values.podAnnotations }} {{- toYaml . | nindent 8 }} + {{- end }} {{- end }} labels: {{- include "devops-app-py.selectorLabels" . | nindent 8 }} @@ -28,6 +35,7 @@ spec: {{- toYaml . | nindent 8 }} {{- end }} spec: + serviceAccountName: {{ include "devops-app-py.serviceAccountName" . }} containers: - name: {{ include "devops-app-py.name" . }} image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" @@ -36,11 +44,15 @@ spec: - name: http containerPort: {{ .Values.containerPort }} protocol: TCP + {{- if .Values.secrets.enabled }} + envFrom: + - secretRef: + name: {{ include "devops-app-py.secretName" . }} + {{- end }} + {{- if $envVars }} env: - {{- range .Values.env }} - - name: {{ .name }} - value: {{ .value | quote }} - {{- end }} + {{- $envVars | nindent 12 }} + {{- end }} {{- with .Values.livenessProbe }} livenessProbe: {{- toYaml . | nindent 12 }} diff --git a/k8s/devops-app-py/templates/secrets.yaml b/k8s/devops-app-py/templates/secrets.yaml new file mode 100644 index 0000000000..e68143bd57 --- /dev/null +++ b/k8s/devops-app-py/templates/secrets.yaml @@ -0,0 +1,12 @@ +{{- if .Values.secrets.enabled }} +apiVersion: v1 +kind: Secret +metadata: + name: {{ include "devops-app-py.secretName" . }} + labels: + {{- include "devops-app-py.labels" . | nindent 4 }} +type: Opaque +stringData: + APP_USERNAME: {{ .Values.secrets.stringData.APP_USERNAME | quote }} + APP_PASSWORD: {{ .Values.secrets.stringData.APP_PASSWORD | quote }} +{{- end }} diff --git a/k8s/devops-app-py/templates/serviceaccount.yaml b/k8s/devops-app-py/templates/serviceaccount.yaml new file mode 100644 index 0000000000..c9a148fb0b --- /dev/null +++ b/k8s/devops-app-py/templates/serviceaccount.yaml @@ -0,0 +1,8 @@ +{{- if .Values.serviceAccount.create }} +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ include "devops-app-py.serviceAccountName" . }} + labels: + {{- include "devops-app-py.labels" . | nindent 4 }} +{{- end }} diff --git a/k8s/devops-app-py/values.yaml b/k8s/devops-app-py/values.yaml index 251caf59d7..59d2f5cd84 100644 --- a/k8s/devops-app-py/values.yaml +++ b/k8s/devops-app-py/values.yaml @@ -26,6 +26,22 @@ env: - name: PORT value: "5000" +secrets: + enabled: true + stringData: + APP_USERNAME: "placeholder-user" + APP_PASSWORD: "placeholder-password" + +serviceAccount: + create: true + name: "" + +vault: + enabled: false + role: "lab11-devops-app-py" + secretPath: "secret/data/lab11/devops-app-py" + templateFile: "app-config.env" + service: type: NodePort port: 80 diff --git a/k8s/docs/LAB11.md b/k8s/docs/LAB11.md new file mode 100644 index 0000000000..54f1ae73b7 --- /dev/null +++ b/k8s/docs/LAB11.md @@ -0,0 +1,671 @@ +# Kubernetes Lab 11 - Kubernetes Secrets and HashiCorp Vault + +I started by hard-resetting the local Kubernetes setup and recreating the cluster with `minikube` on the Docker driver. I did not document the pre-cleanup leftovers because this lab run was intentionally destructive and the goal was to produce evidence only from the fresh environment. All usernames, passwords, API keys, Vault tokens, JWTs, and base64 secret payloads are redacted in this write-up. + +## Fresh Cluster Baseline + +
+Fresh cluster bootstrap + +```text +$ kubectl config current-context +minikube + +$ minikube status +minikube +type: Control Plane +host: Running +kubelet: Running +apiserver: Running +kubeconfig: Configured + + +$ kubectl cluster-info +Kubernetes control plane is running at https://192.168.49.2:8443 +CoreDNS is running at https://192.168.49.2:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy + +To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'. + +$ kubectl get nodes -o wide +NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME +minikube Ready control-plane 2m14s v1.35.1 192.168.49.2 Debian GNU/Linux 12 (bookworm) 6.19.11-1-cachyos docker://29.2.1 + +$ kubectl get node minikube -o jsonpath="{.status.nodeInfo.containerRuntimeVersion}{\"\\n\"}" +docker://29.2.1 +``` + +
+ +## Task 1 - Kubernetes Secrets Fundamentals + +I created `app-credentials` imperatively with `kubectl create secret generic`, then verified the stored object and decoded both keys. The important security point is that Kubernetes Secrets are base64-encoded for transport and manifest representation, but base64 is not encryption. Anyone who can read the Secret object can decode it immediately. + +By default, Kubernetes does not give Secrets meaningful confidentiality at rest unless the cluster administrator enables etcd encryption at rest. In production I would combine three controls: enable etcd encryption, restrict Secret access with RBAC, and use an external secret manager when credentials need centralized policy, auditing, or rotation. + +
+kubectl create secret generic app-credentials + +```bash +$ kubectl create secret generic app-credentials --from-literal=username="$LAB11_DEMO_USERNAME" --from-literal=password="$LAB11_DEMO_PASSWORD" +secret/app-credentials created +``` + +
+ +
+kubectl get secret app-credentials -o yaml (redacted) + +```yaml +apiVersion: v1 +data: + password: + username: +kind: Secret +metadata: + creationTimestamp: "2026-04-09T22:59:08Z" + name: app-credentials + namespace: default + resourceVersion: "511" + uid: a02c09dd-5ff9-4eba-b431-57ce64edb215 +type: Opaque +``` + +
+ +
+base64 -d proof for both keys + +```text +$ kubectl get secret app-credentials -o jsonpath="{.data.username}" | base64 -d +username= + +$ kubectl get secret app-credentials -o jsonpath="{.data.password}" | base64 -d +password= +``` + +
+ +## Task 2 - Helm-Managed Secrets + +I extended the Lab 10 chart instead of bolting on one-off manifests. The chart now has a dedicated `templates/secrets.yaml` and `templates/serviceaccount.yaml`, plus new values blocks for `secrets`, `serviceAccount`, and `vault`. Real demo values were supplied from untracked files under `/tmp/lab11/`; tracked YAML keeps placeholder defaults only. + +I also preserved the resource management from Lab 10. Requests reserve the minimum capacity the Pod needs to be scheduled predictably, while limits cap runaway usage. For the dev profile I kept `50m` CPU and `64Mi` memory requests with `100m` CPU and `128Mi` memory limits, which is appropriate for a single-replica local Flask/Gunicorn deployment in `minikube`. + +For the bonus DRY requirement, I moved the plain environment variable list into a named helper (`devops-app-py.envVars`) and added a second helper (`devops-app-py.vaultAnnotations`) so the Deployment template stays readable when Vault injection is enabled. + +
+find k8s/devops-app-py -maxdepth 3 -type f | sort + +```text +k8s/devops-app-py/.helmignore +k8s/devops-app-py/Chart.yaml +k8s/devops-app-py/templates/NOTES.txt +k8s/devops-app-py/templates/_helpers.tpl +k8s/devops-app-py/templates/deployment.yaml +k8s/devops-app-py/templates/hooks/post-install-job.yaml +k8s/devops-app-py/templates/hooks/pre-install-job.yaml +k8s/devops-app-py/templates/secrets.yaml +k8s/devops-app-py/templates/service.yaml +k8s/devops-app-py/templates/serviceaccount.yaml +k8s/devops-app-py/values-dev.yaml +k8s/devops-app-py/values-prod.yaml +k8s/devops-app-py/values.yaml +``` + +
+ +
+helm lint and rendered manifest excerpts + +```bash +==> Linting k8s/devops-app-py +[INFO] Chart.yaml: icon is recommended + +1 chart(s) linted, 0 chart(s) failed +``` + +```yaml +# Source: devops-app-py/templates/serviceaccount.yaml +apiVersion: v1 +kind: ServiceAccount +metadata: + name: lab11-devops-app-py + labels: + helm.sh/chart: devops-app-py-0.3.0 + app.kubernetes.io/name: devops-app-py + app.kubernetes.io/instance: lab11-devops-app-py + app.kubernetes.io/version: "1.9-dev" + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/part-of: devops-core-s26 +--- + +# Source: devops-app-py/templates/secrets.yaml +apiVersion: v1 +kind: Secret +metadata: + name: lab11-devops-app-py-secret + labels: + helm.sh/chart: devops-app-py-0.3.0 + app.kubernetes.io/name: devops-app-py + app.kubernetes.io/instance: lab11-devops-app-py + app.kubernetes.io/version: "1.9-dev" + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/part-of: devops-core-s26 +type: Opaque +stringData: + APP_USERNAME: "" + APP_PASSWORD: "" +--- + +# Source: devops-app-py/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: lab11-devops-app-py + labels: + helm.sh/chart: devops-app-py-0.3.0 + app.kubernetes.io/name: devops-app-py + app.kubernetes.io/instance: lab11-devops-app-py + app.kubernetes.io/version: "1.9-dev" + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/part-of: devops-core-s26 +spec: + replicas: 1 + revisionHistoryLimit: 2 + strategy: + type: RollingUpdate + rollingUpdate: + maxSurge: 1 + maxUnavailable: 0 + selector: + matchLabels: + app.kubernetes.io/name: devops-app-py + app.kubernetes.io/instance: lab11-devops-app-py + template: + metadata: + annotations: + vault.hashicorp.com/agent-inject: "true" + vault.hashicorp.com/role: "lab11-devops-app-py" + vault.hashicorp.com/agent-inject-secret-config: "secret/data/lab11/devops-app-py" + vault.hashicorp.com/agent-inject-file-config: "app-config.env" + vault.hashicorp.com/agent-inject-template-config: | + {{- with secret "secret/data/lab11/devops-app-py" -}} + APP_USERNAME={{ .Data.data.APP_USERNAME }} + APP_PASSWORD={{ .Data.data.APP_PASSWORD }} + APP_API_KEY={{ .Data.data.APP_API_KEY }} + {{- end }} + labels: + app.kubernetes.io/name: devops-app-py + app.kubernetes.io/instance: lab11-devops-app-py + app.kubernetes.io/part-of: devops-core-s26 + environment: dev + spec: + serviceAccountName: lab11-devops-app-py + containers: + - name: devops-app-py + image: "localt0aster/devops-app-py:1.9-dev" + imagePullPolicy: IfNotPresent + ports: + - name: http + containerPort: 5000 + protocol: TCP + envFrom: + - secretRef: + name: lab11-devops-app-py-secret + env: + - name: HOST + value: "0.0.0.0" + - name: PORT + value: "5000" + - name: APP_ENV + value: "development" + livenessProbe: + failureThreshold: 3 + httpGet: + path: /health + port: http + initialDelaySeconds: 5 + periodSeconds: 10 + timeoutSeconds: 2 + readinessProbe: + failureThreshold: 3 + httpGet: + path: /ready + port: http + initialDelaySeconds: 3 + periodSeconds: 5 + timeoutSeconds: 2 + resources: + limits: + cpu: 100m + memory: 128Mi + requests: + cpu: 50m + memory: 64Mi +--- +``` + +
+ +
+helm upgrade --install lab11-devops-app-py ... + +```bash +$ helm upgrade --install lab11-devops-app-py k8s/devops-app-py -f k8s/devops-app-py/values-dev.yaml -f /tmp/lab11/app-secrets.values.yaml --wait=watcher --wait-for-jobs --timeout 300s +Release "lab11-devops-app-py" does not exist. Installing it now. +NAME: lab11-devops-app-py +LAST DEPLOYED: Fri Apr 10 02:00:31 2026 +NAMESPACE: default +STATUS: deployed +REVISION: 1 +DESCRIPTION: Install complete +TEST SUITE: None +NOTES: +1. Review the release: + helm status lab11-devops-app-py -n default + +2. Forward the service locally: + kubectl port-forward svc/lab11-devops-app-py-service 8080:80 -n default + +3. Verify the application: + curl -fsSL http://127.0.0.1:8080/health | jq + curl -fsSL http://127.0.0.1:8080/ready | jq + +$ kubectl rollout status deployment/lab11-devops-app-py --timeout=300s +deployment "lab11-devops-app-py" successfully rolled out + +$ kubectl get deploy,svc,pods,secret -l app.kubernetes.io/instance=lab11-devops-app-py -o wide +NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR +deployment.apps/lab11-devops-app-py 1/1 1 1 38s devops-app-py localt0aster/devops-app-py:1.9-dev app.kubernetes.io/instance=lab11-devops-app-py,app.kubernetes.io/name=devops-app-py + +NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR +service/lab11-devops-app-py-service NodePort 10.108.159.118 80:30081/TCP 38s app.kubernetes.io/instance=lab11-devops-app-py,app.kubernetes.io/name=devops-app-py + +NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES +pod/lab11-devops-app-py-578786c7fb-f8zzz 1/1 Running 0 38s 10.244.0.4 minikube + +NAME TYPE DATA AGE +secret/lab11-devops-app-py-secret Opaque 2 38s +``` + +
+ +
+kubectl exec ... printenv (redacted) + +```text +$ kubectl exec "$POD_NAME" -- printenv | rg "^APP_(USERNAME|PASSWORD)=" | sed -E "s/=.*/=/" +APP_USERNAME= +APP_PASSWORD= +``` + +
+ +
+kubectl describe pod showing Secret reference instead of cleartext + +```text +Name: lab11-devops-app-py-578786c7fb-f8zzz +Namespace: default +Priority: 0 +Service Account: lab11-devops-app-py +Node: minikube/192.168.49.2 +Start Time: Fri, 10 Apr 2026 02:00:43 +0300 +Labels: app.kubernetes.io/instance=lab11-devops-app-py + app.kubernetes.io/name=devops-app-py + app.kubernetes.io/part-of=devops-core-s26 + environment=dev + pod-template-hash=578786c7fb +Annotations: +Status: Running +IP: 10.244.0.4 +IPs: + IP: 10.244.0.4 +Controlled By: ReplicaSet/lab11-devops-app-py-578786c7fb +Containers: + devops-app-py: + Container ID: docker://c243351e2d85929b21b521a6cb6ad023801ceb1d4c608e5ebdbb836146ca47d2 + Image: localt0aster/devops-app-py:1.9-dev + Image ID: docker-pullable://localt0aster/devops-app-py@sha256:2f3a987db91b7327ed30da86a6cfb8358cb720e2f968c7b326a031d31503f765 + Port: 5000/TCP (http) + Host Port: 0/TCP (http) + State: Running + Started: Fri, 10 Apr 2026 02:00:53 +0300 + Ready: True + Restart Count: 0 + Limits: + cpu: 100m + memory: 128Mi + Requests: + cpu: 50m + memory: 64Mi + Liveness: http-get http://:http/health delay=5s timeout=2s period=10s #success=1 #failure=3 + Readiness: http-get http://:http/ready delay=3s timeout=2s period=5s #success=1 #failure=3 + Environment Variables from: + lab11-devops-app-py-secret Secret Optional: false + Environment: + HOST: 0.0.0.0 + PORT: 5000 + APP_ENV: development + Mounts: + /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-zvfx6 (ro) +Conditions: + Type Status + PodReadyToStartContainers True + Initialized True + Ready True + ContainersReady True + PodScheduled True +Volumes: + kube-api-access-zvfx6: + Type: Projected (a volume that contains injected data from multiple sources) + TokenExpirationSeconds: 3607 + ConfigMapName: kube-root-ca.crt + Optional: false + DownwardAPI: true +QoS Class: Burstable +Node-Selectors: +Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s + node.kubernetes.io/unreachable:NoExecute op=Exists for 300s +Events: + Type Reason Age From Message + ---- ------ ---- ---- ------- + Normal Scheduled 52s default-scheduler Successfully assigned default/lab11-devops-app-py-578786c7fb-f8zzz to minikube + Normal Pulling 52s kubelet spec.containers{devops-app-py}: Pulling image "localt0aster/devops-app-py:1.9-dev" + Normal Pulled 43s kubelet spec.containers{devops-app-py}: Successfully pulled image "localt0aster/devops-app-py:1.9-dev" in 9.083s (9.083s including waiting). Image size: 138919242 bytes. + Normal Created 42s kubelet spec.containers{devops-app-py}: Container created + Normal Started 42s kubelet spec.containers{devops-app-py}: Container started + Warning Unhealthy 30s kubelet spec.containers{devops-app-py}: Liveness probe failed: Get "http://10.244.0.4:5000/health": context deadline exceeded (Client.Timeout exceeded while awaiting headers) + Warning Unhealthy 28s (x2 over 33s) kubelet spec.containers{devops-app-py}: Readiness probe failed: Get "http://10.244.0.4:5000/ready": context deadline exceeded (Client.Timeout exceeded while awaiting headers) +``` + +
+ +The key verification point is the difference between the two views: inside the container the variables exist and are usable, while `kubectl describe pod` only exposes the Secret reference (`Environment Variables from:`) rather than the cleartext values. + +## Task 3 - HashiCorp Vault Integration + +I installed Vault with the official Helm chart in dev mode, enabled the injector, then configured a KV v2 path for the application, Kubernetes auth, a read-only policy, and a role bound to the chart-created ServiceAccount. After that I upgraded the app release with Vault annotations enabled so the agent injected an `.env`-style file into `/vault/secrets/app-config.env`. + +The sidecar injection pattern works by mutating the Pod at admission time. In the upgraded Pod there is a `vault-agent-init` init container that authenticates and pre-populates the secret file, plus a long-running `vault-agent` sidecar that can keep templates refreshed while the application container consumes the rendered file. + +
+Vault Helm install + +```bash +$ helm repo add --force-update hashicorp https://helm.releases.hashicorp.com +"hashicorp" has been added to your repositories + +$ helm repo update +Hang tight while we grab the latest from your chart repositories... +...Successfully got an update from the "hashicorp" chart repository +...Successfully got an update from the "prometheus-community" chart repository +...Successfully got an update from the "bitnami" chart repository +Update Complete. ⎈Happy Helming!⎈ + +$ helm upgrade --install vault hashicorp/vault --namespace vault --create-namespace --set server.dev.enabled=true --set injector.enabled=true --wait=watcher --timeout 300s +Release "vault" does not exist. Installing it now. +NAME: vault +LAST DEPLOYED: Fri Apr 10 02:02:00 2026 +NAMESPACE: vault +STATUS: deployed +REVISION: 1 +DESCRIPTION: Install complete +NOTES: +Thank you for installing HashiCorp Vault! + +Now that you have deployed Vault, you should look over the docs on using +Vault with Kubernetes available here: + +https://developer.hashicorp.com/vault/docs + + +Your release is named vault. To learn more about the release, try: + + $ helm status vault + $ helm get manifest vault + +$ kubectl get pods -n vault -o wide +NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES +vault-0 0/1 ContainerCreating 0 15s minikube +vault-agent-injector-8c76487db-wptvx 1/1 Running 0 16s 10.244.0.6 minikube +``` + +
+ +
+kubectl get pods -n vault -o wide after readiness wait + +```text +NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES +vault-0 1/1 Running 0 28s 10.244.0.7 minikube +vault-agent-injector-8c76487db-wptvx 1/1 Running 0 29s 10.244.0.6 minikube +``` + +
+ +
+kubectl exec -n vault vault-0 -- sh /tmp/vault-config.sh + +```text +$ kubectl exec -n vault vault-0 -- sh /tmp/vault-config.sh +Checking secret engines +Path Type Accessor Description +---- ---- -------- ----------- +cubbyhole/ cubbyhole cubbyhole_1e3be723 per-token private secret storage +identity/ identity identity_2ffebb85 identity store +secret/ kv kv_f9a64ce9 key/value secret storage +sys/ system system_b73e780d system endpoints used for control, policy and debugging +secret/ mount already present + +Writing application secret metadata + ========= Secret Path ========= +secret/data/lab11/devops-app-py + + ======= Metadata ======= +Key Value +--- ----- +created_time 2026-04-09T23:04:39.746883798Z +custom_metadata +deletion_time n/a +destroyed false +version 2 + +Checking auth methods +Path Type Accessor Description Version +---- ---- -------- ----------- ------- +kubernetes/ kubernetes auth_kubernetes_9526b481 n/a n/a +token/ token auth_token_8763c414 token based credentials n/a +kubernetes auth already enabled +Configured Kubernetes auth backend +Success! Uploaded policy: lab11-devops-app-py + +Configuring role + +Policy readback +path "secret/data/lab11/devops-app-py" { + capabilities = ["read"] +} +``` + +
+ +
+auth/kubernetes/role/lab11-devops-app-py readback + +```json +{ + "data": { + "bound_service_account_names": [ + "lab11-devops-app-py" + ], + "bound_service_account_namespaces": [ + "default" + ], + "policies": [ + "lab11-devops-app-py" + ], + "ttl": 86400 + } +} +``` + +
+ +
+helm upgrade ... -f /tmp/lab11/app-vault.values.yaml + +```bash +$ helm upgrade lab11-devops-app-py k8s/devops-app-py -f k8s/devops-app-py/values-dev.yaml -f /tmp/lab11/app-secrets.values.yaml -f /tmp/lab11/app-vault.values.yaml --wait=watcher --wait-for-jobs --timeout 300s +Release "lab11-devops-app-py" has been upgraded. Happy Helming! +NAME: lab11-devops-app-py +LAST DEPLOYED: Fri Apr 10 02:04:56 2026 +NAMESPACE: default +STATUS: deployed +REVISION: 2 +DESCRIPTION: Upgrade complete +TEST SUITE: None +NOTES: +1. Review the release: + helm status lab11-devops-app-py -n default + +2. Forward the service locally: + kubectl port-forward svc/lab11-devops-app-py-service 8080:80 -n default + +3. Verify the application: + curl -fsSL http://127.0.0.1:8080/health | jq + curl -fsSL http://127.0.0.1:8080/ready | jq + +$ kubectl rollout status deployment/lab11-devops-app-py --timeout=300s +deployment "lab11-devops-app-py" successfully rolled out + +$ kubectl get pods -l app.kubernetes.io/instance=lab11-devops-app-py -o wide +NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES +lab11-devops-app-py-578786c7fb-f8zzz 1/1 Terminating 0 4m28s 10.244.0.4 minikube +lab11-devops-app-py-78488cd99-4297p 2/2 Running 0 15s 10.244.0.8 minikube +``` + +
+ +
+Injected Pod summary + +```json +{ + "metadata": { + "name": "lab11-devops-app-py-78488cd99-4297p", + "annotations": { + "agent_inject": "true", + "role": "lab11-devops-app-py", + "inject_secret_config": "secret/data/lab11/devops-app-py", + "inject_file_config": "app-config.env" + } + }, + "spec": { + "serviceAccountName": "lab11-devops-app-py", + "initContainers": [ + "vault-agent-init" + ], + "containers": [ + "devops-app-py", + "vault-agent" + ] + }, + "status": { + "phase": "Running", + "initContainerStatuses": [ + { + "name": "vault-agent-init", + "ready": true, + "state": { + "terminated": { + "containerID": "docker://6ac0871513caf747c2af9fc895961f66f29a9e8a48dfb882b22529c93ad24558", + "exitCode": 0, + "finishedAt": "2026-04-09T23:04:57Z", + "reason": "Completed", + "startedAt": "2026-04-09T23:04:57Z" + } + } + } + ], + "containerStatuses": [ + { + "name": "devops-app-py", + "ready": true, + "restartCount": 0 + }, + { + "name": "vault-agent", + "ready": true, + "restartCount": 0 + } + ] + } +} +``` + +
+ +
+ls -l /vault/secrets + +```text +$ kubectl exec "$POD_NAME" -c devops-app-py -- ls -l /vault/secrets +total 4 +-rw-r--r-- 1 100 appgroup 89 Apr 9 23:04 app-config.env +``` + +
+ +
+cat /vault/secrets/app-config.env (redacted) + +```text +$ kubectl exec "$POD_NAME" -c devops-app-py -- cat /vault/secrets/app-config.env | sed -E "s/=.*/=/" +APP_USERNAME= +APP_PASSWORD= +APP_API_KEY= +``` + +
+ +
+/health and /ready after Vault-enabled rollout + +```bash +$ curl -fsSL http://127.0.0.1:18084/health | jq +{ + "status": "healthy", + "timestamp": "2026-04-09T23:06:01.075863+00:00", + "uptime_seconds": 51 +} + +$ curl -fsSL http://127.0.0.1:18084/ready | jq +{ + "status": "ready", + "timestamp": "2026-04-09T23:06:01.102648+00:00", + "uptime_seconds": 51 +} +``` + +
+ +## Bonus - Vault Agent Templates + +The bonus part is implemented in two places. First, the Pod annotations now include `vault.hashicorp.com/agent-inject-template-config`, which renders a single `.env`-style file containing `APP_USERNAME`, `APP_PASSWORD`, and `APP_API_KEY`. Second, the chart now uses named helpers in `_helpers.tpl` so the common environment list and the Vault annotation block are both reusable instead of repeated inline. + +For secret refresh behavior, the important distinction is between renewable and non-renewable secrets. Vault Agent templates renew renewable leases when about two-thirds of the lease duration has elapsed. KV v2 values like the ones used in this lab are non-renewable static secrets, so the agent re-fetches and re-renders them on its static refresh interval rather than through lease renewal. The default interval for those static secrets is periodic rather than instantaneous, which is acceptable for this lab but important to remember in production. + +`vault.hashicorp.com/agent-inject-command-` is the annotation you would add if the application must run a command after a template is rendered or refreshed. The common use case is reloading a process after the file changes, for example a `kill -HUP` signal or a small wrapper script. I documented it rather than enabling it because this Flask/Gunicorn lab service already starts cleanly with the injected file and does not need an automatic config reload hook for the exercise. + +## Security Analysis + +Kubernetes Secrets are fine for simple cluster-local use cases where you only need to hand a small amount of sensitive data to workloads and you control RBAC tightly. They are still just Kubernetes API objects, though, so by themselves they do not solve centralized auditing, rotation workflows, or short-lived credentials. Base64 also does not protect them; it only serializes them. + +Vault is the stronger choice once the environment needs policy-based access control, centralized secret management, auditable reads, multi-service reuse, or dynamic credentials. The tradeoff is operational complexity: you now need a Vault deployment, auth configuration, policies, roles, injector behavior, and an application consumption pattern that can tolerate file-based secret delivery and refresh. + +For production I would not use Vault dev mode. I would run HA storage, TLS, explicit audiences on Kubernetes auth roles, short-lived or dynamic credentials where possible, etcd encryption at rest for any remaining Kubernetes Secrets, and strict RBAC so only the intended workloads and operators can read secret material. + +## Task 4 - Documentation + +This file is the full Lab 11 write-up. To keep the Kubernetes module maintainable, the course-facing compatibility document is `k8s/SECRETS.md`, which points back here in the same way `k8s/HELM.md` points to the Lab 10 report. From 9b94a39c9a08f2d01870a0733bec0b7364db6c07 Mon Sep 17 00:00:00 2001 From: LocalT0aster Dan <90502400+LocalT0aster@users.noreply.github.com> Date: Fri, 10 Apr 2026 04:18:40 +0300 Subject: [PATCH 12/21] Lab12 Complete (#12) * feat(app_python): add persistent visits endpoint * feat(app_go): add persistent visits endpoint * feat(lab12): add configmaps, pvc * docs(k8s): add lab12 report --- app_go/README.md | 15 +- app_go/go.mod | 2 +- app_go/go.sum | 4 +- app_go/main.go | 95 +++- app_go/main_test.go | 130 +++++ app_python/README.md | 33 +- app_python/poetry.lock | 293 ++++++----- app_python/pyproject.toml | 2 +- app_python/src/router.py | 73 ++- app_python/tests/conftest.py | 6 + app_python/tests/test_endpoints.py | 61 +++ k8s/CONFIGMAPS.md | 16 + k8s/README.md | 2 + k8s/devops-app-py/Chart.yaml | 4 +- k8s/devops-app-py/files/config.json | 17 + k8s/devops-app-py/templates/_helpers.tpl | 40 ++ k8s/devops-app-py/templates/configmap.yaml | 24 + k8s/devops-app-py/templates/deployment.yaml | 39 +- k8s/devops-app-py/templates/pvc.yaml | 17 + k8s/devops-app-py/values-dev.yaml | 14 +- k8s/devops-app-py/values-prod.yaml | 16 +- k8s/devops-app-py/values.yaml | 31 +- k8s/docs/LAB12.md | 519 ++++++++++++++++++++ monitoring/.gitignore | 1 + monitoring/docker-compose.yml | 8 +- 25 files changed, 1279 insertions(+), 183 deletions(-) create mode 100644 k8s/CONFIGMAPS.md create mode 100644 k8s/devops-app-py/files/config.json create mode 100644 k8s/devops-app-py/templates/configmap.yaml create mode 100644 k8s/devops-app-py/templates/pvc.yaml create mode 100644 k8s/docs/LAB12.md diff --git a/app_go/README.md b/app_go/README.md index 1e8a5d867a..a2d551a7a3 100644 --- a/app_go/README.md +++ b/app_go/README.md @@ -1,7 +1,7 @@ # DevOps Info Service (Go) ## Overview -Simple Go web service that exposes system/runtime details, health and readiness checks, Prometheus metrics, and structured JSON logs. +Simple Go web service that exposes system/runtime details, a file-backed visits counter, health and readiness checks, Prometheus metrics, and structured JSON logs. ## Prerequisites - Go 1.25+ @@ -20,10 +20,23 @@ HOST=127.0.0.1 PORT=8080 ./devops-info-service.out ## Endpoints - `GET /` - service + system + runtime + request info +- `GET /visits` - current visits counter stored in `/data/visits` - `GET /health` - health check - `GET /ready` - readiness check - `GET /metrics` - Prometheus metrics exposition +## Visits Counter +- The root handler increments the counter on every `GET /`. +- The counter is persisted as plain text in `/data/visits`. +- If the file is missing, the service starts from `0`. +- If the file is malformed, the service logs a warning and treats the value as `0`. + +## Local Docker Check +For Lab 12, run the monitoring stack with a writable `/data` volume for the Go container and verify that: +- repeated `GET /` calls increment the counter +- `GET /visits` returns the current count +- the counter survives a container restart because the backing file is persisted on the host + ## Configuration | Variable | Default | Description | diff --git a/app_go/go.mod b/app_go/go.mod index 1e5f872dad..dc064b6a3b 100644 --- a/app_go/go.mod +++ b/app_go/go.mod @@ -13,6 +13,6 @@ require ( github.com/prometheus/common v0.67.5 // indirect github.com/prometheus/procfs v0.20.1 // indirect go.yaml.in/yaml/v2 v2.4.4 // indirect - golang.org/x/sys v0.42.0 // indirect + golang.org/x/sys v0.43.0 // indirect google.golang.org/protobuf v1.36.11 // indirect ) diff --git a/app_go/go.sum b/app_go/go.sum index 2895e9cec2..e235955aab 100644 --- a/app_go/go.sum +++ b/app_go/go.sum @@ -28,8 +28,8 @@ go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.yaml.in/yaml/v2 v2.4.4 h1:tuyd0P+2Ont/d6e2rl3be67goVK4R6deVxCUX5vyPaQ= go.yaml.in/yaml/v2 v2.4.4/go.mod h1:gMZqIpDtDqOfM0uNfy0SkpRhvUryYH0Z6wdMYcacYXQ= -golang.org/x/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo= -golang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/sys v0.43.0 h1:Rlag2XtaFTxp19wS8MXlJwTvoh8ArU6ezoyFsMyCTNI= +golang.org/x/sys v0.43.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= diff --git a/app_go/main.go b/app_go/main.go index 7e482b4e80..31a9c48af4 100644 --- a/app_go/main.go +++ b/app_go/main.go @@ -8,6 +8,7 @@ import ( "net" "net/http" "os" + "path/filepath" "runtime" "strconv" "strings" @@ -20,7 +21,7 @@ import ( const ( serviceName = "devops-info-service" - serviceVersion = "1.10.0" + serviceVersion = "1.12.0" serviceDescription = "DevOps course info service" serviceFramework = "Go net/http" serviceLoggerName = "devops_info_service" @@ -75,11 +76,17 @@ type StatusResponse struct { UptimeSeconds int64 `json:"uptime_seconds"` } +type VisitsResponse struct { + Visits int `json:"visits"` +} + var ( // startTime is used for uptime calculations. - startTime = time.Now().UTC() - logMu sync.Mutex - logOutput io.Writer = os.Stdout + startTime = time.Now().UTC() + logMu sync.Mutex + visitsMu sync.Mutex + logOutput io.Writer = os.Stdout + visitsFilePath = "/data/visits" // metricsRegistry only exposes service metrics, matching the Python app. metricsRegistry = prometheus.NewRegistry() httpRequestsTotal = prometheus.NewCounterVec( @@ -123,6 +130,7 @@ var ( // endpoints is a static list used to mirror the Python app output. endpoints = []EndpointInfo{ {Path: "/", Method: http.MethodGet, Description: "Service information."}, + {Path: "/visits", Method: http.MethodGet, Description: "Visits counter."}, {Path: "/health", Method: http.MethodGet, Description: "Health check."}, {Path: "/ready", Method: http.MethodGet, Description: "Readiness check."}, {Path: "/metrics", Method: http.MethodGet, Description: "Prometheus metrics."}, @@ -260,6 +268,72 @@ func clientIP(r *http.Request) string { return r.RemoteAddr } +func readVisitsCount() int { + data, err := os.ReadFile(visitsFilePath) + if err != nil { + if os.IsNotExist(err) { + return 0 + } + + emitLog("WARNING", serviceLoggerName, "failed to read visits counter", map[string]any{ + "error": err.Error(), + "path": visitsFilePath, + }) + return 0 + } + + trimmed := strings.TrimSpace(string(data)) + if trimmed == "" { + emitLog("WARNING", serviceLoggerName, "invalid visits counter, resetting to zero", map[string]any{ + "path": visitsFilePath, + "value": "", + }) + return 0 + } + + count, err := strconv.Atoi(trimmed) + if err != nil || count < 0 { + emitLog("WARNING", serviceLoggerName, "invalid visits counter, resetting to zero", map[string]any{ + "path": visitsFilePath, + "value": trimmed, + }) + return 0 + } + + return count +} + +func writeVisitsCount(count int) error { + if err := os.MkdirAll(filepath.Dir(visitsFilePath), 0o755); err != nil { + return err + } + + return os.WriteFile(visitsFilePath, []byte(fmt.Sprintf("%d\n", count)), 0o644) +} + +func getVisitsCount() int { + visitsMu.Lock() + defer visitsMu.Unlock() + + return readVisitsCount() +} + +func incrementVisitsCount() int { + visitsMu.Lock() + defer visitsMu.Unlock() + + count := readVisitsCount() + 1 + if err := writeVisitsCount(count); err != nil { + emitLog("WARNING", serviceLoggerName, "failed to persist visits counter", map[string]any{ + "error": err.Error(), + "path": visitsFilePath, + "value": count, + }) + } + + return count +} + // listEndpoints returns the advertised endpoints for the root response. func listEndpoints() []EndpointInfo { return endpoints @@ -267,7 +341,7 @@ func listEndpoints() []EndpointInfo { func normalizeEndpointLabel(path string) string { switch path { - case "/", "/health", "/metrics", "/ready": + case "/", "/health", "/metrics", "/ready", "/visits": return path default: return "unmatched" @@ -336,6 +410,7 @@ func queryString(r *http.Request) string { // mainHandler serves GET /. func mainHandler(w http.ResponseWriter, r *http.Request) { recordEndpointCall("/") + incrementVisitsCount() payload := RootResponse{ Service: getServiceInfo(), System: getSystemInfo(), @@ -347,6 +422,14 @@ func mainHandler(w http.ResponseWriter, r *http.Request) { writeJSON(w, http.StatusOK, payload) } +// visitsHandler serves GET /visits. +func visitsHandler(w http.ResponseWriter, r *http.Request) { + recordEndpointCall("/visits") + writeJSON(w, http.StatusOK, VisitsResponse{ + Visits: getVisitsCount(), + }) +} + // healthHandler serves GET /health. func healthHandler(w http.ResponseWriter, r *http.Request) { recordEndpointCall("/health") @@ -395,6 +478,8 @@ func router(w http.ResponseWriter, r *http.Request) { switch { case r.URL.Path == "/" && r.Method == http.MethodGet: mainHandler(w, r) + case r.URL.Path == "/visits" && r.Method == http.MethodGet: + visitsHandler(w, r) case r.URL.Path == "/health" && r.Method == http.MethodGet: healthHandler(w, r) case r.URL.Path == "/metrics" && r.Method == http.MethodGet: diff --git a/app_go/main_test.go b/app_go/main_test.go index 32d1784ed3..dbb7d9d79d 100644 --- a/app_go/main_test.go +++ b/app_go/main_test.go @@ -6,6 +6,8 @@ import ( "io" "net/http" "net/http/httptest" + "os" + "path/filepath" "strconv" "strings" "testing" @@ -81,6 +83,18 @@ func performRequest(handler http.Handler, method, path string) *httptest.Respons return recorder } +func withTempVisitsFile(t *testing.T) string { + t.Helper() + + oldPath := visitsFilePath + visitsFilePath = filepath.Join(t.TempDir(), "visits") + t.Cleanup(func() { + visitsFilePath = oldPath + }) + + return visitsFilePath +} + func metricValue(metricsText, sampleName string, labels map[string]string) (float64, bool) { for _, line := range strings.Split(metricsText, "\n") { line = strings.TrimSpace(line) @@ -194,6 +208,57 @@ func TestIndexReturnsExpectedJSONStructureAndTypes(t *testing.T) { for _, route := range []string{ http.MethodGet + " /", + http.MethodGet + " /visits", + http.MethodGet + " /health", + http.MethodGet + " /ready", + http.MethodGet + " /metrics", + } { + if !routeIndex[route] { + t.Fatalf("expected endpoint %q to be listed", route) + } + } +} + +func TestVisitsEndpointDefaultsToZeroWhenFileMissing(t *testing.T) { + restore := captureLogOutput(io.Discard) + defer restore() + + withTempVisitsFile(t) + + recorder := performRequest(http.HandlerFunc(router), http.MethodGet, "/visits") + if recorder.Code != http.StatusOK { + t.Fatalf("expected status %d, got %d", http.StatusOK, recorder.Code) + } + + payload := decodeJSONResponse[VisitsResponse](t, recorder) + if payload.Visits != 0 { + t.Fatalf("expected visits to default to 0, got %d", payload.Visits) + } + + if _, err := os.Stat(visitsFilePath); !os.IsNotExist(err) { + t.Fatalf("expected visits file to remain absent, got err=%v", err) + } +} + +func TestRootIncrementsVisitsCounterAndPersistsFile(t *testing.T) { + restore := captureLogOutput(io.Discard) + defer restore() + + withTempVisitsFile(t) + + first := performRequest(http.HandlerFunc(router), http.MethodGet, "/") + if first.Code != http.StatusOK { + t.Fatalf("expected status %d, got %d", http.StatusOK, first.Code) + } + + payload := decodeJSONResponse[RootResponse](t, first) + routeIndex := map[string]bool{} + for _, endpoint := range payload.Endpoints { + routeIndex[endpoint.Method+" "+endpoint.Path] = true + } + for _, route := range []string{ + http.MethodGet + " /", + http.MethodGet + " /visits", http.MethodGet + " /health", http.MethodGet + " /ready", http.MethodGet + " /metrics", @@ -202,6 +267,71 @@ func TestIndexReturnsExpectedJSONStructureAndTypes(t *testing.T) { t.Fatalf("expected endpoint %q to be listed", route) } } + + data, err := os.ReadFile(visitsFilePath) + if err != nil { + t.Fatalf("expected visits file to be created: %v", err) + } + if got := strings.TrimSpace(string(data)); got != "1" { + t.Fatalf("expected visits file to contain 1 after first root request, got %q", got) + } + + second := performRequest(http.HandlerFunc(router), http.MethodGet, "/") + if second.Code != http.StatusOK { + t.Fatalf("expected status %d, got %d", http.StatusOK, second.Code) + } + + data, err = os.ReadFile(visitsFilePath) + if err != nil { + t.Fatalf("expected visits file to remain readable: %v", err) + } + if got := strings.TrimSpace(string(data)); got != "2" { + t.Fatalf("expected visits file to contain 2 after second root request, got %q", got) + } + + visits := performRequest(http.HandlerFunc(router), http.MethodGet, "/visits") + if visits.Code != http.StatusOK { + t.Fatalf("expected status %d, got %d", http.StatusOK, visits.Code) + } + + count := decodeJSONResponse[VisitsResponse](t, visits) + if count.Visits != 2 { + t.Fatalf("expected visits endpoint to report 2, got %d", count.Visits) + } +} + +func TestVisitsEndpointFallsBackToZeroForMalformedFile(t *testing.T) { + restore := captureLogOutput(io.Discard) + defer restore() + + withTempVisitsFile(t) + + if err := os.WriteFile(visitsFilePath, []byte("broken"), 0o644); err != nil { + t.Fatalf("failed to seed malformed visits file: %v", err) + } + + recorder := performRequest(http.HandlerFunc(router), http.MethodGet, "/visits") + if recorder.Code != http.StatusOK { + t.Fatalf("expected status %d, got %d", http.StatusOK, recorder.Code) + } + + payload := decodeJSONResponse[VisitsResponse](t, recorder) + if payload.Visits != 0 { + t.Fatalf("expected malformed counter to fall back to 0, got %d", payload.Visits) + } + + after := performRequest(http.HandlerFunc(router), http.MethodGet, "/") + if after.Code != http.StatusOK { + t.Fatalf("expected status %d, got %d", http.StatusOK, after.Code) + } + + data, err := os.ReadFile(visitsFilePath) + if err != nil { + t.Fatalf("expected visits file to be repaired by root request: %v", err) + } + if got := strings.TrimSpace(string(data)); got != "1" { + t.Fatalf("expected repaired visits file to contain 1, got %q", got) + } } func TestHealthReturnsExpectedJSONStructureAndTypes(t *testing.T) { diff --git a/app_python/README.md b/app_python/README.md index 78a0b12cc8..e9e3dd1bca 100644 --- a/app_python/README.md +++ b/app_python/README.md @@ -4,7 +4,7 @@ ## Overview -Small Flask web service that reports service metadata, system information, runtime uptime, and basic request details. Includes health, readiness, and Prometheus metrics endpoints for monitoring. +Small Flask web service that reports service metadata, system information, runtime uptime, and basic request details. Includes a persistent visits counter stored at `/data/visits`, plus health, readiness, and Prometheus metrics endpoints for monitoring. ## Prerequisites @@ -53,10 +53,26 @@ Gunicorn access logs are emitted as JSON so Loki can parse request fields cleanl ## API Endpoints - `GET /` - Service and system information +- `GET /visits` - Current persisted visit counter - `GET /health` - Health check - `GET /ready` - Readiness check - `GET /metrics` - Prometheus metrics exposition +## Visits Counter + +- The root handler increments the counter on every `GET /`. +- The counter is persisted as plain text in `/data/visits`. +- If the file is missing, the service starts from `0`. +- If the file is malformed, empty, or negative, the service logs a warning and treats the value as `0`. + +## Local Docker Check + +For Lab 12, run the monitoring stack with a writable `/data` volume for the Python container and verify that: + +- repeated `GET /` calls increment the counter +- `GET /visits` returns the current count +- the counter survives a container restart because the backing file is persisted on the host + ## Configuration | Variable | Default | Description | @@ -74,15 +90,16 @@ poetry install --with dev poetry run pytest --cov=src --cov-report=term-missing ``` +The test suite covers: + +- `GET /` response schema and visits counter increment behavior +- `GET /visits` bootstrap, persisted reads, and malformed-file fallback +- `GET /health` successful response schema and types +- `404` JSON error handling for unknown routes +- `500` JSON error handling for simulated internal failures + ## Linting ```bash poetry run flake8 src tests ``` - -Current test coverage includes: - -- `GET /` successful response schema and types -- `GET /health` successful response schema and types -- `404` JSON error handling for unknown routes -- `500` JSON error handling for simulated internal failures diff --git a/app_python/poetry.lock b/app_python/poetry.lock index 5eb5476447..82248b12d8 100644 --- a/app_python/poetry.lock +++ b/app_python/poetry.lock @@ -26,153 +26,153 @@ files = [ [[package]] name = "charset-normalizer" -version = "3.4.6" +version = "3.4.7" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7" groups = ["main"] files = [ - {file = "charset_normalizer-3.4.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2e1d8ca8611099001949d1cdfaefc510cf0f212484fe7c565f735b68c78c3c95"}, - {file = "charset_normalizer-3.4.6-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e25369dc110d58ddf29b949377a93e0716d72a24f62bad72b2b39f155949c1fd"}, - {file = "charset_normalizer-3.4.6-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:259695e2ccc253feb2a016303543d691825e920917e31f894ca1a687982b1de4"}, - {file = "charset_normalizer-3.4.6-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:dda86aba335c902b6149a02a55b38e96287157e609200811837678214ba2b1db"}, - {file = "charset_normalizer-3.4.6-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:51fb3c322c81d20567019778cb5a4a6f2dc1c200b886bc0d636238e364848c89"}, - {file = "charset_normalizer-3.4.6-cp310-cp310-manylinux_2_31_armv7l.whl", hash = "sha256:4482481cb0572180b6fd976a4d5c72a30263e98564da68b86ec91f0fe35e8565"}, - {file = "charset_normalizer-3.4.6-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:39f5068d35621da2881271e5c3205125cc456f54e9030d3f723288c873a71bf9"}, - {file = "charset_normalizer-3.4.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8bea55c4eef25b0b19a0337dc4e3f9a15b00d569c77211fa8cde38684f234fb7"}, - {file = "charset_normalizer-3.4.6-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:f0cdaecd4c953bfae0b6bb64910aaaca5a424ad9c72d85cb88417bb9814f7550"}, - {file = "charset_normalizer-3.4.6-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:150b8ce8e830eb7ccb029ec9ca36022f756986aaaa7956aad6d9ec90089338c0"}, - {file = "charset_normalizer-3.4.6-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:e68c14b04827dd76dcbd1aeea9e604e3e4b78322d8faf2f8132c7138efa340a8"}, - {file = "charset_normalizer-3.4.6-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:3778fd7d7cd04ae8f54651f4a7a0bd6e39a0cf20f801720a4c21d80e9b7ad6b0"}, - {file = "charset_normalizer-3.4.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:dad6e0f2e481fffdcf776d10ebee25e0ef89f16d691f1e5dee4b586375fdc64b"}, - {file = "charset_normalizer-3.4.6-cp310-cp310-win32.whl", hash = "sha256:74a2e659c7ecbc73562e2a15e05039f1e22c75b7c7618b4b574a3ea9118d1557"}, - {file = "charset_normalizer-3.4.6-cp310-cp310-win_amd64.whl", hash = "sha256:aa9cccf4a44b9b62d8ba8b4dd06c649ba683e4bf04eea606d2e94cfc2d6ff4d6"}, - {file = "charset_normalizer-3.4.6-cp310-cp310-win_arm64.whl", hash = "sha256:e985a16ff513596f217cee86c21371b8cd011c0f6f056d0920aa2d926c544058"}, - {file = "charset_normalizer-3.4.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:82060f995ab5003a2d6e0f4ad29065b7672b6593c8c63559beefe5b443242c3e"}, - {file = "charset_normalizer-3.4.6-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:60c74963d8350241a79cb8feea80e54d518f72c26db618862a8f53e5023deaf9"}, - {file = "charset_normalizer-3.4.6-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f6e4333fb15c83f7d1482a76d45a0818897b3d33f00efd215528ff7c51b8e35d"}, - {file = "charset_normalizer-3.4.6-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:bc72863f4d9aba2e8fd9085e63548a324ba706d2ea2c83b260da08a59b9482de"}, - {file = "charset_normalizer-3.4.6-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9cc4fc6c196d6a8b76629a70ddfcd4635a6898756e2d9cac5565cf0654605d73"}, - {file = "charset_normalizer-3.4.6-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:0c173ce3a681f309f31b87125fecec7a5d1347261ea11ebbb856fa6006b23c8c"}, - {file = "charset_normalizer-3.4.6-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c907cdc8109f6c619e6254212e794d6548373cc40e1ec75e6e3823d9135d29cc"}, - {file = "charset_normalizer-3.4.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:404a1e552cf5b675a87f0651f8b79f5f1e6fd100ee88dc612f89aa16abd4486f"}, - {file = "charset_normalizer-3.4.6-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:e3c701e954abf6fc03a49f7c579cc80c2c6cc52525340ca3186c41d3f33482ef"}, - {file = "charset_normalizer-3.4.6-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:7a6967aaf043bceabab5412ed6bd6bd26603dae84d5cb75bf8d9a74a4959d398"}, - {file = "charset_normalizer-3.4.6-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:5feb91325bbceade6afab43eb3b508c63ee53579fe896c77137ded51c6b6958e"}, - {file = "charset_normalizer-3.4.6-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:f820f24b09e3e779fe84c3c456cb4108a7aa639b0d1f02c28046e11bfcd088ed"}, - {file = "charset_normalizer-3.4.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b35b200d6a71b9839a46b9b7fff66b6638bb52fc9658aa58796b0326595d3021"}, - {file = "charset_normalizer-3.4.6-cp311-cp311-win32.whl", hash = "sha256:9ca4c0b502ab399ef89248a2c84c54954f77a070f28e546a85e91da627d1301e"}, - {file = "charset_normalizer-3.4.6-cp311-cp311-win_amd64.whl", hash = "sha256:a9e68c9d88823b274cf1e72f28cb5dc89c990edf430b0bfd3e2fb0785bfeabf4"}, - {file = "charset_normalizer-3.4.6-cp311-cp311-win_arm64.whl", hash = "sha256:97d0235baafca5f2b09cf332cc275f021e694e8362c6bb9c96fc9a0eb74fc316"}, - {file = "charset_normalizer-3.4.6-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:2ef7fedc7a6ecbe99969cd09632516738a97eeb8bd7258bf8a0f23114c057dab"}, - {file = "charset_normalizer-3.4.6-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a4ea868bc28109052790eb2b52a9ab33f3aa7adc02f96673526ff47419490e21"}, - {file = "charset_normalizer-3.4.6-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:836ab36280f21fc1a03c99cd05c6b7af70d2697e374c7af0b61ed271401a72a2"}, - {file = "charset_normalizer-3.4.6-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f1ce721c8a7dfec21fcbdfe04e8f68174183cf4e8188e0645e92aa23985c57ff"}, - {file = "charset_normalizer-3.4.6-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e28d62a8fc7a1fa411c43bd65e346f3bce9716dc51b897fbe930c5987b402d5"}, - {file = "charset_normalizer-3.4.6-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:530d548084c4a9f7a16ed4a294d459b4f229db50df689bfe92027452452943a0"}, - {file = "charset_normalizer-3.4.6-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:30f445ae60aad5e1f8bdbb3108e39f6fbc09f4ea16c815c66578878325f8f15a"}, - {file = "charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ac2393c73378fea4e52aa56285a3d64be50f1a12395afef9cce47772f60334c2"}, - {file = "charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:90ca27cd8da8118b18a52d5f547859cc1f8354a00cd1e8e5120df3e30d6279e5"}, - {file = "charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8e5a94886bedca0f9b78fecd6afb6629142fd2605aa70a125d49f4edc6037ee6"}, - {file = "charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:695f5c2823691a25f17bc5d5ffe79fa90972cc34b002ac6c843bb8a1720e950d"}, - {file = "charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:231d4da14bcd9301310faf492051bee27df11f2bc7549bc0bb41fef11b82daa2"}, - {file = "charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a056d1ad2633548ca18ffa2f85c202cfb48b68615129143915b8dc72a806a923"}, - {file = "charset_normalizer-3.4.6-cp312-cp312-win32.whl", hash = "sha256:c2274ca724536f173122f36c98ce188fd24ce3dad886ec2b7af859518ce008a4"}, - {file = "charset_normalizer-3.4.6-cp312-cp312-win_amd64.whl", hash = "sha256:c8ae56368f8cc97c7e40a7ee18e1cedaf8e780cd8bc5ed5ac8b81f238614facb"}, - {file = "charset_normalizer-3.4.6-cp312-cp312-win_arm64.whl", hash = "sha256:899d28f422116b08be5118ef350c292b36fc15ec2daeb9ea987c89281c7bb5c4"}, - {file = "charset_normalizer-3.4.6-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:11afb56037cbc4b1555a34dd69151e8e069bee82e613a73bef6e714ce733585f"}, - {file = "charset_normalizer-3.4.6-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:423fb7e748a08f854a08a222b983f4df1912b1daedce51a72bd24fe8f26a1843"}, - {file = "charset_normalizer-3.4.6-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d73beaac5e90173ac3deb9928a74763a6d230f494e4bfb422c217a0ad8e629bf"}, - {file = "charset_normalizer-3.4.6-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d60377dce4511655582e300dc1e5a5f24ba0cb229005a1d5c8d0cb72bb758ab8"}, - {file = "charset_normalizer-3.4.6-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:530e8cebeea0d76bdcf93357aa5e41336f48c3dc709ac52da2bb167c5b8271d9"}, - {file = "charset_normalizer-3.4.6-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:a26611d9987b230566f24a0a125f17fe0de6a6aff9f25c9f564aaa2721a5fb88"}, - {file = "charset_normalizer-3.4.6-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:34315ff4fc374b285ad7f4a0bf7dcbfe769e1b104230d40f49f700d4ab6bbd84"}, - {file = "charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5f8ddd609f9e1af8c7bd6e2aca279c931aefecd148a14402d4e368f3171769fd"}, - {file = "charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:80d0a5615143c0b3225e5e3ef22c8d5d51f3f72ce0ea6fb84c943546c7b25b6c"}, - {file = "charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:92734d4d8d187a354a556626c221cd1a892a4e0802ccb2af432a1d85ec012194"}, - {file = "charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:613f19aa6e082cf96e17e3ffd89383343d0d589abda756b7764cf78361fd41dc"}, - {file = "charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:2b1a63e8224e401cafe7739f77efd3f9e7f5f2026bda4aead8e59afab537784f"}, - {file = "charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6cceb5473417d28edd20c6c984ab6fee6c6267d38d906823ebfe20b03d607dc2"}, - {file = "charset_normalizer-3.4.6-cp313-cp313-win32.whl", hash = "sha256:d7de2637729c67d67cf87614b566626057e95c303bc0a55ffe391f5205e7003d"}, - {file = "charset_normalizer-3.4.6-cp313-cp313-win_amd64.whl", hash = "sha256:572d7c822caf521f0525ba1bce1a622a0b85cf47ffbdae6c9c19e3b5ac3c4389"}, - {file = "charset_normalizer-3.4.6-cp313-cp313-win_arm64.whl", hash = "sha256:a4474d924a47185a06411e0064b803c68be044be2d60e50e8bddcc2649957c1f"}, - {file = "charset_normalizer-3.4.6-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:9cc6e6d9e571d2f863fa77700701dae73ed5f78881efc8b3f9a4398772ff53e8"}, - {file = "charset_normalizer-3.4.6-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef5960d965e67165d75b7c7ffc60a83ec5abfc5c11b764ec13ea54fbef8b4421"}, - {file = "charset_normalizer-3.4.6-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b3694e3f87f8ac7ce279d4355645b3c878d24d1424581b46282f24b92f5a4ae2"}, - {file = "charset_normalizer-3.4.6-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5d11595abf8dd942a77883a39d81433739b287b6aa71620f15164f8096221b30"}, - {file = "charset_normalizer-3.4.6-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7bda6eebafd42133efdca535b04ccb338ab29467b3f7bf79569883676fc628db"}, - {file = "charset_normalizer-3.4.6-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:bbc8c8650c6e51041ad1be191742b8b421d05bbd3410f43fa2a00c8db87678e8"}, - {file = "charset_normalizer-3.4.6-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:22c6f0c2fbc31e76c3b8a86fba1a56eda6166e238c29cdd3d14befdb4a4e4815"}, - {file = "charset_normalizer-3.4.6-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7edbed096e4a4798710ed6bc75dcaa2a21b68b6c356553ac4823c3658d53743a"}, - {file = "charset_normalizer-3.4.6-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:7f9019c9cb613f084481bd6a100b12e1547cf2efe362d873c2e31e4035a6fa43"}, - {file = "charset_normalizer-3.4.6-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:58c948d0d086229efc484fe2f30c2d382c86720f55cd9bc33591774348ad44e0"}, - {file = "charset_normalizer-3.4.6-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:419a9d91bd238052642a51938af8ac05da5b3343becde08d5cdeab9046df9ee1"}, - {file = "charset_normalizer-3.4.6-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:5273b9f0b5835ff0350c0828faea623c68bfa65b792720c453e22b25cc72930f"}, - {file = "charset_normalizer-3.4.6-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:0e901eb1049fdb80f5bd11ed5ea1e498ec423102f7a9b9e4645d5b8204ff2815"}, - {file = "charset_normalizer-3.4.6-cp314-cp314-win32.whl", hash = "sha256:b4ff1d35e8c5bd078be89349b6f3a845128e685e751b6ea1169cf2160b344c4d"}, - {file = "charset_normalizer-3.4.6-cp314-cp314-win_amd64.whl", hash = "sha256:74119174722c4349af9708993118581686f343adc1c8c9c007d59be90d077f3f"}, - {file = "charset_normalizer-3.4.6-cp314-cp314-win_arm64.whl", hash = "sha256:e5bcc1a1ae744e0bb59641171ae53743760130600da8db48cbb6e4918e186e4e"}, - {file = "charset_normalizer-3.4.6-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:ad8faf8df23f0378c6d527d8b0b15ea4a2e23c89376877c598c4870d1b2c7866"}, - {file = "charset_normalizer-3.4.6-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f5ea69428fa1b49573eef0cc44a1d43bebd45ad0c611eb7d7eac760c7ae771bc"}, - {file = "charset_normalizer-3.4.6-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:06a7e86163334edfc5d20fe104db92fcd666e5a5df0977cb5680a506fe26cc8e"}, - {file = "charset_normalizer-3.4.6-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e1f6e2f00a6b8edb562826e4632e26d063ac10307e80f7461f7de3ad8ef3f077"}, - {file = "charset_normalizer-3.4.6-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:95b52c68d64c1878818687a473a10547b3292e82b6f6fe483808fb1468e2f52f"}, - {file = "charset_normalizer-3.4.6-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:7504e9b7dc05f99a9bbb4525c67a2c155073b44d720470a148b34166a69c054e"}, - {file = "charset_normalizer-3.4.6-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:172985e4ff804a7ad08eebec0a1640ece87ba5041d565fff23c8f99c1f389484"}, - {file = "charset_normalizer-3.4.6-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:4be9f4830ba8741527693848403e2c457c16e499100963ec711b1c6f2049b7c7"}, - {file = "charset_normalizer-3.4.6-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:79090741d842f564b1b2827c0b82d846405b744d31e84f18d7a7b41c20e473ff"}, - {file = "charset_normalizer-3.4.6-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:87725cfb1a4f1f8c2fc9890ae2f42094120f4b44db9360be5d99a4c6b0e03a9e"}, - {file = "charset_normalizer-3.4.6-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:fcce033e4021347d80ed9c66dcf1e7b1546319834b74445f561d2e2221de5659"}, - {file = "charset_normalizer-3.4.6-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:ca0276464d148c72defa8bb4390cce01b4a0e425f3b50d1435aa6d7a18107602"}, - {file = "charset_normalizer-3.4.6-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:197c1a244a274bb016dd8b79204850144ef77fe81c5b797dc389327adb552407"}, - {file = "charset_normalizer-3.4.6-cp314-cp314t-win32.whl", hash = "sha256:2a24157fa36980478dd1770b585c0f30d19e18f4fb0c47c13aa568f871718579"}, - {file = "charset_normalizer-3.4.6-cp314-cp314t-win_amd64.whl", hash = "sha256:cd5e2801c89992ed8c0a3f0293ae83c159a60d9a5d685005383ef4caca77f2c4"}, - {file = "charset_normalizer-3.4.6-cp314-cp314t-win_arm64.whl", hash = "sha256:47955475ac79cc504ef2704b192364e51d0d473ad452caedd0002605f780101c"}, - {file = "charset_normalizer-3.4.6-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:659a1e1b500fac8f2779dd9e1570464e012f43e580371470b45277a27baa7532"}, - {file = "charset_normalizer-3.4.6-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f61aa92e4aad0be58eb6eb4e0c21acf32cf8065f4b2cae5665da756c4ceef982"}, - {file = "charset_normalizer-3.4.6-cp38-cp38-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f50498891691e0864dc3da965f340fada0771f6142a378083dc4608f4ea513e2"}, - {file = "charset_normalizer-3.4.6-cp38-cp38-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:bf625105bb9eef28a56a943fec8c8a98aeb80e7d7db99bd3c388137e6eb2d237"}, - {file = "charset_normalizer-3.4.6-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2bd9d128ef93637a5d7a6af25363cf5dec3fa21cf80e68055aad627f280e8afa"}, - {file = "charset_normalizer-3.4.6-cp38-cp38-manylinux_2_31_armv7l.whl", hash = "sha256:d08ec48f0a1c48d75d0356cea971921848fb620fdeba805b28f937e90691209f"}, - {file = "charset_normalizer-3.4.6-cp38-cp38-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1ed80ff870ca6de33f4d953fda4d55654b9a2b340ff39ab32fa3adbcd718f264"}, - {file = "charset_normalizer-3.4.6-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:f98059e4fcd3e3e4e2d632b7cf81c2faae96c43c60b569e9c621468082f1d104"}, - {file = "charset_normalizer-3.4.6-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:ab30e5e3e706e3063bc6de96b118688cb10396b70bb9864a430f67df98c61ecc"}, - {file = "charset_normalizer-3.4.6-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:d5f5d1e9def3405f60e3ca8232d56f35c98fb7bf581efcc60051ebf53cb8b611"}, - {file = "charset_normalizer-3.4.6-cp38-cp38-musllinux_1_2_riscv64.whl", hash = "sha256:461598cd852bfa5a61b09cae2b1c02e2efcd166ee5516e243d540ac24bfa68a7"}, - {file = "charset_normalizer-3.4.6-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:71be7e0e01753a89cf024abf7ecb6bca2c81738ead80d43004d9b5e3f1244e64"}, - {file = "charset_normalizer-3.4.6-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:df01808ee470038c3f8dc4f48620df7225c49c2d6639e38f96e6d6ac6e6f7b0e"}, - {file = "charset_normalizer-3.4.6-cp38-cp38-win32.whl", hash = "sha256:69dd852c2f0ad631b8b60cfbe25a28c0058a894de5abb566619c205ce0550eae"}, - {file = "charset_normalizer-3.4.6-cp38-cp38-win_amd64.whl", hash = "sha256:517ad0e93394ac532745129ceabdf2696b609ec9f87863d337140317ebce1c14"}, - {file = "charset_normalizer-3.4.6-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:31215157227939b4fb3d740cd23fe27be0439afef67b785a1eb78a3ae69cba9e"}, - {file = "charset_normalizer-3.4.6-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ecbbd45615a6885fe3240eb9db73b9e62518b611850fdf8ab08bd56de7ad2b17"}, - {file = "charset_normalizer-3.4.6-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c45a03a4c69820a399f1dda9e1d8fbf3562eda46e7720458180302021b08f778"}, - {file = "charset_normalizer-3.4.6-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e8aeb10fcbe92767f0fa69ad5a72deca50d0dca07fbde97848997d778a50c9fe"}, - {file = "charset_normalizer-3.4.6-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:54fae94be3d75f3e573c9a1b5402dc593de19377013c9a0e4285e3d402dd3a2a"}, - {file = "charset_normalizer-3.4.6-cp39-cp39-manylinux_2_31_armv7l.whl", hash = "sha256:2f7fdd9b6e6c529d6a2501a2d36b240109e78a8ceaef5687cfcfa2bbe671d297"}, - {file = "charset_normalizer-3.4.6-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4d1d02209e06550bdaef34af58e041ad71b88e624f5d825519da3a3308e22687"}, - {file = "charset_normalizer-3.4.6-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8bc5f0687d796c05b1e28ab0d38a50e6309906ee09375dd3aff6a9c09dd6e8f4"}, - {file = "charset_normalizer-3.4.6-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:ee4ec14bc1680d6b0afab9aea2ef27e26d2024f18b24a2d7155a52b60da7e833"}, - {file = "charset_normalizer-3.4.6-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:d1a2ee9c1499fc8f86f4521f27a973c914b211ffa87322f4ee33bb35392da2c5"}, - {file = "charset_normalizer-3.4.6-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:48696db7f18afb80a068821504296eb0787d9ce239b91ca15059d1d3eaacf13b"}, - {file = "charset_normalizer-3.4.6-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:4f41da960b196ea355357285ad1316a00099f22d0929fe168343b99b254729c9"}, - {file = "charset_normalizer-3.4.6-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:802168e03fba8bbc5ce0d866d589e4b1ca751d06edee69f7f3a19c5a9fe6b597"}, - {file = "charset_normalizer-3.4.6-cp39-cp39-win32.whl", hash = "sha256:8761ac29b6c81574724322a554605608a9960769ea83d2c73e396f3df896ad54"}, - {file = "charset_normalizer-3.4.6-cp39-cp39-win_amd64.whl", hash = "sha256:1cf0a70018692f85172348fe06d3a4b63f94ecb055e13a00c644d368eb82e5b8"}, - {file = "charset_normalizer-3.4.6-cp39-cp39-win_arm64.whl", hash = "sha256:3516bbb8d42169de9e61b8520cbeeeb716f12f4ecfe3fd30a9919aa16c806ca8"}, - {file = "charset_normalizer-3.4.6-py3-none-any.whl", hash = "sha256:947cf925bc916d90adba35a64c82aace04fa39b46b52d4630ece166655905a69"}, - {file = "charset_normalizer-3.4.6.tar.gz", hash = "sha256:1ae6b62897110aa7c79ea2f5dd38d1abca6db663687c0b1ad9aed6f6bae3d9d6"}, + {file = "charset_normalizer-3.4.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cdd68a1fb318e290a2077696b7eb7a21a49163c455979c639bf5a5dcdc46617d"}, + {file = "charset_normalizer-3.4.7-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e17b8d5d6a8c47c85e68ca8379def1303fd360c3e22093a807cd34a71cd082b8"}, + {file = "charset_normalizer-3.4.7-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:511ef87c8aec0783e08ac18565a16d435372bc1ac25a91e6ac7f5ef2b0bff790"}, + {file = "charset_normalizer-3.4.7-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:007d05ec7321d12a40227aae9e2bc6dca73f3cb21058999a1df9e193555a9dcc"}, + {file = "charset_normalizer-3.4.7-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cf29836da5119f3c8a8a70667b0ef5fdca3bb12f80fd06487cfa575b3909b393"}, + {file = "charset_normalizer-3.4.7-cp310-cp310-manylinux_2_31_armv7l.whl", hash = "sha256:12d8baf840cc7889b37c7c770f478adea7adce3dcb3944d02ec87508e2dcf153"}, + {file = "charset_normalizer-3.4.7-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d560742f3c0d62afaccf9f41fe485ed69bd7661a241f86a3ef0f0fb8b1a397af"}, + {file = "charset_normalizer-3.4.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b14b2d9dac08e28bb8046a1a0434b1750eb221c8f5b87a68f4fa11a6f97b5e34"}, + {file = "charset_normalizer-3.4.7-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:bc17a677b21b3502a21f66a8cc64f5bfad4df8a0b8434d661666f8ce90ac3af1"}, + {file = "charset_normalizer-3.4.7-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:750e02e074872a3fad7f233b47734166440af3cdea0add3e95163110816d6752"}, + {file = "charset_normalizer-3.4.7-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:4e5163c14bffd570ef2affbfdd77bba66383890797df43dc8b4cc7d6f500bf53"}, + {file = "charset_normalizer-3.4.7-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:6ed74185b2db44f41ef35fd1617c5888e59792da9bbc9190d6c7300617182616"}, + {file = "charset_normalizer-3.4.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:94e1885b270625a9a828c9793b4d52a64445299baa1fea5a173bf1d3dd9a1a5a"}, + {file = "charset_normalizer-3.4.7-cp310-cp310-win32.whl", hash = "sha256:6785f414ae0f3c733c437e0f3929197934f526d19dfaa75e18fdb4f94c6fb374"}, + {file = "charset_normalizer-3.4.7-cp310-cp310-win_amd64.whl", hash = "sha256:6696b7688f54f5af4462118f0bfa7c1621eeb87154f77fa04b9295ce7a8f2943"}, + {file = "charset_normalizer-3.4.7-cp310-cp310-win_arm64.whl", hash = "sha256:66671f93accb62ed07da56613636f3641f1a12c13046ce91ffc923721f23c008"}, + {file = "charset_normalizer-3.4.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7641bb8895e77f921102f72833904dcd9901df5d6d72a2ab8f31d04b7e51e4e7"}, + {file = "charset_normalizer-3.4.7-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:202389074300232baeb53ae2569a60901f7efadd4245cf3a3bf0617d60b439d7"}, + {file = "charset_normalizer-3.4.7-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:30b8d1d8c52a48c2c5690e152c169b673487a2a58de1ec7393196753063fcd5e"}, + {file = "charset_normalizer-3.4.7-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:532bc9bf33a68613fd7d65e4b1c71a6a38d7d42604ecf239c77392e9b4e8998c"}, + {file = "charset_normalizer-3.4.7-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2fe249cb4651fd12605b7288b24751d8bfd46d35f12a20b1ba33dea122e690df"}, + {file = "charset_normalizer-3.4.7-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:65bcd23054beab4d166035cabbc868a09c1a49d1efe458fe8e4361215df40265"}, + {file = "charset_normalizer-3.4.7-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:08e721811161356f97b4059a9ba7bafb23ea5ee2255402c42881c214e173c6b4"}, + {file = "charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e060d01aec0a910bdccb8be71faf34e7799ce36950f8294c8bf612cba65a2c9e"}, + {file = "charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:38c0109396c4cfc574d502df99742a45c72c08eff0a36158b6f04000043dbf38"}, + {file = "charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:1c2a768fdd44ee4a9339a9b0b130049139b8ce3c01d2ce09f67f5a68048d477c"}, + {file = "charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:1a87ca9d5df6fe460483d9a5bbf2b18f620cbed41b432e2bddb686228282d10b"}, + {file = "charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:d635aab80466bc95771bb78d5370e74d36d1fe31467b6b29b8b57b2a3cd7d22c"}, + {file = "charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ae196f021b5e7c78e918242d217db021ed2a6ace2bc6ae94c0fc596221c7f58d"}, + {file = "charset_normalizer-3.4.7-cp311-cp311-win32.whl", hash = "sha256:adb2597b428735679446b46c8badf467b4ca5f5056aae4d51a19f9570301b1ad"}, + {file = "charset_normalizer-3.4.7-cp311-cp311-win_amd64.whl", hash = "sha256:8e385e4267ab76874ae30db04c627faaaf0b509e1ccc11a95b3fc3e83f855c00"}, + {file = "charset_normalizer-3.4.7-cp311-cp311-win_arm64.whl", hash = "sha256:d4a48e5b3c2a489fae013b7589308a40146ee081f6f509e047e0e096084ceca1"}, + {file = "charset_normalizer-3.4.7-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:eca9705049ad3c7345d574e3510665cb2cf844c2f2dcfe675332677f081cbd46"}, + {file = "charset_normalizer-3.4.7-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6178f72c5508bfc5fd446a5905e698c6212932f25bcdd4b47a757a50605a90e2"}, + {file = "charset_normalizer-3.4.7-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e1421b502d83040e6d7fb2fb18dff63957f720da3d77b2fbd3187ceb63755d7b"}, + {file = "charset_normalizer-3.4.7-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:edac0f1ab77644605be2cbba52e6b7f630731fc42b34cb0f634be1a6eface56a"}, + {file = "charset_normalizer-3.4.7-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5649fd1c7bade02f320a462fdefd0b4bd3ce036065836d4f42e0de958038e116"}, + {file = "charset_normalizer-3.4.7-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:203104ed3e428044fd943bc4bf45fa73c0730391f9621e37fe39ecf477b128cb"}, + {file = "charset_normalizer-3.4.7-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:298930cec56029e05497a76988377cbd7457ba864beeea92ad7e844fe74cd1f1"}, + {file = "charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:708838739abf24b2ceb208d0e22403dd018faeef86ddac04319a62ae884c4f15"}, + {file = "charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:0f7eb884681e3938906ed0434f20c63046eacd0111c4ba96f27b76084cd679f5"}, + {file = "charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4dc1e73c36828f982bfe79fadf5919923f8a6f4df2860804db9a98c48824ce8d"}, + {file = "charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:aed52fea0513bac0ccde438c188c8a471c4e0f457c2dd20cdbf6ea7a450046c7"}, + {file = "charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:fea24543955a6a729c45a73fe90e08c743f0b3334bbf3201e6c4bc1b0c7fa464"}, + {file = "charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:bb6d88045545b26da47aa879dd4a89a71d1dce0f0e549b1abcb31dfe4a8eac49"}, + {file = "charset_normalizer-3.4.7-cp312-cp312-win32.whl", hash = "sha256:2257141f39fe65a3fdf38aeccae4b953e5f3b3324f4ff0daf9f15b8518666a2c"}, + {file = "charset_normalizer-3.4.7-cp312-cp312-win_amd64.whl", hash = "sha256:5ed6ab538499c8644b8a3e18debabcd7ce684f3fa91cf867521a7a0279cab2d6"}, + {file = "charset_normalizer-3.4.7-cp312-cp312-win_arm64.whl", hash = "sha256:56be790f86bfb2c98fb742ce566dfb4816e5a83384616ab59c49e0604d49c51d"}, + {file = "charset_normalizer-3.4.7-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f496c9c3cc02230093d8330875c4c3cdfc3b73612a5fd921c65d39cbcef08063"}, + {file = "charset_normalizer-3.4.7-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ea948db76d31190bf08bd371623927ee1339d5f2a0b4b1b4a4439a65298703c"}, + {file = "charset_normalizer-3.4.7-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a277ab8928b9f299723bc1a2dabb1265911b1a76341f90a510368ca44ad9ab66"}, + {file = "charset_normalizer-3.4.7-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3bec022aec2c514d9cf199522a802bd007cd588ab17ab2525f20f9c34d067c18"}, + {file = "charset_normalizer-3.4.7-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e044c39e41b92c845bc815e5ae4230804e8e7bc29e399b0437d64222d92809dd"}, + {file = "charset_normalizer-3.4.7-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:f495a1652cf3fbab2eb0639776dad966c2fb874d79d87ca07f9d5f059b8bd215"}, + {file = "charset_normalizer-3.4.7-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e712b419df8ba5e42b226c510472b37bd57b38e897d3eca5e8cfd410a29fa859"}, + {file = "charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7804338df6fcc08105c7745f1502ba68d900f45fd770d5bdd5288ddccb8a42d8"}, + {file = "charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:481551899c856c704d58119b5025793fa6730adda3571971af568f66d2424bb5"}, + {file = "charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f59099f9b66f0d7145115e6f80dd8b1d847176df89b234a5a6b3f00437aa0832"}, + {file = "charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:f59ad4c0e8f6bba240a9bb85504faa1ab438237199d4cce5f622761507b8f6a6"}, + {file = "charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:3dedcc22d73ec993f42055eff4fcfed9318d1eeb9a6606c55892a26964964e48"}, + {file = "charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:64f02c6841d7d83f832cd97ccf8eb8a906d06eb95d5276069175c696b024b60a"}, + {file = "charset_normalizer-3.4.7-cp313-cp313-win32.whl", hash = "sha256:4042d5c8f957e15221d423ba781e85d553722fc4113f523f2feb7b188cc34c5e"}, + {file = "charset_normalizer-3.4.7-cp313-cp313-win_amd64.whl", hash = "sha256:3946fa46a0cf3e4c8cb1cc52f56bb536310d34f25f01ca9b6c16afa767dab110"}, + {file = "charset_normalizer-3.4.7-cp313-cp313-win_arm64.whl", hash = "sha256:80d04837f55fc81da168b98de4f4b797ef007fc8a79ab71c6ec9bc4dd662b15b"}, + {file = "charset_normalizer-3.4.7-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:c36c333c39be2dbca264d7803333c896ab8fa7d4d6f0ab7edb7dfd7aea6e98c0"}, + {file = "charset_normalizer-3.4.7-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1c2aed2e5e41f24ea8ef1590b8e848a79b56f3a5564a65ceec43c9d692dc7d8a"}, + {file = "charset_normalizer-3.4.7-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:54523e136b8948060c0fa0bc7b1b50c32c186f2fceee897a495406bb6e311d2b"}, + {file = "charset_normalizer-3.4.7-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:715479b9a2802ecac752a3b0efa2b0b60285cf962ee38414211abdfccc233b41"}, + {file = "charset_normalizer-3.4.7-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bd6c2a1c7573c64738d716488d2cdd3c00e340e4835707d8fdb8dc1a66ef164e"}, + {file = "charset_normalizer-3.4.7-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:c45e9440fb78f8ddabcf714b68f936737a121355bf59f3907f4e17721b9d1aae"}, + {file = "charset_normalizer-3.4.7-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3534e7dcbdcf757da6b85a0bbf5b6868786d5982dd959b065e65481644817a18"}, + {file = "charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e8ac484bf18ce6975760921bb6148041faa8fef0547200386ea0b52b5d27bf7b"}, + {file = "charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:a5fe03b42827c13cdccd08e6c0247b6a6d4b5e3cdc53fd1749f5896adcdc2356"}, + {file = "charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:2d6eb928e13016cea4f1f21d1e10c1cebd5a421bc57ddf5b1142ae3f86824fab"}, + {file = "charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:e74327fb75de8986940def6e8dee4f127cc9752bee7355bb323cc5b2659b6d46"}, + {file = "charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:d6038d37043bced98a66e68d3aa2b6a35505dc01328cd65217cefe82f25def44"}, + {file = "charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7579e913a5339fb8fa133f6bbcfd8e6749696206cf05acdbdca71a1b436d8e72"}, + {file = "charset_normalizer-3.4.7-cp314-cp314-win32.whl", hash = "sha256:5b77459df20e08151cd6f8b9ef8ef1f961ef73d85c21a555c7eed5b79410ec10"}, + {file = "charset_normalizer-3.4.7-cp314-cp314-win_amd64.whl", hash = "sha256:92a0a01ead5e668468e952e4238cccd7c537364eb7d851ab144ab6627dbbe12f"}, + {file = "charset_normalizer-3.4.7-cp314-cp314-win_arm64.whl", hash = "sha256:67f6279d125ca0046a7fd386d01b311c6363844deac3e5b069b514ba3e63c246"}, + {file = "charset_normalizer-3.4.7-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:effc3f449787117233702311a1b7d8f59cba9ced946ba727bdc329ec69028e24"}, + {file = "charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fbccdc05410c9ee21bbf16a35f4c1d16123dcdeb8a1d38f33654fa21d0234f79"}, + {file = "charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:733784b6d6def852c814bce5f318d25da2ee65dd4839a0718641c696e09a2960"}, + {file = "charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a89c23ef8d2c6b27fd200a42aa4ac72786e7c60d40efdc76e6011260b6e949c4"}, + {file = "charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6c114670c45346afedc0d947faf3c7f701051d2518b943679c8ff88befe14f8e"}, + {file = "charset_normalizer-3.4.7-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:a180c5e59792af262bf263b21a3c49353f25945d8d9f70628e73de370d55e1e1"}, + {file = "charset_normalizer-3.4.7-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3c9a494bc5ec77d43cea229c4f6db1e4d8fe7e1bbffa8b6f0f0032430ff8ab44"}, + {file = "charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8d828b6667a32a728a1ad1d93957cdf37489c57b97ae6c4de2860fa749b8fc1e"}, + {file = "charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:cf1493cd8607bec4d8a7b9b004e699fcf8f9103a9284cc94962cb73d20f9d4a3"}, + {file = "charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:0c96c3b819b5c3e9e165495db84d41914d6894d55181d2d108cc1a69bfc9cce0"}, + {file = "charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:752a45dc4a6934060b3b0dab47e04edc3326575f82be64bc4fc293914566503e"}, + {file = "charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:8778f0c7a52e56f75d12dae53ae320fae900a8b9b4164b981b9c5ce059cd1fcb"}, + {file = "charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ce3412fbe1e31eb81ea42f4169ed94861c56e643189e1e75f0041f3fe7020abe"}, + {file = "charset_normalizer-3.4.7-cp314-cp314t-win32.whl", hash = "sha256:c03a41a8784091e67a39648f70c5f97b5b6a37f216896d44d2cdcb82615339a0"}, + {file = "charset_normalizer-3.4.7-cp314-cp314t-win_amd64.whl", hash = "sha256:03853ed82eeebbce3c2abfdbc98c96dc205f32a79627688ac9a27370ea61a49c"}, + {file = "charset_normalizer-3.4.7-cp314-cp314t-win_arm64.whl", hash = "sha256:c35abb8bfff0185efac5878da64c45dafd2b37fb0383add1be155a763c1f083d"}, + {file = "charset_normalizer-3.4.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e5f4d355f0a2b1a31bc3edec6795b46324349c9cb25eed068049e4f472fb4259"}, + {file = "charset_normalizer-3.4.7-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:16d971e29578a5e97d7117866d15889a4a07befe0e87e703ed63cd90cb348c01"}, + {file = "charset_normalizer-3.4.7-cp38-cp38-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:dca4bbc466a95ba9c0234ef56d7dd9509f63da22274589ebd4ed7f1f4d4c54e3"}, + {file = "charset_normalizer-3.4.7-cp38-cp38-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e80c8378d8f3d83cd3164da1ad2df9e37a666cdde7b1cb2298ed0b558064be30"}, + {file = "charset_normalizer-3.4.7-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:36836d6ff945a00b88ba1e4572d721e60b5b8c98c155d465f56ad19d68f23734"}, + {file = "charset_normalizer-3.4.7-cp38-cp38-manylinux_2_31_armv7l.whl", hash = "sha256:bd9b23791fe793e4968dba0c447e12f78e425c59fc0e3b97f6450f4781f3ee60"}, + {file = "charset_normalizer-3.4.7-cp38-cp38-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:aef65cd602a6d0e0ff6f9930fcb1c8fec60dd2cfcb6facaf4bdb0e5873042db0"}, + {file = "charset_normalizer-3.4.7-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:82b271f5137d07749f7bf32f70b17ab6eaabedd297e75dce75081a24f76eb545"}, + {file = "charset_normalizer-3.4.7-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:1efde3cae86c8c273f1eb3b287be7d8499420cf2fe7585c41d370d3e790054a5"}, + {file = "charset_normalizer-3.4.7-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:c593052c465475e64bbfe5dbd81680f64a67fdc752c56d7a0ae205dc8aeefe0f"}, + {file = "charset_normalizer-3.4.7-cp38-cp38-musllinux_1_2_riscv64.whl", hash = "sha256:af21eb4409a119e365397b2adbaca4c9ccab56543a65d5dbd9f920d6ac29f686"}, + {file = "charset_normalizer-3.4.7-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:84c018e49c3bf790f9c2771c45e9313a08c2c2a6342b162cd650258b57817706"}, + {file = "charset_normalizer-3.4.7-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:dd915403e231e6b1809fe9b6d9fc55cf8fb5e02765ac625d9cd623342a7905d7"}, + {file = "charset_normalizer-3.4.7-cp38-cp38-win32.whl", hash = "sha256:320ade88cfb846b8cd6b4ddf5ee9e80ee0c1f52401f2456b84ae1ae6a1a5f207"}, + {file = "charset_normalizer-3.4.7-cp38-cp38-win_amd64.whl", hash = "sha256:1dc8b0ea451d6e69735094606991f32867807881400f808a106ee1d963c46a83"}, + {file = "charset_normalizer-3.4.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:177a0ba5f0211d488e295aaf82707237e331c24788d8d76c96c5a41594723217"}, + {file = "charset_normalizer-3.4.7-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6e0d51f618228538a3e8f46bd246f87a6cd030565e015803691603f55e12afb5"}, + {file = "charset_normalizer-3.4.7-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:14265bfe1f09498b9d8ec91e9ec9fa52775edf90fcbde092b25f4a33d444fea9"}, + {file = "charset_normalizer-3.4.7-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:87fad7d9ba98c86bcb41b2dc8dbb326619be2562af1f8ff50776a39e55721c5a"}, + {file = "charset_normalizer-3.4.7-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f22dec1690b584cea26fade98b2435c132c1b5f68e39f5a0b7627cd7ae31f1dc"}, + {file = "charset_normalizer-3.4.7-cp39-cp39-manylinux_2_31_armv7l.whl", hash = "sha256:d61f00a0869d77422d9b2aba989e2d24afa6ffd552af442e0e58de4f35ea6d00"}, + {file = "charset_normalizer-3.4.7-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6370e8686f662e6a3941ee48ed4742317cafbe5707e36406e9df792cdb535776"}, + {file = "charset_normalizer-3.4.7-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a6c5863edfbe888d9eff9c8b8087354e27618d9da76425c119293f11712a6319"}, + {file = "charset_normalizer-3.4.7-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:ed065083d0898c9d5b4bbec7b026fd755ff7454e6e8b73a67f8c744b13986e24"}, + {file = "charset_normalizer-3.4.7-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:2cd4a60d0e2fb04537162c62bbbb4182f53541fe0ede35cdf270a1c1e723cc42"}, + {file = "charset_normalizer-3.4.7-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:813c0e0132266c08eb87469a642cb30aaff57c5f426255419572aaeceeaa7bf4"}, + {file = "charset_normalizer-3.4.7-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:07d9e39b01743c3717745f4c530a6349eadbfa043c7577eef86c502c15df2c67"}, + {file = "charset_normalizer-3.4.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c0f081d69a6e58272819b70288d3221a6ee64b98df852631c80f293514d3b274"}, + {file = "charset_normalizer-3.4.7-cp39-cp39-win32.whl", hash = "sha256:8751d2787c9131302398b11e6c8068053dcb55d5a8964e114b6e196cf16cb366"}, + {file = "charset_normalizer-3.4.7-cp39-cp39-win_amd64.whl", hash = "sha256:12a6fff75f6bc66711b73a2f0addfc4c8c15a20e805146a02d147a318962c444"}, + {file = "charset_normalizer-3.4.7-cp39-cp39-win_arm64.whl", hash = "sha256:bb8cc7534f51d9a017b93e3e85b260924f909601c3df002bcdb58ddb4dc41a5c"}, + {file = "charset_normalizer-3.4.7-py3-none-any.whl", hash = "sha256:3dce51d0f5e7951f8bb4900c257dad282f49190fdbebecd4ba99bcc41fef404d"}, + {file = "charset_normalizer-3.4.7.tar.gz", hash = "sha256:ae89db9e5f98a11a4bf50407d4363e7b09b31e55bc117b4f7d80aab97ba009e5"}, ] [[package]] name = "click" -version = "8.3.1" +version = "8.3.2" description = "Composable command line interface toolkit" optional = false python-versions = ">=3.10" groups = ["main"] files = [ - {file = "click-8.3.1-py3-none-any.whl", hash = "sha256:981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6"}, - {file = "click-8.3.1.tar.gz", hash = "sha256:12ff4785d337a1bb490bb7e9c2b1ee5da3112e94a8622f26a6c77f5d2fc6842a"}, + {file = "click-8.3.2-py3-none-any.whl", hash = "sha256:1924d2c27c5653561cd2cae4548d1406039cb79b858b747cfea24924bbc1616d"}, + {file = "click-8.3.2.tar.gz", hash = "sha256:14162b8b3b3550a7d479eafa77dfd3c38d9dc8951f6f69c78913a8f9a7540fd5"}, ] [package.dependencies] @@ -627,14 +627,14 @@ files = [ [[package]] name = "pygments" -version = "2.19.2" +version = "2.20.0" description = "Pygments is a syntax highlighting package written in Python." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b"}, - {file = "pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887"}, + {file = "pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176"}, + {file = "pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f"}, ] [package.extras] @@ -642,14 +642,14 @@ windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pytest" -version = "9.0.2" +version = "9.0.3" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "pytest-9.0.2-py3-none-any.whl", hash = "sha256:711ffd45bf766d5264d487b917733b453d917afd2b0ad65223959f59089f875b"}, - {file = "pytest-9.0.2.tar.gz", hash = "sha256:75186651a92bd89611d1d9fc20f0b4345fd827c41ccd5c299a868a05d70edf11"}, + {file = "pytest-9.0.3-py3-none-any.whl", hash = "sha256:2c5efc453d45394fdd706ade797c0a81091eccd1d6e4bccfcd476e2b8e0ab5d9"}, + {file = "pytest-9.0.3.tar.gz", hash = "sha256:b86ada508af81d19edeb213c681b1d48246c1a91d304c6c81a427674c17eb91c"}, ] [package.dependencies] @@ -684,14 +684,14 @@ testing = ["process-tests", "pytest-xdist", "virtualenv"] [[package]] name = "requests" -version = "2.33.0" +version = "2.33.1" description = "Python HTTP for Humans." optional = false python-versions = ">=3.10" groups = ["main"] files = [ - {file = "requests-2.33.0-py3-none-any.whl", hash = "sha256:3324635456fa185245e24865e810cecec7b4caf933d7eb133dcde67d48cee69b"}, - {file = "requests-2.33.0.tar.gz", hash = "sha256:c7ebc5e8b0f21837386ad0e1c8fe8b829fa5f544d8df3b2253bff14ef29d7652"}, + {file = "requests-2.33.1-py3-none-any.whl", hash = "sha256:4e6d1ef462f3626a1f0a0a9c42dd93c63bad33f9f1c1937509b8c5c8718ab56a"}, + {file = "requests-2.33.1.tar.gz", hash = "sha256:18817f8c57c6263968bc123d237e3b8b08ac046f5456bd1e307ee8f4250d3517"}, ] [package.dependencies] @@ -702,7 +702,6 @@ urllib3 = ">=1.26,<3" [package.extras] socks = ["PySocks (>=1.5.6,!=1.5.7)"] -test = ["PySocks (>=1.5.6,!=1.5.7)", "pytest (>=3)", "pytest-cov", "pytest-httpbin (==2.1.0)", "pytest-mock", "pytest-xdist"] use-chardet-on-py3 = ["chardet (>=3.0.2,<8)"] [[package]] @@ -725,14 +724,14 @@ zstd = ["backports-zstd (>=1.0.0) ; python_version < \"3.14\""] [[package]] name = "werkzeug" -version = "3.1.7" +version = "3.1.8" description = "The comprehensive WSGI web application library." optional = false python-versions = ">=3.9" groups = ["main"] files = [ - {file = "werkzeug-3.1.7-py3-none-any.whl", hash = "sha256:4b314d81163a3e1a169b6a0be2a000a0e204e8873c5de6586f453c55688d422f"}, - {file = "werkzeug-3.1.7.tar.gz", hash = "sha256:fb8c01fe6ab13b9b7cdb46892b99b1d66754e1d7ab8e542e865ec13f526b5351"}, + {file = "werkzeug-3.1.8-py3-none-any.whl", hash = "sha256:63a77fb8892bf28ebc3178683445222aa500e48ebad5ec77b0ad80f8726b1f50"}, + {file = "werkzeug-3.1.8.tar.gz", hash = "sha256:9bad61a4268dac112f1c5cd4630a56ede601b6ed420300677a869083d70a4c44"}, ] [package.dependencies] diff --git a/app_python/pyproject.toml b/app_python/pyproject.toml index ca312b1657..43c22bd9cd 100644 --- a/app_python/pyproject.toml +++ b/app_python/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "devops-info-service" -version = "1.10.0" +version = "1.12.0" description = "" authors = [ {name = "LocalT0aster",email = "90502400+LocalT0aster@users.noreply.github.com"} diff --git a/app_python/src/router.py b/app_python/src/router.py index 35b32270f6..47174e44cd 100644 --- a/app_python/src/router.py +++ b/app_python/src/router.py @@ -6,7 +6,9 @@ import inspect from multiprocessing import cpu_count import platform +from pathlib import Path import socket +from threading import Lock from flask import jsonify, request @@ -25,7 +27,9 @@ record_endpoint_call, ) -__version__ = "1.10.0" +__version__ = "1.12.0" +VISITS_FILE = Path("/data/visits") +_VISITS_LOCK = Lock() def get_service_info() -> dict[str, str]: @@ -128,9 +132,69 @@ def list_routes() -> list[dict[str, str]]: return out +def _read_visits_count() -> int: + """Read the current visits counter, defaulting to zero when missing.""" + try: + raw_count = VISITS_FILE.read_text(encoding="utf-8").strip() + except FileNotFoundError: + return 0 + except OSError as error: + logger.warning( + "failed to read visits counter", + extra={"path": str(VISITS_FILE), "error": str(error)}, + ) + return 0 + + if not raw_count: + logger.warning( + "invalid visits counter, resetting to zero", + extra={"path": str(VISITS_FILE), "value": ""}, + ) + return 0 + + try: + count = int(raw_count) + except ValueError: + logger.warning( + "invalid visits counter, resetting to zero", + extra={"path": str(VISITS_FILE), "value": raw_count}, + ) + return 0 + + if count < 0: + logger.warning( + "invalid visits counter, resetting to zero", + extra={"path": str(VISITS_FILE), "value": raw_count}, + ) + return 0 + + return count + + +def _write_visits_count(count: int) -> None: + """Persist the visits counter to disk.""" + VISITS_FILE.parent.mkdir(parents=True, exist_ok=True) + VISITS_FILE.write_text(f"{count}\n", encoding="utf-8") + + +def get_visits_count() -> int: + """Return the current persisted visits count.""" + with _VISITS_LOCK: + return _read_visits_count() + + +def increment_visits_count() -> int: + """Increment and persist the visits counter.""" + with _VISITS_LOCK: + count = _read_visits_count() + 1 + _write_visits_count(count) + return count + + @app.route("/") def index(): """Service information.""" + increment_visits_count() record_endpoint_call("/") return jsonify( { @@ -143,6 +207,13 @@ def index(): ) +@app.route("/visits") +def visits(): + """Return the current persisted visits count.""" + record_endpoint_call("/visits") + return jsonify({"visits": get_visits_count()}) + + @app.route("/health") def health(): """Health check.""" diff --git a/app_python/tests/conftest.py b/app_python/tests/conftest.py index eef52e6a63..2319d53971 100644 --- a/app_python/tests/conftest.py +++ b/app_python/tests/conftest.py @@ -12,3 +12,9 @@ def client(): app.config.update(TESTING=True, PROPAGATE_EXCEPTIONS=False) with app.test_client() as test_client: yield test_client + + +@pytest.fixture(autouse=True) +def isolated_visits_file(tmp_path, monkeypatch): + """Route the visits counter to a per-test temporary file.""" + monkeypatch.setattr(src.router, "VISITS_FILE", tmp_path / "visits") diff --git a/app_python/tests/test_endpoints.py b/app_python/tests/test_endpoints.py index 6299a7c1dd..08fe39fece 100644 --- a/app_python/tests/test_endpoints.py +++ b/app_python/tests/test_endpoints.py @@ -1,6 +1,7 @@ """Unit tests for HTTP endpoints and error handling.""" from datetime import datetime +from unittest.mock import Mock import src.router as router @@ -61,11 +62,71 @@ def test_index_returns_expected_json_structure_and_types(client): route_index = {(endpoint["method"], endpoint["path"]) for endpoint in endpoints} assert ("GET", "/") in route_index + assert ("GET", "/visits") in route_index assert ("GET", "/health") in route_index assert ("GET", "/ready") in route_index assert ("GET", "/metrics") in route_index +def test_visits_defaults_to_zero_when_counter_file_is_missing(client, tmp_path, monkeypatch): + """GET /visits should bootstrap from zero when the counter file is absent.""" + visits_file = tmp_path / "visits" + monkeypatch.setattr(router, "VISITS_FILE", visits_file) + + response = client.get("/visits") + + assert response.status_code == 200 + assert response.get_json() == {"visits": 0} + assert not visits_file.exists() + + +def test_index_increments_and_persists_visits_count(client, tmp_path, monkeypatch): + """GET / should increment the counter and persist the new value.""" + visits_file = tmp_path / "visits" + monkeypatch.setattr(router, "VISITS_FILE", visits_file) + + first_response = client.get("/") + second_response = client.get("/") + visits_response = client.get("/visits") + + assert first_response.status_code == 200 + assert second_response.status_code == 200 + assert visits_response.status_code == 200 + assert visits_response.get_json() == {"visits": 2} + assert visits_file.read_text(encoding="utf-8") == "2\n" + + +def test_visits_returns_persisted_count(client, tmp_path, monkeypatch): + """GET /visits should return the current persisted counter value.""" + visits_file = tmp_path / "visits" + visits_file.write_text("7\n", encoding="utf-8") + monkeypatch.setattr(router, "VISITS_FILE", visits_file) + + response = client.get("/visits") + + assert response.status_code == 200 + assert response.get_json() == {"visits": 7} + + +def test_visits_falls_back_to_zero_when_counter_file_is_malformed( + client, + tmp_path, + monkeypatch, +): + """GET /visits should warn and recover when the counter file is malformed.""" + visits_file = tmp_path / "visits" + visits_file.write_text("definitely-not-an-integer\n", encoding="utf-8") + warning_mock = Mock() + monkeypatch.setattr(router, "VISITS_FILE", visits_file) + monkeypatch.setattr(router.logger, "warning", warning_mock) + + response = client.get("/visits") + + assert response.status_code == 200 + assert response.get_json() == {"visits": 0} + warning_mock.assert_called() + + def test_health_returns_expected_json_structure_and_types(client): """GET /health should report healthy status and typed runtime metadata.""" response = client.get("/health") diff --git a/k8s/CONFIGMAPS.md b/k8s/CONFIGMAPS.md new file mode 100644 index 0000000000..3343b2c6a7 --- /dev/null +++ b/k8s/CONFIGMAPS.md @@ -0,0 +1,16 @@ +# ConfigMap Notes + +This file exists to satisfy the Lab 12 requirement for a dedicated ConfigMap document without flattening the Kubernetes module back into one large documentation directory. + +## Lab 12 Documentation + +The full Lab 12 write-up, command transcripts, Docker persistence proof, Kubernetes verification, and hot-reload notes are kept in [docs/LAB12.md](docs/LAB12.md). + +## Why This Structure Is Better + +- `k8s/README.md` stays short and usable as the module entry point. +- `k8s/docs/LAB09.md`, [docs/LAB10.md](docs/LAB10.md), [docs/LAB11.md](docs/LAB11.md), and [docs/LAB12.md](docs/LAB12.md) keep each Kubernetes lab self-contained. +- Raw manifests, Helm chart files, and documentation stay separated, which makes the implementation files easier to navigate. +- `k8s/CONFIGMAPS.md` provides the compatibility filename the lab expects while the actual report remains in the `docs/` hierarchy. + +In short, `CONFIGMAPS.md` is the compatibility layer, and `k8s/docs/` remains the maintainable long-term structure. diff --git a/k8s/README.md b/k8s/README.md index 805a36dbcd..2ad36987ad 100644 --- a/k8s/README.md +++ b/k8s/README.md @@ -13,6 +13,8 @@ The main deployment assets are: - [Helm Notes](HELM.md) - [Secrets Notes](SECRETS.md) +- [ConfigMap Notes](CONFIGMAPS.md) - [Lab 09 - Kubernetes Basics](docs/LAB09.md) - [Lab 10 - Helm Package Manager](docs/LAB10.md) - [Lab 11 - Kubernetes Secrets and Vault](docs/LAB11.md) +- [Lab 12 - ConfigMaps and Persistent Volumes](docs/LAB12.md) diff --git a/k8s/devops-app-py/Chart.yaml b/k8s/devops-app-py/Chart.yaml index 9c6a6c21c2..8aec2f0141 100644 --- a/k8s/devops-app-py/Chart.yaml +++ b/k8s/devops-app-py/Chart.yaml @@ -2,8 +2,8 @@ apiVersion: v2 name: devops-app-py description: Helm chart for the DevOps Core Python application type: application -version: 0.3.0 -appVersion: "1.9" +version: 0.4.0 +appVersion: "1.12.0" keywords: - python - flask diff --git a/k8s/devops-app-py/files/config.json b/k8s/devops-app-py/files/config.json new file mode 100644 index 0000000000..6cf32ae23e --- /dev/null +++ b/k8s/devops-app-py/files/config.json @@ -0,0 +1,17 @@ +{ + "application": { + "name": {{ .Values.config.file.appName | quote }}, + "environment": {{ .Values.config.file.environment | quote }}, + "version": {{ (.Values.image.tag | default .Chart.AppVersion) | quote }} + }, + "featureFlags": { + "visitsCounter": {{ .Values.config.file.featureFlags.visitsCounter }}, + "metrics": {{ .Values.config.file.featureFlags.metrics }}, + "configReloadDemo": {{ .Values.config.file.featureFlags.configReloadDemo }} + }, + "settings": { + "configPath": {{ printf "%s/config.json" .Values.config.mountPath | quote }}, + "visitsFile": {{ printf "%s/visits" .Values.persistence.mountPath | quote }}, + "reloadStrategy": "checksum-rollout" + } +} diff --git a/k8s/devops-app-py/templates/_helpers.tpl b/k8s/devops-app-py/templates/_helpers.tpl index 68a3b20d88..c86a8d9ab9 100644 --- a/k8s/devops-app-py/templates/_helpers.tpl +++ b/k8s/devops-app-py/templates/_helpers.tpl @@ -65,6 +65,27 @@ Create the secret name. {{- printf "%s-secret" (include "devops-app-py.fullname" .) | trunc 63 | trimSuffix "-" }} {{- end }} +{{/* +Create the file ConfigMap name. +*/}} +{{- define "devops-app-py.fileConfigMapName" -}} +{{- printf "%s-config" (include "devops-app-py.fullname" .) | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create the env ConfigMap name. +*/}} +{{- define "devops-app-py.envConfigMapName" -}} +{{- printf "%s-env" (include "devops-app-py.fullname" .) | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create the PVC name. +*/}} +{{- define "devops-app-py.pvcName" -}} +{{- printf "%s-data" (include "devops-app-py.fullname" .) | trunc 63 | trimSuffix "-" }} +{{- end }} + {{/* Create the service account name. */}} @@ -86,6 +107,25 @@ Render non-secret environment variables. {{- end }} {{- end }} +{{/* +Render the chart-managed config.json file. +*/}} +{{- define "devops-app-py.renderedConfigJson" -}} +{{- tpl (.Files.Get "files/config.json") . -}} +{{- end }} + +{{/* +Render pod checksum annotations for config-driven rollouts. +*/}} +{{- define "devops-app-py.configChecksums" -}} +{{- if .Values.config.file.enabled }} +checksum/config-file: {{ include "devops-app-py.renderedConfigJson" . | sha256sum | quote }} +{{- end }} +{{- if .Values.config.env.enabled }} +checksum/config-env: {{ toJson .Values.config.env.data | sha256sum | quote }} +{{- end }} +{{- end }} + {{/* Render Vault injector annotations. */}} diff --git a/k8s/devops-app-py/templates/configmap.yaml b/k8s/devops-app-py/templates/configmap.yaml new file mode 100644 index 0000000000..a7026b28bb --- /dev/null +++ b/k8s/devops-app-py/templates/configmap.yaml @@ -0,0 +1,24 @@ +{{- if .Values.config.file.enabled }} +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ include "devops-app-py.fileConfigMapName" . }} + labels: + {{- include "devops-app-py.labels" . | nindent 4 }} +data: + config.json: |- +{{ include "devops-app-py.renderedConfigJson" . | indent 4 }} +{{- end }} +{{- if and .Values.config.file.enabled .Values.config.env.enabled }} +--- +{{- end }} +{{- if .Values.config.env.enabled }} +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ include "devops-app-py.envConfigMapName" . }} + labels: + {{- include "devops-app-py.labels" . | nindent 4 }} +data: + {{- toYaml .Values.config.env.data | nindent 2 }} +{{- end }} diff --git a/k8s/devops-app-py/templates/deployment.yaml b/k8s/devops-app-py/templates/deployment.yaml index 607c604237..d099e3a42c 100644 --- a/k8s/devops-app-py/templates/deployment.yaml +++ b/k8s/devops-app-py/templates/deployment.yaml @@ -2,6 +2,7 @@ apiVersion: apps/v1 kind: Deployment {{- $envVars := include "devops-app-py.envVars" . | trim }} {{- $vaultAnnotations := include "devops-app-py.vaultAnnotations" . | trim }} +{{- $configChecksums := include "devops-app-py.configChecksums" . | trim }} metadata: name: {{ include "devops-app-py.fullname" . }} labels: @@ -19,11 +20,14 @@ spec: {{- include "devops-app-py.selectorLabels" . | nindent 6 }} template: metadata: - {{- if or $vaultAnnotations .Values.podAnnotations }} + {{- if or $vaultAnnotations $configChecksums .Values.podAnnotations }} annotations: {{- if $vaultAnnotations }} {{- $vaultAnnotations | nindent 8 }} {{- end }} + {{- if $configChecksums }} + {{- $configChecksums | nindent 8 }} + {{- end }} {{- with .Values.podAnnotations }} {{- toYaml . | nindent 8 }} {{- end }} @@ -44,10 +48,28 @@ spec: - name: http containerPort: {{ .Values.containerPort }} protocol: TCP - {{- if .Values.secrets.enabled }} + {{- if or .Values.config.file.enabled .Values.persistence.enabled }} + volumeMounts: + {{- if .Values.config.file.enabled }} + - name: config-volume + mountPath: {{ .Values.config.mountPath | quote }} + readOnly: true + {{- end }} + {{- if .Values.persistence.enabled }} + - name: data-volume + mountPath: {{ .Values.persistence.mountPath | quote }} + {{- end }} + {{- end }} + {{- if or .Values.config.env.enabled .Values.secrets.enabled }} envFrom: + {{- if .Values.config.env.enabled }} + - configMapRef: + name: {{ include "devops-app-py.envConfigMapName" . }} + {{- end }} + {{- if .Values.secrets.enabled }} - secretRef: name: {{ include "devops-app-py.secretName" . }} + {{- end }} {{- end }} {{- if $envVars }} env: @@ -65,3 +87,16 @@ spec: resources: {{- toYaml . | nindent 12 }} {{- end }} + {{- if or .Values.config.file.enabled .Values.persistence.enabled }} + volumes: + {{- if .Values.config.file.enabled }} + - name: config-volume + configMap: + name: {{ include "devops-app-py.fileConfigMapName" . }} + {{- end }} + {{- if .Values.persistence.enabled }} + - name: data-volume + persistentVolumeClaim: + claimName: {{ include "devops-app-py.pvcName" . }} + {{- end }} + {{- end }} diff --git a/k8s/devops-app-py/templates/pvc.yaml b/k8s/devops-app-py/templates/pvc.yaml new file mode 100644 index 0000000000..5f817de35e --- /dev/null +++ b/k8s/devops-app-py/templates/pvc.yaml @@ -0,0 +1,17 @@ +{{- if .Values.persistence.enabled }} +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: {{ include "devops-app-py.pvcName" . }} + labels: + {{- include "devops-app-py.labels" . | nindent 4 }} +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: {{ .Values.persistence.size }} + {{- if .Values.persistence.storageClass }} + storageClassName: {{ .Values.persistence.storageClass | quote }} + {{- end }} +{{- end }} diff --git a/k8s/devops-app-py/values-dev.yaml b/k8s/devops-app-py/values-dev.yaml index f2d401a344..234178c728 100644 --- a/k8s/devops-app-py/values-dev.yaml +++ b/k8s/devops-app-py/values-dev.yaml @@ -1,7 +1,7 @@ replicaCount: 1 image: - tag: "1.9-dev" + tag: "1.12-dev" deployment: revisionHistoryLimit: 2 @@ -11,8 +11,14 @@ env: value: "0.0.0.0" - name: PORT value: "5000" - - name: APP_ENV - value: "development" + +config: + file: + environment: "development" + env: + data: + APP_ENV: "development" + LOG_LEVEL: "debug" podLabels: environment: dev @@ -21,7 +27,7 @@ service: type: NodePort port: 80 targetPort: 5000 - nodePort: 30081 + nodePort: 30082 resources: requests: diff --git a/k8s/devops-app-py/values-prod.yaml b/k8s/devops-app-py/values-prod.yaml index cca4fee171..1feebd8413 100644 --- a/k8s/devops-app-py/values-prod.yaml +++ b/k8s/devops-app-py/values-prod.yaml @@ -1,7 +1,7 @@ -replicaCount: 3 +replicaCount: 1 image: - tag: "1.9" + tag: "1.12" deployment: revisionHistoryLimit: 10 @@ -11,8 +11,16 @@ env: value: "0.0.0.0" - name: PORT value: "5000" - - name: APP_ENV - value: "production" + +config: + file: + environment: "production" + featureFlags: + configReloadDemo: false + env: + data: + APP_ENV: "production" + LOG_LEVEL: "info" podLabels: environment: prod diff --git a/k8s/devops-app-py/values.yaml b/k8s/devops-app-py/values.yaml index 59d2f5cd84..253a63eb46 100644 --- a/k8s/devops-app-py/values.yaml +++ b/k8s/devops-app-py/values.yaml @@ -1,9 +1,9 @@ -replicaCount: 5 +replicaCount: 1 partOf: devops-core-s26 image: repository: localt0aster/devops-app-py - tag: "1.9" + tag: "1.12-dev" pullPolicy: IfNotPresent containerPort: 5000 @@ -26,6 +26,31 @@ env: - name: PORT value: "5000" +config: + mountPath: /config + file: + enabled: true + appName: "devops-info-service" + environment: "development" + featureFlags: + visitsCounter: true + metrics: true + configReloadDemo: true + env: + enabled: true + data: + APP_NAME: "devops-info-service" + APP_ENV: "development" + APP_CONFIG_PATH: "/config/config.json" + APP_VISITS_PATH: "/data/visits" + LOG_LEVEL: "info" + +persistence: + enabled: true + mountPath: /data + size: 100Mi + storageClass: "" + secrets: enabled: true stringData: @@ -46,7 +71,7 @@ service: type: NodePort port: 80 targetPort: 5000 - nodePort: 30080 + nodePort: 30082 resources: requests: diff --git a/k8s/docs/LAB12.md b/k8s/docs/LAB12.md new file mode 100644 index 0000000000..8660a969c2 --- /dev/null +++ b/k8s/docs/LAB12.md @@ -0,0 +1,519 @@ +# Kubernetes Lab 12 - ConfigMaps and Persistent Volumes + +I reused the existing Docker-backed `minikube` cluster instead of tearing it down. The starting state already contained the Lab 11 app release and Vault, so this lab was added on top of that environment with a new Helm release name, `lab12-devops-app-py`, to avoid clobbering the earlier work. All usernames and passwords are redacted in this write-up. + +## Current Cluster Context + +
+kubectl config current-context, kubectl cluster-info, kubectl get nodes -o wide, kubectl get storageclass, helm list -A + +```text +$ kubectl config current-context +minikube +$ kubectl cluster-info +Kubernetes control plane is running at https://192.168.49.2:8443 +CoreDNS is running at https://192.168.49.2:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy + +To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'. +$ kubectl get nodes -o wide +NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME +minikube Ready control-plane 52m v1.35.1 192.168.49.2 Debian GNU/Linux 12 (bookworm) 6.19.11-1-cachyos docker://29.2.1 +$ kubectl get storageclass +NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE +standard (default) k8s.io/minikube-hostpath Delete Immediate false 52m +$ helm list -A +NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION +lab11-devops-app-py default 2 2026-04-10 02:04:56.679295263 +0300 +03 deployed devops-app-py-0.3.0 1.9 +vault vault 1 2026-04-10 02:02:00.558749873 +0300 +03 deployed vault-0.32.0 1.21.2 +``` + +
+ +## Task 1 - Application Persistence Upgrade + +I implemented the same file-backed visits counter in both `app_python` and `app_go`. Both services now store the counter in `/data/visits`, increment it on every `GET /`, expose `GET /visits`, default to `0` when the file is missing, and recover from malformed content by treating it as `0`. The Python runtime version and `pyproject.toml` version both moved to `1.12.0`, and the Go runtime version moved to `1.12.0`. + +
+./.venv/bin/pytest, go test ./..., and separate app commits + +```bash +$ ./.venv/bin/pytest +============================= test session starts ============================== +platform linux -- Python 3.14.3, pytest-9.0.2, pluggy-1.6.0 +rootdir: /home/t0ast/Repos/DevOps-Core-S26/app_python +configfile: pyproject.toml +plugins: anyio-4.12.1, cov-7.1.0 +collected 19 items + +tests/test_endpoints.py ........... [ 57%] +tests/test_logging_utils.py . [ 63%] +tests/test_metrics.py .. [ 73%] +tests/test_unit_helpers.py ..... [100%] + +============================== 19 passed in 0.11s ============================== + +$ go test ./... +ok example.com/devops-info-service 0.005s + +$ git log --oneline -2 +3ebf11e feat(app_go): add persistent visits endpoint +ceaf67d feat(app_python): add persistent visits endpoint +``` + +
+ +
+docker compose -f monitoring/docker-compose.yml config | sed -n "/app-go:/,/grafana:/p" + +```text +$ docker compose -f monitoring/docker-compose.yml config | sed -n /app-go:/,/grafana:/p + app-go: + environment: + HOST: 0.0.0.0 + PORT: "8001" + image: localt0aster/devops-app-go:1.12-dev + ports: + - mode: ingress + target: 8001 + published: "8001" + protocol: tcp + volumes: + - type: bind + source: /home/t0ast/Repos/DevOps-Core-S26/monitoring/data/app-go + target: /data + bind: {} + app-python: + environment: + HOST: 0.0.0.0 + PORT: "8000" + image: localt0aster/devops-app-py:1.12-dev + ports: + - mode: ingress + target: 8000 + published: "8000" + protocol: tcp + volumes: + - type: bind + source: /home/t0ast/Repos/DevOps-Core-S26/monitoring/data/app-python + target: /data + bind: {} +``` + +
+ +
+docker compose up and local visits persistence proof for both apps + +```bash +$ docker compose -f monitoring/docker-compose.yml up -d --pull always app-python app-go app-go-healthcheck +... +$ docker compose -f monitoring/docker-compose.yml ps app-python app-go app-go-healthcheck +NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS +monitoring-app-go-1 localt0aster/devops-app-go:1.12-dev "/devops-info-servic…" app-go 1 second ago Up Less than a second 0.0.0.0:8001->8001/tcp, [::]:8001->8001/tcp +monitoring-app-go-healthcheck-1 curlimages/curl:8.18.0 "/entrypoint.sh sh -…" app-go-healthcheck 1 second ago Up Less than a second (health: starting) +monitoring-app-python-1 localt0aster/devops-app-py:1.12-dev "sh -c 'gunicorn --c…" app-python 1 second ago Up Less than a second (health: starting) 0.0.0.0:8000->8000/tcp, [::]:8000->8000/tcp + +$ curl -sS http://127.0.0.1:8000/visits | jq . +{ + "visits": 0 +} +$ curl -sS http://127.0.0.1:8000/ >/dev/null +$ curl -sS http://127.0.0.1:8000/ >/dev/null +$ curl -sS http://127.0.0.1:8000/visits | jq . +{ + "visits": 2 +} +$ cat monitoring/data/app-python/visits +2 + +$ curl -sS http://127.0.0.1:8001/visits | jq . +{ + "visits": 0 +} +$ curl -sS http://127.0.0.1:8001/ >/dev/null +$ curl -sS http://127.0.0.1:8001/ >/dev/null +$ curl -sS http://127.0.0.1:8001/visits | jq . +{ + "visits": 2 +} +$ cat monitoring/data/app-go/visits +2 + +$ docker compose -f monitoring/docker-compose.yml restart app-python app-go +... +$ curl -sS http://127.0.0.1:8000/visits | jq . +{ + "visits": 2 +} +$ curl -sS http://127.0.0.1:8001/visits | jq . +{ + "visits": 2 +} +$ cat monitoring/data/app-python/visits +2 +$ cat monitoring/data/app-go/visits +2 +``` + +
+ +## Task 2 - ConfigMaps + +I extended the existing Helm chart instead of writing one-off manifests. The chart now contains: + +- `files/config.json` as the file-backed application config source +- `templates/configmap.yaml` rendering both a file ConfigMap and an env ConfigMap +- `templates/pvc.yaml` for the visits counter volume +- checksum annotations on the Pod template so chart-managed config changes trigger a rollout + +I also changed the chart defaults for Lab 12 correctness: `replicaCount` is now `1`, the chart version is `0.4.0`, the app version is `1.12.0`, and the dev NodePort moved to `30082` so it does not collide with the existing Lab 11 release on `30081`. + +
+helm lint and rendered manifest excerpts + +```bash +$ helm lint k8s/devops-app-py +==> Linting k8s/devops-app-py +[INFO] Chart.yaml: icon is recommended + +1 chart(s) linted, 0 chart(s) failed +``` + +```yaml +# Source: devops-app-py/templates/configmap.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: lab12-devops-app-py-config +data: + config.json: |- + { + "application": { + "name": "devops-info-service", + "environment": "development", + "version": "1.12-dev" + }, + "featureFlags": { + "visitsCounter": true, + "metrics": true, + "configReloadDemo": true + }, + "settings": { + "configPath": "/config/config.json", + "visitsFile": "/data/visits", + "reloadStrategy": "checksum-rollout" + } + } +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: lab12-devops-app-py-env +data: + APP_CONFIG_PATH: /config/config.json + APP_ENV: development + APP_NAME: devops-info-service + APP_VISITS_PATH: /data/visits + LOG_LEVEL: debug +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: lab12-devops-app-py-data +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 100Mi +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: lab12-devops-app-py +spec: + replicas: 1 + template: + metadata: + annotations: + checksum/config-file: "75d068a2b686d100b01ef7eb95c683ff78dc01f7103131c74502cd3dba657e95" + checksum/config-env: "ade0526aff038f694a130dfce92e2748879ea4cd4e9a802b692762639b4851bf" + spec: + containers: + - name: devops-app-py + image: "localt0aster/devops-app-py:1.12-dev" + volumeMounts: + - name: config-volume + mountPath: "/config" + readOnly: true + - name: data-volume + mountPath: "/data" + envFrom: + - configMapRef: + name: lab12-devops-app-py-env + - secretRef: + name: lab12-devops-app-py-secret + volumes: + - name: config-volume + configMap: + name: lab12-devops-app-py-config + - name: data-volume + persistentVolumeClaim: + claimName: lab12-devops-app-py-data +``` + +
+ +## Task 3 - Persistent Volumes + +I installed the updated chart as a new release named `lab12-devops-app-py`, verified the rendered ConfigMaps and PVC in-cluster, then proved that the application could read `/config/config.json`, receive the env ConfigMap via `envFrom`, write `/data/visits`, and survive a Pod replacement without losing the counter. + +One useful operational detail from `kubectl describe pod` is that Kubernetes shows the env var sources as `ConfigMap` and `Secret` references instead of dumping the actual values. That keeps Pod inspection safer while still proving where the data comes from. + +
+helm upgrade --install lab12-devops-app-py ... and initial resource state + +```bash +$ helm upgrade --install lab12-devops-app-py k8s/devops-app-py -n default -f k8s/devops-app-py/values-dev.yaml --wait --wait-for-jobs --timeout 300s +Release "lab12-devops-app-py" does not exist. Installing it now. +NAME: lab12-devops-app-py +LAST DEPLOYED: Fri Apr 10 03:02:03 2026 +NAMESPACE: default +STATUS: deployed +REVISION: 1 +DESCRIPTION: Install complete +``` + +```text +$ kubectl get deploy,svc,pod,configmap,pvc -n default -l app.kubernetes.io/instance=lab12-devops-app-py -o wide +NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR +deployment.apps/lab12-devops-app-py 1/1 1 1 61s devops-app-py localt0aster/devops-app-py:1.12-dev app.kubernetes.io/instance=lab12-devops-app-py,app.kubernetes.io/name=devops-app-py + +NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR +service/lab12-devops-app-py-service NodePort 10.101.70.46 80:30082/TCP 61s app.kubernetes.io/instance=lab12-devops-app-py,app.kubernetes.io/name=devops-app-py + +NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES +pod/lab12-devops-app-py-5f6df94f6d-5wxtq 1/1 Running 0 61s 10.244.0.10 minikube + +NAME DATA AGE +configmap/lab12-devops-app-py-config 1 61s +configmap/lab12-devops-app-py-env 5 61s + +NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE VOLUMEMODE +persistentvolumeclaim/lab12-devops-app-py-data Bound pvc-d04d328c-f6f3-44f7-8347-d8724a16b744 100Mi RWO standard 61s Filesystem +``` + +
+ +
+kubectl exec for mounted /config/config.json, env vars, and Pod description + +```bash +$ kubectl exec -n default lab12-devops-app-py-5f6df94f6d-5wxtq -- cat /config/config.json | jq . +{ + "application": { + "name": "devops-info-service", + "environment": "development", + "version": "1.12-dev" + }, + "featureFlags": { + "visitsCounter": true, + "metrics": true, + "configReloadDemo": true + }, + "settings": { + "configPath": "/config/config.json", + "visitsFile": "/data/visits", + "reloadStrategy": "checksum-rollout" + } +} + +$ kubectl exec -n default lab12-devops-app-py-5f6df94f6d-5wxtq -- printenv | grep -E "^(APP_|LOG_LEVEL)" +APP_ENV=development +LOG_LEVEL=debug +APP_CONFIG_PATH=/config/config.json +APP_NAME=devops-info-service +APP_VISITS_PATH=/data/visits +APP_PASSWORD=[REDACTED] +APP_USERNAME=[REDACTED] +``` + +```text +$ kubectl describe pod -n default lab12-devops-app-py-5f6df94f6d-bkwfx +... +Environment Variables from: + lab12-devops-app-py-env ConfigMap Optional: false + lab12-devops-app-py-secret Secret Optional: false +Environment: + HOST: 0.0.0.0 + PORT: 5000 +Mounts: + /config from config-volume (ro) + /data from data-volume (rw) +... +``` + +
+ +
+curl through the NodePort and PVC persistence across pod deletion + +```bash +$ minikube ip +192.168.49.2 +$ curl -sS http://192.168.49.2:30082/visits | jq . +{ + "visits": 0 +} +$ curl -sS http://192.168.49.2:30082/ >/dev/null +$ curl -sS http://192.168.49.2:30082/ >/dev/null +$ curl -sS http://192.168.49.2:30082/visits | jq . +{ + "visits": 2 +} +$ kubectl exec -n default lab12-devops-app-py-5f6df94f6d-5wxtq -- cat /data/visits +2 + +$ kubectl delete pod -n default lab12-devops-app-py-5f6df94f6d-5wxtq +pod "lab12-devops-app-py-5f6df94f6d-5wxtq" deleted from default namespace +$ kubectl wait -n default --for=condition=Ready pod -l app.kubernetes.io/instance=lab12-devops-app-py --timeout=180s +pod/lab12-devops-app-py-5f6df94f6d-bkwfx condition met +old_pod=lab12-devops-app-py-5f6df94f6d-5wxtq +new_pod=lab12-devops-app-py-5f6df94f6d-bkwfx +$ curl -sS http://192.168.49.2:30082/visits | jq . +{ + "visits": 2 +} +$ kubectl exec -n default lab12-devops-app-py-5f6df94f6d-bkwfx -- cat /data/visits +2 +``` + +
+ +## Bonus - ConfigMap Update Behavior + +I deliberately mounted the ConfigMap as a directory (`/config`) instead of using `subPath`. The reason is simple: `subPath` mounts are bind mounts to a fixed inode, so they do not receive projected ConfigMap updates. For a live file update demonstration, the whole projected directory mount is the correct pattern. + +I tested three distinct behaviors: + +1. A manual `kubectl patch` against the file ConfigMap updated the mounted `/config/config.json` inside the running Pod after roughly 11 seconds. +2. A manual patch against the env ConfigMap did not change `APP_ENV` inside the already-running process, which confirms that `envFrom` variables are fixed at container start. +3. A chart-managed config change updated the checksum annotations and rolled the Deployment to a new Pod, which then saw the new file content and the new env vars. + +One practical wrinkle showed up during this: after I used `kubectl patch` on Helm-managed ConfigMaps, the next `helm upgrade` hit server-side-apply field ownership conflicts on the same keys. I repaired that by reapplying the rendered ConfigMaps with `kubectl apply --server-side --force-conflicts --field-manager=helm`, then reran a new chart-managed config change successfully. + +
+kubectl patch configmap lab12-devops-app-py-config and mounted-file update delay + +```bash +$ jq . <<< "$PATCH" +{ + "data": { + "config.json": "{\n \"application\": {\n \"name\": \"devops-info-service\",\n \"environment\": \"manual-edit\",\n \"version\": \"1.12-dev\"\n },\n \"featureFlags\": {\n \"visitsCounter\": true,\n \"metrics\": true,\n \"configReloadDemo\": true\n },\n \"settings\": {\n \"configPath\": \"/config/config.json\",\n \"visitsFile\": \"/data/visits\",\n \"reloadStrategy\": \"checksum-rollout\"\n }\n}" + } +} +$ kubectl patch configmap -n default lab12-devops-app-py-config --type merge -p "$PATCH" +configmap/lab12-devops-app-py-config patched +$ wait for mounted /config/config.json to show environment=manual-edit +delay_seconds=11 +$ kubectl exec -n default lab12-devops-app-py-5f6df94f6d-bkwfx -- cat /config/config.json | jq .application.environment +"manual-edit" +``` + +
+ +
+kubectl patch configmap lab12-devops-app-py-env and proof that envFrom does not hot-reload + +```bash +$ jq . <<< "$PATCH" +{ + "data": { + "APP_ENV": "manual-edit" + } +} +$ kubectl patch configmap -n default lab12-devops-app-py-env --type merge -p "$PATCH" +configmap/lab12-devops-app-py-env patched +$ kubectl exec -n default lab12-devops-app-py-5f6df94f6d-bkwfx -- printenv APP_ENV +development +``` + +
+ +
+kubectl apply --server-side --force-conflicts --field-manager=helm to repair Helm ownership + +```bash +$ helm template lab12-devops-app-py k8s/devops-app-py -n default -f k8s/devops-app-py/values-dev.yaml --set config.file.environment=chart-rollout --set config.env.data.APP_ENV=chart-rollout --show-only templates/configmap.yaml > /tmp/lab12/52-rendered-configmaps.yaml +$ kubectl apply --server-side --force-conflicts --field-manager=helm -f /tmp/lab12/52-rendered-configmaps.yaml +configmap/lab12-devops-app-py-config serverside-applied +configmap/lab12-devops-app-py-env serverside-applied +$ kubectl get configmap lab12-devops-app-py-config -n default -o json | jq -r .data["config.json"] | jq .application.environment +"chart-rollout" +$ kubectl get configmap lab12-devops-app-py-env -n default -o json | jq -r .data.APP_ENV +chart-rollout +``` + +
+ +
+helm upgrade ... --set config.file.environment=chart-rollout-fixed --set config.env.data.APP_ENV=chart-rollout-fixed + +```bash +$ helm upgrade lab12-devops-app-py k8s/devops-app-py -n default -f k8s/devops-app-py/values-dev.yaml --set config.file.environment=chart-rollout-fixed --set config.env.data.APP_ENV=chart-rollout-fixed --wait --wait-for-jobs --timeout 300s +Release "lab12-devops-app-py" has been upgraded. Happy Helming! +NAME: lab12-devops-app-py +LAST DEPLOYED: Fri Apr 10 03:07:15 2026 +NAMESPACE: default +STATUS: deployed +REVISION: 4 +DESCRIPTION: Upgrade complete +old_pod=lab12-devops-app-py-6b4d4cff8d-wbcnz +new_pod=lab12-devops-app-py-7bb96994f8-n6269 +$ kubectl get deployment -n default lab12-devops-app-py -o json | jq .spec.template.metadata.annotations +{ + "checksum/config-env": "e34c4bf455ae82b7283e96127fcffbd6fe96332325a9e8953204033ec6ade5f5", + "checksum/config-file": "8d6ed3c72ff6122928a1d3e148717df696ff7cb1f6f203fcc8934903da9669a7" +} +$ kubectl exec -n default lab12-devops-app-py-7bb96994f8-n6269 -- cat /config/config.json | jq .application.environment +"chart-rollout-fixed" +$ kubectl exec -n default lab12-devops-app-py-7bb96994f8-n6269 -- printenv APP_ENV +chart-rollout-fixed +``` + +
+ +
+curl end-state service check after the final rollout + +```bash +$ curl -sS http://192.168.49.2:30082/health | jq . +{ + "status": "healthy", + "timestamp": "2026-04-10T00:07:47.059488+00:00", + "uptime_seconds": 14 +} +$ curl -sS http://192.168.49.2:30082/ready | jq . +{ + "status": "ready", + "timestamp": "2026-04-10T00:07:47.079301+00:00", + "uptime_seconds": 14 +} +$ curl -sS http://192.168.49.2:30082/visits | jq . +{ + "visits": 2 +} +``` + +
+ +## ConfigMap vs Secret + +- Use a `ConfigMap` for non-sensitive application configuration such as environment names, feature flags, log levels, file paths, and JSON app settings. +- Use a `Secret` for credentials or tokens. In this repo the chart still keeps `APP_USERNAME` and `APP_PASSWORD` in a separate Secret and only references them via `envFrom`. +- `ConfigMap` data is meant to be readable operational config. `Secret` data is still only base64-encoded unless cluster-side at-rest encryption and RBAC are configured properly. +- Mounted ConfigMap files can update in place when the whole projected directory is mounted. Environment variables injected from either `ConfigMap` or `Secret` do not update inside an already-running container. + +## Task 4 - Documentation + +This file is the full Lab 12 report. The compatibility filename required by the lab lives at [../CONFIGMAPS.md](../CONFIGMAPS.md) and points back here so the module root does not turn into one large transcript dump. diff --git a/monitoring/.gitignore b/monitoring/.gitignore index 03bd4129be..d965490406 100644 --- a/monitoring/.gitignore +++ b/monitoring/.gitignore @@ -1 +1,2 @@ *.env +data/ diff --git a/monitoring/docker-compose.yml b/monitoring/docker-compose.yml index 17e5da4e4d..15acfd1bb4 100644 --- a/monitoring/docker-compose.yml +++ b/monitoring/docker-compose.yml @@ -133,12 +133,14 @@ services: restart: unless-stopped app-python: - image: localt0aster/devops-app-py:1.8 + image: localt0aster/devops-app-py:1.12-dev environment: HOST: "0.0.0.0" PORT: "8000" ports: - "8000:8000" + volumes: + - ./data/app-python:/data labels: logging: "promtail" app: "devops-python" @@ -163,7 +165,7 @@ services: restart: unless-stopped app-go: - image: localt0aster/devops-app-go:1.7.9a42ee5 + image: localt0aster/devops-app-go:1.12-dev # Re-enable local builds if Docker networking breaks behind the tun/VPN setup. # build: # context: ../app_go @@ -173,6 +175,8 @@ services: PORT: "8001" ports: - "8001:8001" + volumes: + - ./data/app-go:/data labels: logging: "promtail" app: "devops-go" From 20f0175306a841f4623761f0eebbd58135fecb1d Mon Sep 17 00:00:00 2001 From: LocalT0aster Dan <90502400+LocalT0aster@users.noreply.github.com> Date: Fri, 24 Apr 2026 04:07:55 +0300 Subject: [PATCH 13/21] Lab13 Complete (#13) * feat(k8s): add argocd applications * chore(k8s): scale default argocd demo * chore(k8s): update argocd environment values * fix(k8s): exclude hook pods from service endpoints * docs(k8s): add lab13 report * screenshots --- k8s/ARGOCD.md | 16 + k8s/README.md | 2 + k8s/argocd/application-dev.yaml | 24 + k8s/argocd/application-prod.yaml | 21 + k8s/argocd/application.yaml | 21 + k8s/devops-app-py/Chart.yaml | 2 +- .../templates/hooks/post-install-job.yaml | 2 +- .../templates/hooks/pre-install-job.yaml | 2 +- k8s/devops-app-py/values-dev.yaml | 6 +- k8s/devops-app-py/values-prod.yaml | 8 +- k8s/devops-app-py/values.yaml | 3 +- k8s/docs/LAB13.md | 423 ++++++++++++++++++ k8s/docs/img/lab13_application_details.png | Bin 0 -> 66700 bytes k8s/docs/img/lab13_applications_overview.png | Bin 0 -> 208862 bytes k8s/docs/img/lab13_sync_policy_difference.png | Bin 0 -> 96761 bytes 15 files changed, 520 insertions(+), 10 deletions(-) create mode 100644 k8s/ARGOCD.md create mode 100644 k8s/argocd/application-dev.yaml create mode 100644 k8s/argocd/application-prod.yaml create mode 100644 k8s/argocd/application.yaml create mode 100644 k8s/docs/LAB13.md create mode 100644 k8s/docs/img/lab13_application_details.png create mode 100644 k8s/docs/img/lab13_applications_overview.png create mode 100644 k8s/docs/img/lab13_sync_policy_difference.png diff --git a/k8s/ARGOCD.md b/k8s/ARGOCD.md new file mode 100644 index 0000000000..766c8a20cb --- /dev/null +++ b/k8s/ARGOCD.md @@ -0,0 +1,16 @@ +# ArgoCD Notes + +This file exists to satisfy the Lab 13 requirement for a dedicated ArgoCD document without flattening the Kubernetes module back into one large documentation directory. + +## Lab 13 Documentation + +The full Lab 13 write-up, GitOps manifests, ArgoCD command transcripts, sync-policy evidence, and self-healing notes are kept in [docs/LAB13.md](docs/LAB13.md). + +## Why This Structure Is Better + +- `k8s/README.md` stays short and usable as the module entry point. +- `k8s/docs/LAB09.md`, [docs/LAB10.md](docs/LAB10.md), [docs/LAB11.md](docs/LAB11.md), [docs/LAB12.md](docs/LAB12.md), and [docs/LAB13.md](docs/LAB13.md) keep each Kubernetes lab self-contained. +- Raw manifests, Helm chart files, and documentation stay separated, which makes the implementation files easier to navigate. +- `k8s/ARGOCD.md` provides the compatibility filename the lab expects while the actual report remains in the `docs/` hierarchy. + +In short, `ARGOCD.md` is the compatibility layer, and `k8s/docs/` remains the maintainable long-term structure. diff --git a/k8s/README.md b/k8s/README.md index 2ad36987ad..c3782b6982 100644 --- a/k8s/README.md +++ b/k8s/README.md @@ -14,7 +14,9 @@ The main deployment assets are: - [Helm Notes](HELM.md) - [Secrets Notes](SECRETS.md) - [ConfigMap Notes](CONFIGMAPS.md) +- [ArgoCD Notes](ARGOCD.md) - [Lab 09 - Kubernetes Basics](docs/LAB09.md) - [Lab 10 - Helm Package Manager](docs/LAB10.md) - [Lab 11 - Kubernetes Secrets and Vault](docs/LAB11.md) - [Lab 12 - ConfigMaps and Persistent Volumes](docs/LAB12.md) +- [Lab 13 - GitOps with ArgoCD](docs/LAB13.md) diff --git a/k8s/argocd/application-dev.yaml b/k8s/argocd/application-dev.yaml new file mode 100644 index 0000000000..3fce36a82a --- /dev/null +++ b/k8s/argocd/application-dev.yaml @@ -0,0 +1,24 @@ +apiVersion: argoproj.io/v1alpha1 +kind: Application +metadata: + name: devops-app-py-dev + namespace: argocd +spec: + project: default + source: + repoURL: https://github.com/LocalT0aster/DevOps-Core-S26.git + targetRevision: lab13 + path: k8s/devops-app-py + helm: + releaseName: devops-app-py-dev + valueFiles: + - values-dev.yaml + destination: + server: https://kubernetes.default.svc + namespace: dev + syncPolicy: + automated: + prune: true + selfHeal: true + syncOptions: + - CreateNamespace=true diff --git a/k8s/argocd/application-prod.yaml b/k8s/argocd/application-prod.yaml new file mode 100644 index 0000000000..8d37d1deb8 --- /dev/null +++ b/k8s/argocd/application-prod.yaml @@ -0,0 +1,21 @@ +apiVersion: argoproj.io/v1alpha1 +kind: Application +metadata: + name: devops-app-py-prod + namespace: argocd +spec: + project: default + source: + repoURL: https://github.com/LocalT0aster/DevOps-Core-S26.git + targetRevision: lab13 + path: k8s/devops-app-py + helm: + releaseName: devops-app-py-prod + valueFiles: + - values-prod.yaml + destination: + server: https://kubernetes.default.svc + namespace: prod + syncPolicy: + syncOptions: + - CreateNamespace=true diff --git a/k8s/argocd/application.yaml b/k8s/argocd/application.yaml new file mode 100644 index 0000000000..bb44a82ce9 --- /dev/null +++ b/k8s/argocd/application.yaml @@ -0,0 +1,21 @@ +apiVersion: argoproj.io/v1alpha1 +kind: Application +metadata: + name: devops-app-py + namespace: argocd +spec: + project: default + source: + repoURL: https://github.com/LocalT0aster/DevOps-Core-S26.git + targetRevision: lab13 + path: k8s/devops-app-py + helm: + releaseName: devops-app-py + valueFiles: + - values.yaml + destination: + server: https://kubernetes.default.svc + namespace: default + syncPolicy: + syncOptions: + - CreateNamespace=true diff --git a/k8s/devops-app-py/Chart.yaml b/k8s/devops-app-py/Chart.yaml index 8aec2f0141..43cfd8310f 100644 --- a/k8s/devops-app-py/Chart.yaml +++ b/k8s/devops-app-py/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: devops-app-py description: Helm chart for the DevOps Core Python application type: application -version: 0.4.0 +version: 0.5.0 appVersion: "1.12.0" keywords: - python diff --git a/k8s/devops-app-py/templates/hooks/post-install-job.yaml b/k8s/devops-app-py/templates/hooks/post-install-job.yaml index 80c10d64b2..95bacb10ea 100644 --- a/k8s/devops-app-py/templates/hooks/post-install-job.yaml +++ b/k8s/devops-app-py/templates/hooks/post-install-job.yaml @@ -15,7 +15,7 @@ spec: template: metadata: labels: - {{- include "devops-app-py.selectorLabels" . | nindent 8 }} + app.kubernetes.io/name: {{ include "devops-app-py.name" . }} app.kubernetes.io/component: hook spec: restartPolicy: Never diff --git a/k8s/devops-app-py/templates/hooks/pre-install-job.yaml b/k8s/devops-app-py/templates/hooks/pre-install-job.yaml index 5493e472b5..5a9a1ced62 100644 --- a/k8s/devops-app-py/templates/hooks/pre-install-job.yaml +++ b/k8s/devops-app-py/templates/hooks/pre-install-job.yaml @@ -15,7 +15,7 @@ spec: template: metadata: labels: - {{- include "devops-app-py.selectorLabels" . | nindent 8 }} + app.kubernetes.io/name: {{ include "devops-app-py.name" . }} app.kubernetes.io/component: hook spec: restartPolicy: Never diff --git a/k8s/devops-app-py/values-dev.yaml b/k8s/devops-app-py/values-dev.yaml index 234178c728..53b0d9f3cb 100644 --- a/k8s/devops-app-py/values-dev.yaml +++ b/k8s/devops-app-py/values-dev.yaml @@ -23,11 +23,13 @@ config: podLabels: environment: dev +podAnnotations: + lab13-sync-wave: "1" + service: - type: NodePort + type: ClusterIP port: 80 targetPort: 5000 - nodePort: 30082 resources: requests: diff --git a/k8s/devops-app-py/values-prod.yaml b/k8s/devops-app-py/values-prod.yaml index 1feebd8413..1f5fb5fb24 100644 --- a/k8s/devops-app-py/values-prod.yaml +++ b/k8s/devops-app-py/values-prod.yaml @@ -1,4 +1,4 @@ -replicaCount: 1 +replicaCount: 2 image: tag: "1.12" @@ -25,11 +25,13 @@ config: podLabels: environment: prod +podAnnotations: + lab13-sync-wave: "1" + service: - type: LoadBalancer + type: ClusterIP port: 80 targetPort: 5000 - nodePort: 30081 resources: requests: diff --git a/k8s/devops-app-py/values.yaml b/k8s/devops-app-py/values.yaml index 253a63eb46..b034f0be33 100644 --- a/k8s/devops-app-py/values.yaml +++ b/k8s/devops-app-py/values.yaml @@ -68,10 +68,9 @@ vault: templateFile: "app-config.env" service: - type: NodePort + type: ClusterIP port: 80 targetPort: 5000 - nodePort: 30082 resources: requests: diff --git a/k8s/docs/LAB13.md b/k8s/docs/LAB13.md new file mode 100644 index 0000000000..826b066154 --- /dev/null +++ b/k8s/docs/LAB13.md @@ -0,0 +1,423 @@ +# Kubernetes Lab 13 - GitOps with ArgoCD + +I reused the existing Docker-backed `minikube` profile and built Lab 13 on top of the running Lab 11/12 environment instead of resetting the cluster. ArgoCD was installed from the official Helm chart as `argo/argo-cd 9.5.0` with app version `v3.3.6`, and the GitOps source for every `Application` in this lab is `https://github.com/LocalT0aster/DevOps-Core-S26.git` on branch `lab13`. The ArgoCD UI screenshots below capture the final applications overview, an application details page, and the sync-policy comparison between `dev` and `prod`. + +## Current Cluster Context + +
+kubectl config current-context, minikube status, kubectl get nodes -o wide, helm list -A, kubectl get pods -A + +```text +$ kubectl config current-context +minikube +$ minikube status -p minikube +minikube +type: Control Plane +host: Running +kubelet: Running +apiserver: Running +kubeconfig: Configured + +$ kubectl get nodes -o wide +NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME +minikube Ready control-plane 12h v1.35.1 192.168.49.2 Debian GNU/Linux 12 (bookworm) 6.19.11-1-cachyos docker://29.2.1 + +$ helm list -A +NAME NAMESPACE REVISION STATUS CHART APP VERSION +lab11-devops-app-py default 2 deployed devops-app-py-0.3.0 1.9 +lab12-devops-app-py default 4 deployed devops-app-py-0.4.0 1.12.0 +vault vault 1 deployed vault-0.32.0 1.21.2 +``` + +
+ +## Task 1 - ArgoCD Installation and Access + +The local `argocd` CLI was already installed as `v3.3.3+unknown`, so I only needed to add the official Helm repo, pin the chart version, install ArgoCD into namespace `argocd`, and log in over a local TLS port-forward. I exposed `svc/argocd-server` on `https://127.0.0.1:8080`, confirmed the UI returned the login HTML over HTTPS, retrieved the initial admin password in redacted form, and verified CLI access with `argocd app list`. + +I also verified the browser-access path through the same TLS port-forward and captured the resulting ArgoCD UI views for the final documentation. + +
+helm repo add argo, helm search repo argo/argo-cd --versions, and Helm install + +```bash +$ helm repo add argo https://argoproj.github.io/argo-helm +"argo" has been added to your repositories +$ helm repo update +...Successfully got an update from the "argo" chart repository +$ helm search repo argo/argo-cd --versions | head -n 3 +NAME CHART VERSION APP VERSION DESCRIPTION +argo/argo-cd 9.5.0 v3.3.6 A Helm chart for Argo CD, a declarative, GitOps... + +$ helm upgrade --install argocd argo/argo-cd --namespace argocd --create-namespace --version 9.5.0 --wait --timeout 10m +NAME: argocd +NAMESPACE: argocd +STATUS: deployed + +$ kubectl get pods -n argocd +NAME READY STATUS RESTARTS AGE +argocd-application-controller-0 1/1 Running 0 30s +argocd-applicationset-controller-58c9647667-wcw95 1/1 Running 0 30s +argocd-dex-server-d68bfd4b7-9ln57 1/1 Running 0 30s +argocd-notifications-controller-58f8fcd889-9x4nq 1/1 Running 0 30s +argocd-redis-5d5bb8d56b-qjwdl 1/1 Running 0 30s +argocd-repo-server-5d5755cbb-fstsd 1/1 Running 0 30s +argocd-server-5964cdf9fb-rd62w 1/1 Running 0 30s +``` + +
+ +
+kubectl port-forward svc/argocd-server -n argocd 8080:443, argocd admin initial-password, and CLI login + +```bash +$ kubectl port-forward service/argocd-server -n argocd 8080:443 +Running in a separate terminal session for this verification step. +$ curl -kI https://127.0.0.1:8080 +HTTP/1.1 200 OK +Content-Type: text/html; charset=utf-8 + +$ argocd admin initial-password -n argocd +[REDACTED] +$ argocd login 127.0.0.1:8080 --insecure --username admin --password [REDACTED] +'admin:login' logged in successfully +Context '127.0.0.1:8080' updated +$ argocd app list +NAME CLUSTER NAMESPACE PROJECT STATUS HEALTH SYNCPOLICY CONDITIONS REPO PATH TARGET +``` + +
+ +## Task 2 - Application Deployment with Manual Sync + +I created `k8s/argocd/application.yaml` as a manual-sync `Application` pointing to `k8s/devops-app-py` on branch `lab13`, with `helm.releaseName: devops-app-py` and `valueFiles: [values.yaml]`. The chart was updated for GitOps use at the same time: chart version `0.5.0`, `service.type: ClusterIP` across default/dev/prod, and `values-prod.yaml` now uses `replicaCount: 2`. + +After applying the `Application`, I manually synced it, verified the release in `default`, and reached it through `kubectl port-forward svc/devops-app-py-service -n default 18080:80`. To test the GitOps loop, I committed and pushed a change from `values.yaml` `replicaCount: 1` to `2`; ArgoCD eventually marked the app `OutOfSync`, and a manual sync brought the Deployment to `2/2` ready replicas. Once that evidence was captured, I deleted the temporary in-cluster `devops-app-py` application and its resources so the final ArgoCD state only contains `dev` and `prod`. + +The relevant commits for Task 2 were: + +- `9cab12c feat(k8s): add argocd applications` +- `2e2fdcc chore(k8s): scale default argocd demo` + +
+kubectl apply -f k8s/argocd/application.yaml and the first manual sync + +```bash +$ kubectl apply -f k8s/argocd/application.yaml +application.argoproj.io/devops-app-py created +$ argocd app sync devops-app-py +... +2026-04-10T14:09:34+03:00 batch Job default devops-app-py-post-install Succeeded Synced PostSync Reached expected number of succeeded pods + +$ argocd app wait devops-app-py --health --sync --timeout 300 +Sync Status: Synced to lab13 (9cab12c) +Health Status: Healthy + +$ kubectl get deploy,svc,pvc,pods -n default -l app.kubernetes.io/instance=devops-app-py +NAME READY UP-TO-DATE AVAILABLE AGE +deployment.apps/devops-app-py 1/1 1 1 36s + +NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE +service/devops-app-py-service ClusterIP 10.109.114.177 80/TCP 36s + +NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE +persistentvolumeclaim/devops-app-py-data Bound pvc-9fac4c4d-8f73-4765-9bee-2430d7331618 100Mi RWO standard 36s +``` + +
+ +
+kubectl port-forward svc/devops-app-py-service -n default 18080:80 and application check + +```bash +$ curl -fsSL http://127.0.0.1:18080/ready | jq . +{ + "status": "ready", + "timestamp": "2026-04-10T11:09:49.814083+00:00", + "uptime_seconds": 22 +} +$ curl -fsSL http://127.0.0.1:18080/ | jq .service +{ + "description": "DevOps course info service", + "framework": "Flask", + "name": "devops-info-service", + "version": "1.12.0" +} +$ curl -fsSL http://127.0.0.1:18080/visits | jq . +{ + "visits": 1 +} +``` + +
+ +
+git push after changing values.yaml replicas, ArgoCD drift detection, and manual resync + +```bash +$ git push origin lab13 +To https://github.com/LocalT0aster/DevOps-Core-S26.git + 9cab12c..2e2fdcc lab13 -> lab13 + +$ while true; do date -Is; argocd app get devops-app-py -o json | jq -r "[.status.sync.status, .status.health.status, .status.sync.revision] | @tsv"; done +2026-04-10T14:10:18+03:00 Synced Healthy 9cab12c53df7e8679c7736388f4bf0e65ac01bbf +... +2026-04-10T14:14:09+03:00 OutOfSync Healthy 2e2fdccdcfb43bc659aa5c6a7d30f54c21b87d76 + +$ argocd app sync devops-app-py +$ argocd app wait devops-app-py --health --sync --timeout 300 +Sync Status: Synced to lab13 (2e2fdcc) +Health Status: Healthy + +$ kubectl get deployment devops-app-py -n default +NAME READY UP-TO-DATE AVAILABLE AGE +devops-app-py 2/2 2 2 5m40s +``` + +
+ +## Task 3 - Multi-Environment Deployment + +I created `dev` and `prod` namespaces, then added `k8s/argocd/application-dev.yaml` and `k8s/argocd/application-prod.yaml`. Both point to the same chart and branch, but `values-dev.yaml` keeps one replica and lighter resources while `values-prod.yaml` keeps two replicas and higher limits. The dev app uses `automated.prune: true` plus `selfHeal: true`, while prod stays manual. + +Both environments were deployed successfully and verified through port-forwards on `18081` and `18082`. To demonstrate the policy difference, I committed the same harmless pod annotation into both env values files. Dev auto-synced itself to revision `0bb803c`, while prod became `OutOfSync` and stayed there until I ran a manual sync. + +During that work I found a chart bug in the Helm hook jobs: the hook pod templates reused the same selector labels as the main app pods, so the service could temporarily select the post-install smoke-test pod. I fixed that in commit `8f1d087 fix(k8s): exclude hook pods from service endpoints` by removing the release-instance label from the hook pod templates, revalidated the chart, pushed the fix, and left both environments synced to `8f1d087`. + +
+kubectl apply -f k8s/argocd/application-dev.yaml, kubectl apply -f k8s/argocd/application-prod.yaml, and initial syncs + +```bash +$ kubectl create namespace dev --dry-run=client -o yaml | kubectl apply -f - +namespace/dev created +$ kubectl create namespace prod --dry-run=client -o yaml | kubectl apply -f - +namespace/prod created +$ kubectl apply -f k8s/argocd/application-dev.yaml +application.argoproj.io/devops-app-py-dev created +$ kubectl apply -f k8s/argocd/application-prod.yaml +application.argoproj.io/devops-app-py-prod created + +$ argocd app list +NAME CLUSTER NAMESPACE PROJECT STATUS HEALTH SYNCPOLICY +argocd/devops-app-py-dev https://kubernetes.default.svc dev default Auto-Prune +argocd/devops-app-py-prod https://kubernetes.default.svc prod default Manual + +$ argocd app wait devops-app-py-dev --health --sync --timeout 300 +Sync Status: Synced to lab13 (2e2fdcc) +Health Status: Healthy + +$ argocd app wait devops-app-py-prod --health --sync --timeout 300 +Sync Status: Synced to lab13 (2e2fdcc) +Health Status: Healthy + +$ kubectl get deploy,svc,pods -n dev -l app.kubernetes.io/instance=devops-app-py-dev +deployment.apps/devops-app-py-dev 1/1 +service/devops-app-py-dev-service ClusterIP +pod/devops-app-py-dev-85d85556b7-7j6c8 1/1 Running + +$ kubectl get deploy,svc,pods -n prod -l app.kubernetes.io/instance=devops-app-py-prod +deployment.apps/devops-app-py-prod 2/2 +service/devops-app-py-prod-service ClusterIP +pod/devops-app-py-prod-b8fbf58ff-7rzpc 1/1 Running +pod/devops-app-py-prod-b8fbf58ff-xfnls 1/1 Running +``` + +
+ +
+kubectl port-forward checks for dev and prod + +```bash +$ curl -fsSL http://127.0.0.1:18081/ready | jq . +{ + "status": "ready", + "timestamp": "2026-04-10T11:16:28.441384+00:00", + "uptime_seconds": 30 +} +$ curl -fsSL http://127.0.0.1:18081/ | jq .service,.system.hostname +{ + "description": "DevOps course info service", + "framework": "Flask", + "name": "devops-info-service", + "version": "1.12.0" +} +"devops-app-py-dev-85d85556b7-7j6c8" + +$ curl -fsSL http://127.0.0.1:18082/ready | jq . +{ + "status": "ready", + "timestamp": "2026-04-10T11:16:28.502495+00:00", + "uptime_seconds": 36 +} +$ curl -fsSL http://127.0.0.1:18082/ | jq .service,.system.hostname +{ + "description": "DevOps course info service", + "framework": "Flask", + "name": "devops-info-service", + "version": "1.12.0" +} +"devops-app-py-prod-b8fbf58ff-xfnls" +``` + +
+ +
+git push for the shared env-values change and dev/prod sync-policy difference + +```bash +$ git push origin lab13 +To https://github.com/LocalT0aster/DevOps-Core-S26.git + 2e2fdcc..0bb803c lab13 -> lab13 + +$ while true; do date -Is; argocd app get devops-app-py-dev -o json; argocd app get devops-app-py-prod -o json; done +2026-04-10T14:19:45+03:00 dev Synced Healthy 2e2fdccdcfb43bc659aa5c6a7d30f54c21b87d76 +2026-04-10T14:19:45+03:00 prod OutOfSync Healthy 0bb803c97b1785269b5408533f98b1222f264f6d +2026-04-10T14:20:01+03:00 dev Synced Progressing 0bb803c97b1785269b5408533f98b1222f264f6d +2026-04-10T14:20:01+03:00 prod OutOfSync Healthy 0bb803c97b1785269b5408533f98b1222f264f6d + +$ argocd app get devops-app-py-prod +Sync Policy: Manual +Sync Status: OutOfSync from lab13 (0bb803c) +Health Status: Healthy + +$ argocd app sync devops-app-py-prod +$ argocd app wait devops-app-py-prod --health --sync --timeout 300 +Sync Status: Synced to lab13 (0bb803c) +Health Status: Healthy +``` + +
+ +
+fix(k8s): exclude hook pods from service endpoints and final app state + +```bash +$ helm template devops-app-py-prod k8s/devops-app-py -f k8s/devops-app-py/values-prod.yaml | sed -n '/^# Source: devops-app-py\/templates\/hooks\/post-install-job.yaml/,/^---$/p' +apiVersion: batch/v1 +kind: Job +metadata: + name: devops-app-py-prod-post-install +... +spec: + template: + metadata: + labels: + app.kubernetes.io/name: devops-app-py + app.kubernetes.io/component: hook + +$ argocd app list +NAME CLUSTER NAMESPACE PROJECT STATUS HEALTH SYNCPOLICY +argocd/devops-app-py-dev https://kubernetes.default.svc dev default Synced Healthy Auto-Prune +argocd/devops-app-py-prod https://kubernetes.default.svc prod default Synced Healthy Manual +``` + +
+ +## Task 4 - Self-Healing and Drift Behavior + +Replica drift behaved exactly as expected for an auto-sync app: scaling the dev deployment from `1` to `5` replicas made the app `OutOfSync`, and ArgoCD pulled it back to `1` within the next few polling samples. Pod deletion was different: when I deleted the only dev pod, the Deployment/ReplicaSet controller recreated it while ArgoCD stayed `Synced`; that recovery is Kubernetes self-healing, not GitOps reconciliation. + +For config drift, I tried extra Deployment labels first because the lab suggests labels as an example. In this environment, extra labels on either the Deployment metadata or the pod template were not surfaced as `OutOfSync` even after a manual refresh, so they were not a reliable self-heal demonstration. I switched to an image-field drift instead by changing the live dev deployment image from `1.12-dev` to `1.12`; ArgoCD restored the desired image back to `1.12-dev` within 5 seconds. Afterward I manually removed the temporary label experiments and verified the dev app was back to `Synced/Healthy`. + +The official docs say the application reconciliation timeout defaults to `120s` plus up to `60s` jitter, and automated self-heal retries after `5s`. In this run, repo-driven drift detection still took several minutes to show up in ArgoCD, so I relied on the actual timestamps captured below instead of assuming the documented minimum. + +
+kubectl scale deployment devops-app-py-dev -n dev --replicas=5 and ArgoCD self-heal + +```bash +$ kubectl scale deployment devops-app-py-dev -n dev --replicas=5 +deployment.apps/devops-app-py-dev scaled +2026-04-10T14:25:10+03:00 deploy 5 1 1 +2026-04-10T14:25:10+03:00 app OutOfSync Progressing 8f1d0879c728e15141a5bf3c317282da040154da +2026-04-10T14:25:16+03:00 deploy 5 1 1 +2026-04-10T14:25:16+03:00 app OutOfSync Progressing 8f1d0879c728e15141a5bf3c317282da040154da +2026-04-10T14:25:21+03:00 deploy 1 1 1 +2026-04-10T14:25:21+03:00 app Synced Healthy 8f1d0879c728e15141a5bf3c317282da040154da +``` + +
+ +
+kubectl delete pod -n dev ... and Deployment/ReplicaSet recovery + +```bash +$ kubectl delete pod -n dev devops-app-py-dev-79d7ddf98c-zxksq +pod "devops-app-py-dev-79d7ddf98c-zxksq" deleted from dev namespace +2026-04-10T14:26:13+03:00 app Synced Progressing +2026-04-10T14:26:13+03:00 pod devops-app-py-dev-79d7ddf98c-bkc9l Running false +... +2026-04-10T14:26:31+03:00 app Synced Healthy +2026-04-10T14:26:31+03:00 pod devops-app-py-dev-79d7ddf98c-bkc9l Running true +``` + +
+ +
+kubectl set image deployment/devops-app-py-dev -n dev devops-app-py=localt0aster/devops-app-py:1.12 and image drift self-heal + +```bash +$ kubectl set image deployment/devops-app-py-dev -n dev devops-app-py=localt0aster/devops-app-py:1.12 +deployment.apps/devops-app-py-dev image updated +2026-04-10T14:33:11+03:00 image localt0aster/devops-app-py:1.12 +2026-04-10T14:33:11+03:00 app Synced Progressing 8f1d0879c728e15141a5bf3c317282da040154da +2026-04-10T14:33:16+03:00 image localt0aster/devops-app-py:1.12-dev +2026-04-10T14:33:16+03:00 app Synced Healthy 8f1d0879c728e15141a5bf3c317282da040154da +``` + +
+ +
+kubectl label ... lab13-drift-, kubectl patch ... /spec/template/metadata/labels/lab13-template-drift, and final cleanup + +```bash +$ kubectl label deployment devops-app-py-dev -n dev lab13-drift- +deployment.apps/devops-app-py-dev unlabeled +$ kubectl patch deployment devops-app-py-dev -n dev --type json -p '[{"op":"remove","path":"/spec/template/metadata/labels/lab13-template-drift"}]' +deployment.apps/devops-app-py-dev patched +$ kubectl rollout status deployment/devops-app-py-dev -n dev --timeout=300s +deployment "devops-app-py-dev" successfully rolled out +$ argocd app wait devops-app-py-dev --health --sync --timeout 300 +Sync Status: Synced to lab13 (8f1d087) +Health Status: Healthy +``` + +
+ +## Screenshots + +ArgoCD applications overview: + +![](img/lab13_applications_overview.png) + +Application details view: + +![](img/lab13_application_details.png) + +Dev auto-sync vs prod manual sync: + +![](img/lab13_sync_policy_difference.png) + +## Final State + +
+argocd app list and final dev/prod resources + +```text +$ argocd app list +NAME CLUSTER NAMESPACE PROJECT STATUS HEALTH SYNCPOLICY +argocd/devops-app-py-dev https://kubernetes.default.svc dev default Synced Healthy Auto-Prune +argocd/devops-app-py-prod https://kubernetes.default.svc prod default Synced Healthy Manual + +$ kubectl get deploy,svc,pods -n dev +deployment.apps/devops-app-py-dev 1/1 +service/devops-app-py-dev-service ClusterIP +pod/devops-app-py-dev-79d7ddf98c-4fsgw 1/1 Running + +$ kubectl get deploy,svc,pods -n prod +deployment.apps/devops-app-py-prod 2/2 +service/devops-app-py-prod-service ClusterIP +pod/devops-app-py-prod-764c4cdb7f-fqbqc 1/1 Running +pod/devops-app-py-prod-764c4cdb7f-qf2n5 1/1 Running +``` + +
diff --git a/k8s/docs/img/lab13_application_details.png b/k8s/docs/img/lab13_application_details.png new file mode 100644 index 0000000000000000000000000000000000000000..db25bfc8f5083848b3e37d583dfb39eee849f0fe GIT binary patch literal 66700 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 z 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

XKBY&9uY-pcv>1bQzj|wORW>lDN*XAWSwUEVq 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

dQ za;lFX9=!W_s-fJRriKH*HU(SxQ%>ZvSgRAp1Jk!IuY{`3#_e$wux5gd?NW~40F_d9 z58OVNCjU(P0DdFp{Zk>WexDgj0SmTAdbUR@<#(>&07^fL-c{yG#TunPxKrN(YfFT- z=3*um-j-Fp_~@0Wf-tni+FJHe2av)12rJ4kfnOeOwk`&ef^!|c>%OYlK z;Yo%_(n4rb|FRQG*=6}LBd-y zV4jJG_oPt2Eq24Y_+olQ@$-b;X*bCt{=Bk`vg8^yMYwW6#e&Km7|!oH|J-+_lVxk- z9$YH;wNw?2SMKmrbj?XhOiT<{vK(}71mBX?x=a}*46j;W+l>J2uRkuHS$(x-qyEWr z^J91NyGWgjs>Dr`PUc><(-cPRRX1^Si(s~3Q#4NE(hA-MK^G9_SPyP(($p{~_FWpd zSnIA|{`0AF@SS?X7oXm~=-A@-#32FtW@%a|&_cSY?S84!vBh{#wx&DZ9{z2UCG2^X z+vnverho{^)I8w9bNkshfo6W!#LA7#C0(xjH%vx{y#aQkm$9dvUWmT>HRy)p-w?R? zu{gFlr|3CdPNIXLwz5yaM%AgQXlPh%mk%YD-pqAJ*QDP3(18R#gI&&$!M7pRg2D8H z9_NhBA;eVpb<=k*l3TMr{DevF#AsOh#8kEMdk#&RO3b%L;+|7@&pL6(BdL(bv zjSsS=c2S`bQqg(2WL{1(zV3F8{7wVW%qaIko-q!~M&~q{)UK5VLEv~)+8?z{2Q_Mli zZ|am*hU_dH92kd|e^qO$|6TN3ehjneD;HURbc8b|uMwK0x;1#q>AMyYUi;Y8G~IS- zr@9mC_{>i|{2%g<5It!O2zBjiKh?r}wn-wLS^(IY_(sKvc8J6?eiwU11c zP8DF#w_$1WlZe1ihszohbZaR2Y_TiF{CY`6Gb3gB`XrRbOvbZ)k(lAI@CQBgRO8Ke zew>$U6>6r+IXiZJOpCwYma9d(!#@oBW#5#nf~`A4O{u9Zu_omFJN+QPG<q~dVDtF%YBDv^xT62lf7)AzmcJR9*+YiyPeBRgMaF%ioTILw0!$KZjO) z*ziD-uyo?nh^x7}h9%@`d@JR)r=wwgSBtzyO1pAScnU6`nNbVbD~3kvSc(2e(+$TE4 zmx*dYlnh78*kV_s0loE7AkEpEEgwGCy+zYjWf1;8G7WVRmPg?8xNP|FU4QC_qZ>qT z`&f`j9Zoh|Oe7%&VUZ&vaG3YHNPmsEng)NcZ!p^inkliXKP8j#m#JD z`#)8mxI#LQV7d{n2u}r0DSEBM8ZE^jl}?MC8l@b)2o^VPXbpkgM7mmcx_+wSMk%Y@ z$GzDf8wro$kt`N5=|8fiZWB1%R}&C)&gFx7_r(#9P>rA2q!JV|E;e;4lURYQJr*yD zB=}^IEVG+@Nz?Qo6;7$&luqfiG<1_@CeIm{hLnrD=>{`#otgdUzf98DSY+xNir&;q z=*NXd6IFRUt$2;h`YHrEys8(u&)ZJlh`OTb5`o%Zn~I59euaC9-)WikB?Y-1w4M>2 zZPIa1rj|t`A?0}ilP;tyhoK4tu=^GiXY1)CRsux76_$)k`=H4i7yfpJY)8whP zg4E}cmAYBaFRK_g5&%rC;x;vx8o#gC-+gOQJFM0Y8JRZ#b#+y@>$vyDOq(Wy)nns+ps=X*d{pk*@o@(GKh`Cs z>nY$Rd1r@NR=}iw!Yp66+pj<0q^oqVjjcBFq`#jXQ9xY$&t|$iQI0?`Fm_?!Qk>bU ziVy!$7mI23D=sTa9PIFpr#i)#wcI_B+Mr-)MD?4?t~QCx_tbojF9(1Iu^)?G0BzeS z_W(&1*#_UUq(5G{>Yqsj6b zhRnfq0D8YrcNTW$h|JZE4S>G3QJ!#xSRpHq1ki!GxUR1wk(Ru;eGCns|GPf= zuXujml1T(lO#YdmlL|fj7P~XOSyJM@GJStxD64!aJLj}6m?x?KZ?S=~HnA6he&1gW zBr_wUj3w;IPo~coG8tM^-Kjwrc~I0i#@1pXS_xlS3%0DRc$f4q@FxjLanva#;PW}X{#Sz*e>}0C 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 literal 0 HcmV?d00001 From 2632cf632277c581a69ae805081e64213b0e78ce Mon Sep 17 00:00:00 2001 From: LocalT0aster Dan <90502400+LocalT0aster@users.noreply.github.com> Date: Wed, 29 Apr 2026 18:59:17 +0300 Subject: [PATCH 14/21] Lab14 Complete (#14) Complete Lab 14 Argo Rollouts --- k8s/README.md | 3 + k8s/ROLLOUTS.md | 16 + k8s/devops-app-py/Chart.yaml | 2 +- k8s/devops-app-py/templates/_helpers.tpl | 104 +++++ .../templates/analysis-template.yaml | 24 ++ k8s/devops-app-py/templates/deployment.yaml | 87 +---- k8s/devops-app-py/templates/rollout.yaml | 43 ++ .../templates/service-preview.yaml | 18 + .../values-rollout-analysis.yaml | 39 ++ .../values-rollout-bluegreen.yaml | 26 ++ k8s/devops-app-py/values-rollout-canary.yaml | 33 ++ k8s/devops-app-py/values.yaml | 27 ++ k8s/docs/LAB14.md | 366 ++++++++++++++++++ .../img/lab14_bluegreen_preview_active.png | Bin 0 -> 82127 bytes k8s/docs/img/lab14_bonus_analysis_failure.png | Bin 0 -> 126132 bytes k8s/docs/img/lab14_canary_abort_rollback.png | Bin 0 -> 58987 bytes k8s/docs/img/lab14_canary_manual_pause.png | Bin 0 -> 51458 bytes .../img/lab14_rollouts_dashboard_overview.png | Bin 0 -> 116022 bytes 18 files changed, 703 insertions(+), 85 deletions(-) create mode 100644 k8s/ROLLOUTS.md create mode 100644 k8s/devops-app-py/templates/analysis-template.yaml create mode 100644 k8s/devops-app-py/templates/rollout.yaml create mode 100644 k8s/devops-app-py/templates/service-preview.yaml create mode 100644 k8s/devops-app-py/values-rollout-analysis.yaml create mode 100644 k8s/devops-app-py/values-rollout-bluegreen.yaml create mode 100644 k8s/devops-app-py/values-rollout-canary.yaml create mode 100644 k8s/docs/LAB14.md create mode 100644 k8s/docs/img/lab14_bluegreen_preview_active.png create mode 100644 k8s/docs/img/lab14_bonus_analysis_failure.png create mode 100644 k8s/docs/img/lab14_canary_abort_rollback.png create mode 100644 k8s/docs/img/lab14_canary_manual_pause.png create mode 100644 k8s/docs/img/lab14_rollouts_dashboard_overview.png diff --git a/k8s/README.md b/k8s/README.md index c3782b6982..b96b36bb0e 100644 --- a/k8s/README.md +++ b/k8s/README.md @@ -7,6 +7,7 @@ The main deployment assets are: - `deployment.yml`: baseline Kubernetes `Deployment` manifest for the Python app. - `service.yml`: baseline Kubernetes `Service` manifest exposing the app inside the cluster and via `NodePort`. - `devops-app-py/`: Helm chart version of the application deployment. +- `ROLLOUTS.md`: compatibility entry point for the Lab 14 Argo Rollouts report. - `docs/`: lab documentation split by assignment. ## Documentation @@ -15,8 +16,10 @@ The main deployment assets are: - [Secrets Notes](SECRETS.md) - [ConfigMap Notes](CONFIGMAPS.md) - [ArgoCD Notes](ARGOCD.md) +- [Argo Rollouts Notes](ROLLOUTS.md) - [Lab 09 - Kubernetes Basics](docs/LAB09.md) - [Lab 10 - Helm Package Manager](docs/LAB10.md) - [Lab 11 - Kubernetes Secrets and Vault](docs/LAB11.md) - [Lab 12 - ConfigMaps and Persistent Volumes](docs/LAB12.md) - [Lab 13 - GitOps with ArgoCD](docs/LAB13.md) +- [Lab 14 - Progressive Delivery with Argo Rollouts](docs/LAB14.md) diff --git a/k8s/ROLLOUTS.md b/k8s/ROLLOUTS.md new file mode 100644 index 0000000000..46b67599b8 --- /dev/null +++ b/k8s/ROLLOUTS.md @@ -0,0 +1,16 @@ +# Argo Rollouts Notes + +This file exists to satisfy the Lab 14 requirement for a dedicated Argo Rollouts document without flattening the Kubernetes module back into one large documentation directory. + +## Lab 14 Documentation + +The full Lab 14 write-up, Rollout-enabled Helm chart changes, canary and blue-green values files, automated analysis notes, command transcripts, and screenshot references are kept in [docs/LAB14.md](docs/LAB14.md). + +## Why This Structure Is Better + +- `k8s/README.md` stays short and useful as the Kubernetes module entry point. +- `k8s/docs/LAB09.md`, [docs/LAB10.md](docs/LAB10.md), [docs/LAB11.md](docs/LAB11.md), [docs/LAB12.md](docs/LAB12.md), [docs/LAB13.md](docs/LAB13.md), and [docs/LAB14.md](docs/LAB14.md) keep each Kubernetes lab self-contained. +- Raw manifests, Helm chart files, ArgoCD applications, Rollout values, and documentation stay separated. +- `k8s/ROLLOUTS.md` provides the compatibility filename the lab expects while the actual report remains in the `docs/` hierarchy. + +In short, `ROLLOUTS.md` is the compatibility layer, and `k8s/docs/` remains the maintainable long-term structure. diff --git a/k8s/devops-app-py/Chart.yaml b/k8s/devops-app-py/Chart.yaml index 43cfd8310f..37efb207e0 100644 --- a/k8s/devops-app-py/Chart.yaml +++ b/k8s/devops-app-py/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: devops-app-py description: Helm chart for the DevOps Core Python application type: application -version: 0.5.0 +version: 0.6.0 appVersion: "1.12.0" keywords: - python diff --git a/k8s/devops-app-py/templates/_helpers.tpl b/k8s/devops-app-py/templates/_helpers.tpl index c86a8d9ab9..f593068be3 100644 --- a/k8s/devops-app-py/templates/_helpers.tpl +++ b/k8s/devops-app-py/templates/_helpers.tpl @@ -58,6 +58,20 @@ Create the service name. {{- printf "%s-service" (include "devops-app-py.fullname" .) | trunc 63 | trimSuffix "-" }} {{- end }} +{{/* +Create the blue-green preview service name. +*/}} +{{- define "devops-app-py.previewServiceName" -}} +{{- default (printf "%s-preview" (include "devops-app-py.serviceName" .)) .Values.rollout.blueGreen.previewService.name | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create the AnalysisTemplate name. +*/}} +{{- define "devops-app-py.analysisTemplateName" -}} +{{- default (printf "%s-health-check" (include "devops-app-py.fullname" .)) .Values.rollout.analysis.templateName | trunc 63 | trimSuffix "-" }} +{{- end }} + {{/* Create the secret name. */}} @@ -97,6 +111,96 @@ Create the service account name. {{- end }} {{- end }} +{{/* +Render the workload pod template shared by Deployments and Rollouts. +*/}} +{{- define "devops-app-py.podTemplate" -}} +{{- $envVars := include "devops-app-py.envVars" . | trim }} +{{- $vaultAnnotations := include "devops-app-py.vaultAnnotations" . | trim }} +{{- $configChecksums := include "devops-app-py.configChecksums" . | trim }} +metadata: + {{- if or $vaultAnnotations $configChecksums .Values.podAnnotations }} + annotations: + {{- if $vaultAnnotations }} + {{- $vaultAnnotations | nindent 4 }} + {{- end }} + {{- if $configChecksums }} + {{- $configChecksums | nindent 4 }} + {{- end }} + {{- with .Values.podAnnotations }} + {{- toYaml . | nindent 4 }} + {{- end }} + {{- end }} + labels: + {{- include "devops-app-py.selectorLabels" . | nindent 4 }} + app.kubernetes.io/part-of: {{ .Values.partOf }} + {{- with .Values.podLabels }} + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + serviceAccountName: {{ include "devops-app-py.serviceAccountName" . }} + containers: + - name: {{ include "devops-app-py.name" . }} + image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" + imagePullPolicy: {{ .Values.image.pullPolicy }} + ports: + - name: http + containerPort: {{ .Values.containerPort }} + protocol: TCP + {{- if or .Values.config.file.enabled .Values.persistence.enabled }} + volumeMounts: + {{- if .Values.config.file.enabled }} + - name: config-volume + mountPath: {{ .Values.config.mountPath | quote }} + readOnly: true + {{- end }} + {{- if .Values.persistence.enabled }} + - name: data-volume + mountPath: {{ .Values.persistence.mountPath | quote }} + {{- end }} + {{- end }} + {{- if or .Values.config.env.enabled .Values.secrets.enabled }} + envFrom: + {{- if .Values.config.env.enabled }} + - configMapRef: + name: {{ include "devops-app-py.envConfigMapName" . }} + {{- end }} + {{- if .Values.secrets.enabled }} + - secretRef: + name: {{ include "devops-app-py.secretName" . }} + {{- end }} + {{- end }} + {{- if $envVars }} + env: + {{- $envVars | nindent 8 }} + {{- end }} + {{- with .Values.livenessProbe }} + livenessProbe: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.readinessProbe }} + readinessProbe: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.resources }} + resources: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- if or .Values.config.file.enabled .Values.persistence.enabled }} + volumes: + {{- if .Values.config.file.enabled }} + - name: config-volume + configMap: + name: {{ include "devops-app-py.fileConfigMapName" . }} + {{- end }} + {{- if .Values.persistence.enabled }} + - name: data-volume + persistentVolumeClaim: + claimName: {{ include "devops-app-py.pvcName" . }} + {{- end }} + {{- end }} +{{- end }} + {{/* Render non-secret environment variables. */}} diff --git a/k8s/devops-app-py/templates/analysis-template.yaml b/k8s/devops-app-py/templates/analysis-template.yaml new file mode 100644 index 0000000000..15b7cc96b9 --- /dev/null +++ b/k8s/devops-app-py/templates/analysis-template.yaml @@ -0,0 +1,24 @@ +{{- if and .Values.rollout.enabled .Values.rollout.analysis.enabled }} +{{- $serviceName := include "devops-app-py.serviceName" . }} +{{- $path := .Values.rollout.analysis.path | default "/health" }} +{{- $url := .Values.rollout.analysis.url | default (printf "http://%s.%s.svc:%v%s" $serviceName .Release.Namespace .Values.service.port $path) }} +{{- $successCondition := .Values.rollout.analysis.successCondition | default (printf "result == \"%s\"" .Values.rollout.analysis.expectedStatus) }} +apiVersion: argoproj.io/v1alpha1 +kind: AnalysisTemplate +metadata: + name: {{ include "devops-app-py.analysisTemplateName" . }} + labels: + {{- include "devops-app-py.labels" . | nindent 4 }} +spec: + metrics: + - name: {{ .Values.rollout.analysis.metricName }} + interval: {{ .Values.rollout.analysis.interval | quote }} + count: {{ .Values.rollout.analysis.count }} + failureLimit: {{ .Values.rollout.analysis.failureLimit }} + successCondition: {{ $successCondition | quote }} + provider: + web: + url: {{ $url | quote }} + timeoutSeconds: {{ .Values.rollout.analysis.timeoutSeconds }} + jsonPath: {{ .Values.rollout.analysis.jsonPath | quote }} +{{- end }} diff --git a/k8s/devops-app-py/templates/deployment.yaml b/k8s/devops-app-py/templates/deployment.yaml index d099e3a42c..58689bb8c7 100644 --- a/k8s/devops-app-py/templates/deployment.yaml +++ b/k8s/devops-app-py/templates/deployment.yaml @@ -1,8 +1,6 @@ +{{- if not .Values.rollout.enabled }} apiVersion: apps/v1 kind: Deployment -{{- $envVars := include "devops-app-py.envVars" . | trim }} -{{- $vaultAnnotations := include "devops-app-py.vaultAnnotations" . | trim }} -{{- $configChecksums := include "devops-app-py.configChecksums" . | trim }} metadata: name: {{ include "devops-app-py.fullname" . }} labels: @@ -19,84 +17,5 @@ spec: matchLabels: {{- include "devops-app-py.selectorLabels" . | nindent 6 }} template: - metadata: - {{- if or $vaultAnnotations $configChecksums .Values.podAnnotations }} - annotations: - {{- if $vaultAnnotations }} - {{- $vaultAnnotations | nindent 8 }} - {{- end }} - {{- if $configChecksums }} - {{- $configChecksums | nindent 8 }} - {{- end }} - {{- with .Values.podAnnotations }} - {{- toYaml . | nindent 8 }} - {{- end }} - {{- end }} - labels: - {{- include "devops-app-py.selectorLabels" . | nindent 8 }} - app.kubernetes.io/part-of: {{ .Values.partOf }} - {{- with .Values.podLabels }} - {{- toYaml . | nindent 8 }} - {{- end }} - spec: - serviceAccountName: {{ include "devops-app-py.serviceAccountName" . }} - containers: - - name: {{ include "devops-app-py.name" . }} - image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" - imagePullPolicy: {{ .Values.image.pullPolicy }} - ports: - - name: http - containerPort: {{ .Values.containerPort }} - protocol: TCP - {{- if or .Values.config.file.enabled .Values.persistence.enabled }} - volumeMounts: - {{- if .Values.config.file.enabled }} - - name: config-volume - mountPath: {{ .Values.config.mountPath | quote }} - readOnly: true - {{- end }} - {{- if .Values.persistence.enabled }} - - name: data-volume - mountPath: {{ .Values.persistence.mountPath | quote }} - {{- end }} - {{- end }} - {{- if or .Values.config.env.enabled .Values.secrets.enabled }} - envFrom: - {{- if .Values.config.env.enabled }} - - configMapRef: - name: {{ include "devops-app-py.envConfigMapName" . }} - {{- end }} - {{- if .Values.secrets.enabled }} - - secretRef: - name: {{ include "devops-app-py.secretName" . }} - {{- end }} - {{- end }} - {{- if $envVars }} - env: - {{- $envVars | nindent 12 }} - {{- end }} - {{- with .Values.livenessProbe }} - livenessProbe: - {{- toYaml . | nindent 12 }} - {{- end }} - {{- with .Values.readinessProbe }} - readinessProbe: - {{- toYaml . | nindent 12 }} - {{- end }} - {{- with .Values.resources }} - resources: - {{- toYaml . | nindent 12 }} - {{- end }} - {{- if or .Values.config.file.enabled .Values.persistence.enabled }} - volumes: - {{- if .Values.config.file.enabled }} - - name: config-volume - configMap: - name: {{ include "devops-app-py.fileConfigMapName" . }} - {{- end }} - {{- if .Values.persistence.enabled }} - - name: data-volume - persistentVolumeClaim: - claimName: {{ include "devops-app-py.pvcName" . }} - {{- end }} - {{- end }} + {{- include "devops-app-py.podTemplate" . | nindent 4 }} +{{- end }} diff --git a/k8s/devops-app-py/templates/rollout.yaml b/k8s/devops-app-py/templates/rollout.yaml new file mode 100644 index 0000000000..0449fe5711 --- /dev/null +++ b/k8s/devops-app-py/templates/rollout.yaml @@ -0,0 +1,43 @@ +{{- if .Values.rollout.enabled }} +apiVersion: argoproj.io/v1alpha1 +kind: Rollout +metadata: + name: {{ include "devops-app-py.fullname" . }} + labels: + {{- include "devops-app-py.labels" . | nindent 4 }} +spec: + replicas: {{ .Values.replicaCount }} + revisionHistoryLimit: {{ .Values.deployment.revisionHistoryLimit }} + selector: + matchLabels: + {{- include "devops-app-py.selectorLabels" . | nindent 6 }} + strategy: + {{- if eq .Values.rollout.strategy "blueGreen" }} + blueGreen: + activeService: {{ default (include "devops-app-py.serviceName" .) .Values.rollout.blueGreen.activeService }} + {{- if .Values.rollout.blueGreen.previewService.enabled }} + previewService: {{ include "devops-app-py.previewServiceName" . }} + {{- end }} + autoPromotionEnabled: {{ .Values.rollout.blueGreen.autoPromotionEnabled }} + scaleDownDelaySeconds: {{ .Values.rollout.blueGreen.scaleDownDelaySeconds }} + {{- if .Values.rollout.analysis.enabled }} + prePromotionAnalysis: + templates: + - templateName: {{ include "devops-app-py.analysisTemplateName" . }} + {{- end }} + {{- else }} + canary: + {{- with .Values.rollout.canary.steps }} + steps: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- if .Values.rollout.analysis.enabled }} + analysis: + startingStep: {{ .Values.rollout.analysis.startingStep }} + templates: + - templateName: {{ include "devops-app-py.analysisTemplateName" . }} + {{- end }} + {{- end }} + template: + {{- include "devops-app-py.podTemplate" . | nindent 4 }} +{{- end }} diff --git a/k8s/devops-app-py/templates/service-preview.yaml b/k8s/devops-app-py/templates/service-preview.yaml new file mode 100644 index 0000000000..6759149c0b --- /dev/null +++ b/k8s/devops-app-py/templates/service-preview.yaml @@ -0,0 +1,18 @@ +{{- if and .Values.rollout.enabled (eq .Values.rollout.strategy "blueGreen") .Values.rollout.blueGreen.previewService.enabled }} +apiVersion: v1 +kind: Service +metadata: + name: {{ include "devops-app-py.previewServiceName" . }} + labels: + {{- include "devops-app-py.labels" . | nindent 4 }} + app.kubernetes.io/component: preview +spec: + type: {{ .Values.service.type }} + ports: + - name: http + protocol: TCP + port: {{ .Values.service.port }} + targetPort: {{ .Values.service.targetPort }} + selector: + {{- include "devops-app-py.selectorLabels" . | nindent 4 }} +{{- end }} diff --git a/k8s/devops-app-py/values-rollout-analysis.yaml b/k8s/devops-app-py/values-rollout-analysis.yaml new file mode 100644 index 0000000000..f9818ac99d --- /dev/null +++ b/k8s/devops-app-py/values-rollout-analysis.yaml @@ -0,0 +1,39 @@ +replicaCount: 5 + +image: + tag: "1.12" + +deployment: + revisionHistoryLimit: 5 + +podAnnotations: + lab14-version: "analysis-v1" + +rollout: + enabled: true + strategy: canary + canary: + steps: + - setWeight: 20 + - pause: + duration: 15s + - setWeight: 60 + - pause: + duration: 15s + - setWeight: 100 + analysis: + enabled: true + metricName: health-check + startingStep: 1 + interval: 5s + count: 1 + failureLimit: 0 + path: /health + jsonPath: "{$.status}" + expectedStatus: healthy + timeoutSeconds: 5 + +service: + type: ClusterIP + port: 80 + targetPort: 5000 diff --git a/k8s/devops-app-py/values-rollout-bluegreen.yaml b/k8s/devops-app-py/values-rollout-bluegreen.yaml new file mode 100644 index 0000000000..1e003eab4d --- /dev/null +++ b/k8s/devops-app-py/values-rollout-bluegreen.yaml @@ -0,0 +1,26 @@ +replicaCount: 3 + +image: + tag: "1.12" + +deployment: + revisionHistoryLimit: 5 + +podAnnotations: + lab14-version: "green-v1" + +rollout: + enabled: true + strategy: blueGreen + blueGreen: + activeService: "" + previewService: + enabled: true + name: "" + autoPromotionEnabled: false + scaleDownDelaySeconds: 30 + +service: + type: ClusterIP + port: 80 + targetPort: 5000 diff --git a/k8s/devops-app-py/values-rollout-canary.yaml b/k8s/devops-app-py/values-rollout-canary.yaml new file mode 100644 index 0000000000..39875d3f50 --- /dev/null +++ b/k8s/devops-app-py/values-rollout-canary.yaml @@ -0,0 +1,33 @@ +replicaCount: 5 + +image: + tag: "1.12" + +deployment: + revisionHistoryLimit: 5 + +podAnnotations: + lab14-version: "canary-v1" + +rollout: + enabled: true + strategy: canary + canary: + steps: + - setWeight: 20 + - pause: {} + - setWeight: 40 + - pause: + duration: 30s + - setWeight: 60 + - pause: + duration: 30s + - setWeight: 80 + - pause: + duration: 30s + - setWeight: 100 + +service: + type: ClusterIP + port: 80 + targetPort: 5000 diff --git a/k8s/devops-app-py/values.yaml b/k8s/devops-app-py/values.yaml index b034f0be33..368afe6405 100644 --- a/k8s/devops-app-py/values.yaml +++ b/k8s/devops-app-py/values.yaml @@ -20,6 +20,33 @@ deployment: maxSurge: 1 maxUnavailable: 0 +rollout: + enabled: false + strategy: canary + canary: + steps: [] + blueGreen: + activeService: "" + previewService: + enabled: false + name: "" + autoPromotionEnabled: false + scaleDownDelaySeconds: 30 + analysis: + enabled: false + templateName: "" + metricName: health-check + startingStep: 1 + interval: 10s + count: 1 + failureLimit: 0 + path: /health + jsonPath: "{$.status}" + expectedStatus: healthy + successCondition: "" + url: "" + timeoutSeconds: 5 + env: - name: HOST value: "0.0.0.0" diff --git a/k8s/docs/LAB14.md b/k8s/docs/LAB14.md new file mode 100644 index 0000000000..00da88dcc2 --- /dev/null +++ b/k8s/docs/LAB14.md @@ -0,0 +1,366 @@ +# Kubernetes Lab 14 - Progressive Delivery with Argo Rollouts + +Lab 14 adds progressive delivery to the existing Helm chart without changing the Lab 13 ArgoCD applications. I kept the GitOps `dev` and `prod` applications on normal Kubernetes `Deployment` resources and added an opt-in Rollout mode to the chart. The lab demos use direct Helm releases in a separate `lab14` namespace so manual canary pauses, aborts, blue-green promotions, and failed analysis runs do not fight ArgoCD reconciliation. + +The chart now supports three workload modes: + +- Default mode: renders the original `apps/v1 Deployment` when `rollout.enabled=false`. +- Canary mode: renders an Argo `Rollout` with weighted steps and pauses. +- Blue-green mode: renders an Argo `Rollout` plus a preview `Service`. +- Bonus analysis mode: renders an `AnalysisTemplate` and attaches it to the canary strategy. + +The Rollouts controller and dashboard manifests are pinned to `v1.8.3`. I deliberately did not use `latest` URLs or release candidates because this lab should be reproducible. On this machine, Helm is `v4.1.4`; after Argo Rollouts or the Rollouts plugin mutates controller-owned fields, follow-up Helm upgrades use `--server-side=false` to avoid server-side-apply ownership conflicts. + +The local Rollouts CLI is installed from Nix instead of a manually downloaded `/tmp/lab14/bin` binary. On current nixpkgs, direct `nix run nixpkgs#argo-rollouts` is not usable because the package exposes `kubectl-argo-rollouts` and `rollouts-controller`, while `nix run` looks for `bin/argo-rollouts`. + +## Chart Changes + +The Helm chart was bumped to `0.6.0` and remains backward compatible with Labs 10-13. The pod template is now shared by Deployment and Rollout resources through the `devops-app-py.podTemplate` helper, which keeps probes, environment variables, Vault annotations, config checksum annotations, PVC mounts, and resource limits consistent. + +New chart files: + +- `templates/rollout.yaml`: renders the Argo Rollouts `Rollout` resource when `rollout.enabled=true`. +- `templates/analysis-template.yaml`: renders a web-provider `AnalysisTemplate` when automated analysis is enabled. +- `templates/service-preview.yaml`: renders the blue-green preview service. +- `values-rollout-canary.yaml`: reproducible canary demo values. +- `values-rollout-bluegreen.yaml`: reproducible blue-green demo values. +- `values-rollout-analysis.yaml`: reproducible bonus analysis demo values. + +The default `values.yaml` keeps `rollout.enabled: false`, so existing ArgoCD applications still render a `Deployment`. + +## Setup + +The intended install path is: + +```bash +kubectl create namespace argo-rollouts --dry-run=client -o yaml | kubectl apply -f - +kubectl apply -n argo-rollouts -f https://github.com/argoproj/argo-rollouts/releases/download/v1.8.3/install.yaml +kubectl apply -n argo-rollouts -f https://github.com/argoproj/argo-rollouts/releases/download/v1.8.3/dashboard-install.yaml + +nix profile install --impure nixpkgs#argo-rollouts + +kubectl argo rollouts version +kubectl get pods -n argo-rollouts +kubectl port-forward svc/argo-rollouts-dashboard -n argo-rollouts 3100:3100 +``` + +The dashboard is then available at `127.0.0.1:3100`. + +On April 29, 2026 the saved Docker-backed `minikube` profile was not recoverable by restart: Docker no longer had the `minikube` container, and two `minikube start -p minikube --driver=docker` attempts failed with `K8S_APISERVER_MISSING`. I deleted and recreated that broken profile only after those repair attempts failed. The repository Lab 13 ArgoCD files were left untouched, but the previous live in-cluster Lab 13 state did not survive the local profile recreation. + +The recreated cluster and Rollouts install were healthy: + +```text +$ minikube status -p minikube +minikube +type: Control Plane +host: Running +kubelet: Running +apiserver: Running +kubeconfig: Configured + +$ kubectl get pods -n argo-rollouts +NAME READY STATUS RESTARTS +argo-rollouts-7858b65d86-xrddz 1/1 Running 0 +argo-rollouts-dashboard-7d89499989-t7sx6 1/1 Running 0 + +$ command -v kubectl-argo-rollouts +/home/t0ast/.nix-profile/bin/kubectl-argo-rollouts + +$ kubectl argo rollouts version +kubectl-argo-rollouts: v99.99.99+unknown + BuildDate: 1970-01-01T00:00:00Z + GitCommit: + GitTreeState: + GoVersion: go1.26.2 + Compiler: gc + Platform: linux/amd64 +``` + +## Rollout vs Deployment + +A Rollout keeps the familiar Deployment shape: `replicas`, `selector`, and `template` still describe the desired pods. The meaningful difference is the strategy controller. A Deployment only supports Kubernetes rolling update or recreate behavior. A Rollout adds canary and blue-green strategies, manual gates, abort/retry/undo commands, service selector management, optional traffic routing integrations, and analysis-driven promotion or rollback. + +I used Rollouts only where the lab needs those progressive delivery controls. The normal chart path still uses Deployment because simple environments do not need the extra controller dependency. + +## Canary Deployment + +The canary release uses five replicas so the no-service-mesh weights map cleanly to pods: + +```yaml +rollout: + enabled: true + strategy: canary + canary: + steps: + - setWeight: 20 + - pause: {} + - setWeight: 40 + - pause: + duration: 30s + - setWeight: 60 + - pause: + duration: 30s + - setWeight: 80 + - pause: + duration: 30s + - setWeight: 100 +``` + +Without Istio, NGINX, ALB, or another traffic router, `setWeight` does not produce exact L7 traffic splitting. Argo Rollouts approximates the requested weight by scaling the stable and canary ReplicaSets behind the same Kubernetes Service. With `replicaCount: 5`, the lab's `20/40/60/80` steps map to `1/2/3/4` canary pods, which makes the behavior easy to inspect in the dashboard. + +Canary install and manual gate: + +```bash +kubectl create namespace lab14 --dry-run=client -o yaml | kubectl apply -f - +helm upgrade --install lab14-canary k8s/devops-app-py \ + -n lab14 \ + -f k8s/devops-app-py/values-rollout-canary.yaml + +cat >/tmp/lab14/canary-v2.values.yaml <<'YAML' +podAnnotations: + lab14-version: canary-v2 +YAML + +helm upgrade lab14-canary k8s/devops-app-py \ + -n lab14 \ + -f k8s/devops-app-py/values-rollout-canary.yaml \ + -f /tmp/lab14/canary-v2.values.yaml + +kubectl argo rollouts get rollout lab14-canary-devops-app-py -n lab14 +kubectl argo rollouts promote lab14-canary-devops-app-py -n lab14 +``` + +Abort and rollback demonstration: + +```bash +cat >/tmp/lab14/canary-v3.values.yaml <<'YAML' +podAnnotations: + lab14-version: canary-v3 +YAML + +helm upgrade lab14-canary k8s/devops-app-py \ + -n lab14 \ + -f k8s/devops-app-py/values-rollout-canary.yaml \ + -f /tmp/lab14/canary-v3.values.yaml + +kubectl argo rollouts abort lab14-canary-devops-app-py -n lab14 +kubectl argo rollouts undo lab14-canary-devops-app-py -n lab14 +kubectl argo rollouts status lab14-canary-devops-app-py -n lab14 +``` + +## Blue-Green Deployment + +The blue-green release uses the existing chart service as the active service and adds a preview service: + +```yaml +rollout: + enabled: true + strategy: blueGreen + blueGreen: + activeService: "" + previewService: + enabled: true + name: "" + autoPromotionEnabled: false + scaleDownDelaySeconds: 30 +``` + +An empty `activeService` resolves to the chart's normal service name, for example `lab14-bluegreen-devops-app-py-service`. The preview service resolves to `lab14-bluegreen-devops-app-py-service-preview`. Argo Rollouts mutates the active and preview service selectors so the active service points at the stable ReplicaSet while the preview service points at the new ReplicaSet. + +Blue-green test flow: + +```bash +helm upgrade --install lab14-bluegreen k8s/devops-app-py \ + -n lab14 \ + -f k8s/devops-app-py/values-rollout-bluegreen.yaml + +cat >/tmp/lab14/green-v2.values.yaml <<'YAML' +podAnnotations: + lab14-version: green-v2 +YAML + +helm upgrade lab14-bluegreen k8s/devops-app-py \ + -n lab14 \ + -f k8s/devops-app-py/values-rollout-bluegreen.yaml \ + -f /tmp/lab14/green-v2.values.yaml \ + --server-side=false + +kubectl port-forward svc/lab14-bluegreen-devops-app-py-service -n lab14 18080:80 +kubectl port-forward svc/lab14-bluegreen-devops-app-py-service-preview -n lab14 18081:80 +curl -fsSL http://127.0.0.1:18080/health +curl -fsSL http://127.0.0.1:18081/health + +kubectl argo rollouts promote lab14-bluegreen-devops-app-py -n lab14 +kubectl argo rollouts undo lab14-bluegreen-devops-app-py -n lab14 +``` + +The blue-green rollback is faster than canary rollback because it is mostly a service selector switch. The tradeoff is resource usage: during a preview, blue-green needs the stable ReplicaSet and the preview ReplicaSet at the same time. + +The active and preview services pointed at different ReplicaSets before promotion: + +```text +$ kubectl get svc -n lab14 -l app.kubernetes.io/instance=lab14-bluegreen -o wide +NAME TYPE CLUSTER-IP PORT(S) SELECTOR +lab14-bluegreen-devops-app-py-service ClusterIP 10.110.96.230 80/TCP app.kubernetes.io/instance=lab14-bluegreen,app.kubernetes.io/name=devops-app-py,rollouts-pod-template-hash=74f979c864 +lab14-bluegreen-devops-app-py-service-preview ClusterIP 10.103.107.142 80/TCP app.kubernetes.io/instance=lab14-bluegreen,app.kubernetes.io/name=devops-app-py,rollouts-pod-template-hash=5f6f648665 +``` + +Both services returned healthy responses through separate port-forwards. + +## Automated Analysis + +The bonus uses the Argo Rollouts web analysis provider instead of Prometheus so it stays self-contained. The chart renders this template: + +```yaml +apiVersion: argoproj.io/v1alpha1 +kind: AnalysisTemplate +spec: + metrics: + - name: health-check + interval: "5s" + count: 1 + failureLimit: 0 + successCondition: 'result == "healthy"' + provider: + web: + url: "http://lab14-analysis-devops-app-py-service.lab14.svc:80/health" + timeoutSeconds: 5 + jsonPath: "{$.status}" +``` + +The namespaced service DNS name is important because the Rollouts controller evaluates the web metric from the `argo-rollouts` namespace. The Flask app returns `{"status":"healthy"}` from `/health`, so the normal analysis run succeeds. For the intentional failure, I override the expected status to an impossible value: + +```bash +helm upgrade --install lab14-analysis k8s/devops-app-py \ + -n lab14 \ + -f k8s/devops-app-py/values-rollout-analysis.yaml + +cat >/tmp/lab14/analysis-fail.values.yaml <<'YAML' +podAnnotations: + lab14-version: analysis-fail-v2 +rollout: + analysis: + expectedStatus: impossible +YAML + +helm upgrade lab14-analysis k8s/devops-app-py \ + -n lab14 \ + -f k8s/devops-app-py/values-rollout-analysis.yaml \ + -f /tmp/lab14/analysis-fail.values.yaml \ + --server-side=false + +kubectl get analysisrun -n lab14 +kubectl argo rollouts get rollout lab14-analysis-devops-app-py -n lab14 +``` + +With `failureLimit: 0`, one failed measurement marks the AnalysisRun failed and aborts the rollout automatically. + +The final evidence included one successful AnalysisRun and one intentional failed AnalysisRun: + +```text +$ kubectl get analysisrun -n lab14 +NAME STATUS AGE +lab14-analysis-devops-app-py-7d4cc4fd77-4 Successful 3m11s +lab14-analysis-devops-app-py-994cb6c55-5 Failed 70s +``` + +## Strategy Comparison + +| Strategy | Best use | Strengths | Tradeoffs | +| ------------------------- | --------------------------------------------------------------- | ---------------------------------------------------------------------------- | ----------------------------------------------------------------------------------- | +| Canary | Risky changes where gradual exposure matters | Small blast radius, manual gates, automated analysis, progressive confidence | Slower, mixed versions run at once, exact traffic percentages need a traffic router | +| Blue-green | Releases that need pre-production validation and instant switch | Preview environment, fast promotion, fast rollback | Needs duplicate capacity during preview, switch is all-or-nothing | +| Deployment rolling update | Routine low-risk changes | Simple, native Kubernetes, no extra controller | No dashboard gates, no analysis, weak rollback workflow compared with Rollouts | + +My practical recommendation is to use canary for user-facing changes where regressions may be subtle, blue-green for changes that need manual preview or a fast service-selector rollback, and plain Deployments for internal or low-risk services where progressive delivery would add operational weight without much benefit. + +## Screenshots + +The dashboard screenshots are stored under `k8s/docs/img/`: + +![Argo Rollouts dashboard overview](img/lab14_rollouts_dashboard_overview.png) + +![Canary rollout paused at the first 20 percent gate](img/lab14_canary_manual_pause.png) + +![Canary abort and rollback to stable](img/lab14_canary_abort_rollback.png) + +![Blue-green active and preview services](img/lab14_bluegreen_preview_active.png) + +![Failed bonus AnalysisRun aborting a rollout](img/lab14_bonus_analysis_failure.png) + +## Command Reference + +```bash +helm lint k8s/devops-app-py +helm template lab14-default k8s/devops-app-py --namespace lab14 +helm template lab14-canary k8s/devops-app-py --namespace lab14 -f k8s/devops-app-py/values-rollout-canary.yaml +helm template lab14-bluegreen k8s/devops-app-py --namespace lab14 -f k8s/devops-app-py/values-rollout-bluegreen.yaml +helm template lab14-analysis k8s/devops-app-py --namespace lab14 -f k8s/devops-app-py/values-rollout-analysis.yaml + +kubectl argo rollouts get rollout lab14-canary-devops-app-py -n lab14 +kubectl argo rollouts promote lab14-canary-devops-app-py -n lab14 +kubectl argo rollouts abort lab14-canary-devops-app-py -n lab14 +kubectl argo rollouts undo lab14-canary-devops-app-py -n lab14 +kubectl argo rollouts retry rollout lab14-canary-devops-app-py -n lab14 + +kubectl argo rollouts get rollout lab14-bluegreen-devops-app-py -n lab14 +kubectl argo rollouts promote lab14-bluegreen-devops-app-py -n lab14 +kubectl argo rollouts undo lab14-bluegreen-devops-app-py -n lab14 + +kubectl get analysisrun -n lab14 +kubectl describe analysisrun -n lab14 +``` + +## Verification + +Static verification completed successfully: + +```text +$ helm lint k8s/devops-app-py +==> Linting k8s/devops-app-py +[INFO] Chart.yaml: icon is recommended + +1 chart(s) linted, 0 chart(s) failed +``` + +I also rendered all four chart modes successfully: + +```text +$ rg -n "kind: (Deployment|Rollout|AnalysisTemplate|Service)$" /tmp/lab14/render-*.yaml +/tmp/lab14/render-analysis.yaml:104:kind: Service +/tmp/lab14/render-analysis.yaml:127:kind: AnalysisTemplate +/tmp/lab14/render-analysis.yaml:152:kind: Rollout +/tmp/lab14/render-bluegreen.yaml:104:kind: Service +/tmp/lab14/render-bluegreen.yaml:128:kind: Service +/tmp/lab14/render-bluegreen.yaml:151:kind: Rollout +/tmp/lab14/render-canary.yaml:104:kind: Service +/tmp/lab14/render-canary.yaml:127:kind: Rollout +/tmp/lab14/render-default.yaml:104:kind: Service +/tmp/lab14/render-default.yaml:127:kind: Deployment +``` + +Final cluster verification: + +```text +$ kubectl argo rollouts get rollout lab14-canary-devops-app-py -n lab14 +Status: Healthy +Replicas: Desired 5, Ready 5, Available 5 + +$ kubectl argo rollouts get rollout lab14-bluegreen-devops-app-py -n lab14 +Status: Healthy +Replicas: Desired 3, Ready 3, Available 3 + +$ kubectl argo rollouts get rollout lab14-analysis-devops-app-py -n lab14 +Status: Healthy +Replicas: Desired 5, Ready 5, Available 5 +``` + +## Final State + +The repository-side implementation is complete and keeps existing Lab 13 application manifests compatible. The final cluster state after evidence capture is: + +- `argo-rollouts` namespace with the controller and dashboard running. +- `lab14` namespace with healthy canary, blue-green, and analysis Rollouts. +- One successful AnalysisRun and one intentionally failed AnalysisRun retained for bonus evidence. +- Lab 13 `dev` and `prod` ArgoCD application files left untouched in the repository. diff --git a/k8s/docs/img/lab14_bluegreen_preview_active.png b/k8s/docs/img/lab14_bluegreen_preview_active.png new file mode 100644 index 0000000000000000000000000000000000000000..523df272fe7cc2305acbd7507a9f0da511400d00 GIT binary patch literal 82127 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

%)A~pBNV>ne=gZWTaHDBe3b={$@A>Ie7-M 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�{Crfq0ibP(7Pkk>wXQNaa@s@lt%jTp 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 PPan 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 literal 0 HcmV?d00001 diff --git a/k8s/docs/img/lab14_canary_abort_rollback.png b/k8s/docs/img/lab14_canary_abort_rollback.png new file mode 100644 index 0000000000000000000000000000000000000000..245f0b69736272b77849393293f58a0f303ba869 GIT binary patch literal 58987 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 @I7}{&! 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 k0Twe}>3xxvlj^gsck5)$QDT0Y;$|tSdegK^ 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%0DbY@N>dARu zHzP-_vSB~!%joEE&3-c~`R%vbZbIAEMEg_IsosI*a*wA6j?7Yi>JMus%H3O%FStRE zfqUGe6}j`z-C2Db^+J!~#Dr1R9F?gTlg52d3}yxsdU-@1WWTcQ270wnbi_cOx5D8y z&q}Ebr>!~JxL=tIN@5TkI!mN8HJd}%2tn*Cqt1$CGw|9T@Wm>3^6P09n* zL&YYYPprot@e4bz-Q#-~+P|~dH~;G!qj_gq$Gds@`a#gxw_rP*9Cd7nPC43A@~SRBmL#w`s< z1>L;?sEqiP9-{@UeuXmF8K)Ki%3RY#S4pihv%WdhdX2JhrR~fYBoY}vSNGup*u_Kq zb~m&lWo`dxy%w5Q5)}rB`#Qz4?@a`X2!-E-p`7w`ATr;L`VvLm!`)T#bp&0#DLHjA zjW7)F09z#BOkyDbWk0#NC#rop_m1~xLbz)2MS+1(Ma9r-T&%3JTgbI>6kAO3k9373 zPSZD)cE(gzz%CrkC#wSzG4Sq{R5~mo;=k#zWd#KVIoR9x8FgLYfy`I}GhxT&BsK3w zGWMD0y4Z$=-p{rt;_z)Q2tPmjgKUjA&NyR@SF>?_VuAqK^}*DnUkANYHbGQ9<=QPjf2RJ*yk|YCgPuYn zfvTT%l67B04@U1}0ZWpHnHyF;Z?xJ7J0k04Ox>S#!vQ;z0qeeA?GY7*z8k)2s?mn} z{I99G3OGQ?$+@)4RvKOdPRX!PiN7Ke6{!?ptF)?JY~Q_G0H!0{Ssd_8c`l|!Z6%(c zSzi|ijD2LZLY9Cd(k=}Ffy!dR&?@BWFxuT2P#v`dQ5oWc(STtJ7)ro+DgR~fuaZ$j zCI4Sh8fJOj>rxW`!2;qReTsS{h2T2Ci@cv-A?HwE0L*p#m7udtl~=Nhnj{e7B^dJ?+`r_~Y2xOwRazLrwZDRU4yxV_mz z-(DKaV;o=<*lfv`#6*EeT>(cW>YpWWqQgH@YhAi{(Z$tO=HVmTxSvYRed?{1@uKc( z=z^u|Ul5$FX(uxw;;E9D%auV}nAVtVdz2k&M9_HGuiyt3?cc9|V37CJ6p1Q&k?W z0(iQ4G4BZ_;P4*hvx$e4q3n*oAS&zB!iXKKoGp(wg>Py-F$=|3_{+%Do}5StPAE-y zpI|cUkHurQOhSUKLK1|I_VPz9;vtX>>0=tMkocXEK!B_wVrMeC=WIDaajX2c_sAa& zfT8{irOEr!>B}fRem_|U=+cA*1!c4thCgVnFD?oKl@dTE0eD4g04aHnT3%bqO@A$R zc6O%D)*}tTn?@5avlT4lxFp@JbTDS$Ekh0Aeg(d^F;b#w&(zV;nH@zL-9b=gffKa` z-0;B`HtjwfGA8(b(kC3UW;Rk{1~^BGLtZHf3ZeiJLhGQqo@?6c7#{OuplT!;bhjs8 zSGZNP8BW8jJ_AVIz>K;&r9Oh#jutr0M}p({gKfWSRK4XkFczRJ45Nky7_E3We7<5% z!SpuFNDtxEij|X-i>Pa=uTKVE8K^`bcyrmUDCR|R1M;ueSM4}~B@DYIQ%Q+Apbzi2Rp!pV+F1{wyfN zC5Tb}F1AO3)IAfIaeM*PZ7fvKj_T=$isG%60ToX{G4`PD+s(z8#o1sq6{BmFTp;`S zV2);IZ^QIV4Cohhm8nZ>7o)qNjQjwh3jKNgub0=Uv;%<*5N6im;tnW;=j2!b zj(}ON=Dc(!<4`)L;Z`2i*^Q}2gb#QxWDfV%>47SnhjqfYix3JUX?-RJUqB?XNhj&Z zVmk$BgeoO5@bPh*@uai?bI2@WLDr6w3h`5PSn7dU)GRxq;BL!(KSfds^;SI)T4dSw z;g*L0*XTGfWsAkYIskz%b>3o>Az5Cze;AuwPO|=YjU*+e=Bj|vu%b2wW-p)=5FEnb4J2cY*9AQDHM^Q~JEiDcY604mnbyruCNDkP6Mj|l1 zDs6~q_&q@-&e%gG>Cen85x_U%BY7jXOUuin1XM)FfUbr~XRPB?gYOEPQw;0dnY(db z7Pm7hhk{WW!_}G(4OcUOc%uysbJ}-3mlMz{Bewj+X4HOCdgibcj@#VyXUWP!Sj9XE z{@SMDRpVIvr9~lO+v4eJ7#?SI3IqfR9|zW(8Z*-#NBx#O;%0{(u7QGx0?YA8D`d@M4YG{W zAU{+tnM8wPQ2KJw+eTvlB$JNl8~5(z4l+N)oaD1Te+gI|?Or2)_NGC(bgPVF75g*a z7dXMD z8xHNVaOx}XUP~bo6Rpk6sAy^Px^$IzlHO~4iOa&E-O1@hD!>bV=gu7p zI7^IwM0{!Chj94KK){v|onb1ubH6_6qW02Fnxxj9A(%HDcqON(*+=cT)>ZVcyqA#e z{FjDtK0ZYJ0kMMi=?L*H&ba()&JW+K{%8V|WoTgC-NFrj2rjZPIjNW?8*xuK-15zr zsQ7rx_#{Y{vi09^<9RdVD$Wfp#7d>0q@)!2GSfb{p8=>VGH|X9>Ut4>VrX%-(&S^C zw&$GM<(Z|>f-Ld~;pf`Et-#|@2ahg+V#nfA1lvBC9&uRd&t3P9<(;{JQ(jt`jSh|8 zsoms?dBQn8jj*kd#MK_#_T+n#B+$}=O7r2~O1xpW7^J$nme2ATlCu`6SL=FYU1_k@ zTk;`HSu*i94W&)4e?V8o9G!JJvw|^9kzD|)o)?z7GK>LuprcJY{4{Al5x#nSrvZqK zK(!bqOd!IK6Y}hV(um`okpAvC0R^SxF}KhPrUh7rLXsMfI-<=s*}2un>u6PgzxZoN zNYpdg;I);N+^$`%QuBz#2YrHM{NixP1@pn&;m=oY5`z?QMoF2%9)u%PKt)NdF&5@^ z&{QGq0Tfcb@S9RsR#J2O7I#-sr6!64*{awIyYz0cqg*ZCcfY?wpphU+j0r?S^_lsb zUv?ylYCF|>928x9NvvFCB;)V+;ssCQ%b_0$B^B7 zs#xpg384h>Qq;Z@;wf(YTjF-b$gns$pjMCCfWjX_vXAECY>Yn3&i&-1Dn=Zbd90)N zQeQ@O{G10-6s$o1Lx~F4n=GX?R<+#BS+mayo$UM+y4Ywvpz#V(SqsStv`?~DAo2U0 zr{&C+o2yx>WT1q|gUbOl6)v6zHOURKHnr%h@LHY8=%Rh<_ToV`XqdqE*n{erZHk|Z zTLrB0PP}p0MboX;iNd{ShqV@IR^x^0Uh0qLbH-9?omP%r7qh!owXUy>>Yi@#eM(=k z3l{kOO(c4E1PJW`);6$P#_`U5-=BX15w^_7`-RdVwv-CKmo-)njHY~&nC^qS{;XgZ z4}kU}G?sDrFBdvwKT{V~mXM%Jhnlao1p_8PU(~oN+wD%0_sKztSzjW^{QN}#BRNY< zpcYqUTuWG$65lox?jkU)>2>3;9d^g5Meez9;A{8E9B(@kLIWweO1J%+>6j>^d-`^fV`1wg3FdeXINF z$I72#arOsFPOZJoJ@wCpqCN%F5#*0Y_(8v@pzE&3>XND!zg6Z~;L8^IPQ2HLPw0fO zl$nOK95_xF;QwFSFI4dSwb(w)U*?qFyU@h}oOLiyN3A{q_?+AS{BwUXZtHiJYk&}M zPJwW^{^logvCw~H>(SCZ%T@REyjaB^ggjBD6&)N{HB2d0TpI@sF6>8!jm*lJTmU9$ z6(@Zk zDiP?%3K}Si=Xl!`u7C;?NUlw)#brEQk0lp=4L#gj>V5mOu4Y()>FA2rc56RR+WNs< zTcau0@Ti8Srgj{r^b`Z}f`Q1GG_P`B|qt!Q`y-f87@5yZ~b5K`eh?3lR%eIV)4=90gm zZL)w8Pb3qY^^D@su*FveoR)mz84USLz(oI?3&rCLry>K1`o1T(UYt5pqDilR$$tLp zvi0dN{$I~Tqsi*~EMrKj=^;~E>e3GJC8DjC7deH+g--TP1-}t_r%lz?Y~eQk-?*=A z%CMxW6Rr88p{vf1Z}E;WeX|9hK0?4V(h=Wew7rSCrbB&Yf& zp_fQIPoLm_>H#%bLmIkom_|yGyjns;kkpSilsVt1WuQ|%15t=XZ0Vi@n#uwE*FLiV zJ=bSUm$m<~9r^y~W$W3*2T|hFkjXm@*q(Fbj{)7UAKQ-$|Lb4YU&|$NoY%ke#=x-b?%4h%Xai5836RzQ<|p@#^Xvj_qeGs{>JINu+pz!g=IdvPh>hi0st>Md*4K9q zbzvilz0Z(#Q1*ARJkKtJR5MCf_pd5(9SUYUy(H1Tjf=>6c6Df+s-xS%Fs01zG@M}7 z;VYere{YHKrR9DdV#nM#A+dR9Nkb?4Ki^-o*Zk?}n4o7G7m~TE!wyBKslozuyUz*8?s*T5f!IXnWrK~MSx zgr%DJu>JZ34aJok$rZ@hSb+;Ex?^AD?j;T<%8;FK0Eh4{P`9e0x*lW|YGu%qFx=^g zx0}_POfoB5KS2{e2PfB^HRwpYKFsRnA7gg%vAaU>Q>sGkrP+^9+IO8g)dJcCa)>me z-K<(Z&WZr&`b3=^EKkm}pqm4+T)VD+&GRXd)PEE$C*Ay~D+f7yI-w!7NQ-=uBKL&1 zIwflqed9CQFuPHUyuLQ>B-=T)@wH5crQU)?*Xv!7+IG$()AG$5wZ@~~9{e)pc3vly z8K*Q-L8F?tF)TxiN+)ADwH^kl*N<26Kf{E8?bCnM=ID2F(u?CSDZd?es&o3A(diez z&9NSn7k95FsIWcvaqF{-%Z}4Is;Itu2x@M;#fM#bsQO11&H6 zoS4@C|1G3c&)uDqyuwIO-B?i+l5ojpZ|nRaPK`5pN3)f0HdXeQWo`ln$9E$ZS3lD0 zY)Z%Q)W{E5C6TYrt=d)ybv=H3)PetGr@yBG!Fr5 zEq<<}^eVCX*%&M1U^xiMxUoNaw^vOX{ONKsUlp4L?<0B%xaC2($3CbHe+r>y+S|rR zi52Mh2mg>f;p&|z9H|OHTnW$#!I~ntehG`@^QSBgf`;W*KsJ6113+su1_OG*!)5i( zU%YlBx9|oR=r@n#4BA_ypZ_#FI}3!T#X+F!xAhb77`nWR9z&>L5=et)8vV43lvPz7 z$I2JUSOebsgri7@4fY7osC?&3SE`i9=0bZN6{tzZ0er$7pukp-N>GROOcJd&&|YlU zE#U25`<(IS#(z+Y_}06XgrnE`foQ~O=cz1HhpQ^jlaEceOL-G1%7pSPFs(3NPIM8Vog!9;@ zP)dsQ8=wXQFe_si)b0<;3#IJv*m5WoT6PFvDi90`f6@oIJAkq<<5d__nK*yYlW$S} z+unpLYHhM^;N}1jF*gf7z^$Ghjvi58_}>0JgF#{-RzD6hP>Z-VGw3Ls){*#eSfm>DoxfDi5CF!&})!AGUfWG6wgh$NultIdxzG!kw2jVj+)q>DSJn3YJl z020Zu#$^f!yURcO`sU3W^8A>lMDrkfr#n_{mjJ#t+Teo~>6N|3KT&DF1?((84Mge9 zBP06i9eJ9P0qXYrxg=1!_~qePDMLt!jksXV z5HLH^_$J;th+)ZG#lgYg51q1)>*&tXH*FHRf$l(w^)#Y^8a*<*7=|Ky%FfS8|xnklzCF z@dw3l@8v!Vzyim{$MG3z@qj#$u-PeyoklcRG>2J!`%@^W)eNXx0NQV)$e61c>U+Pa ztEkM1iIz(}?u%;Nt@gwKSAF4xvnrDyr+jhxOnI~wNE%@huIWOS-#{+-uaXTH(0`E) zr(&7Zo@K2J8ghr!!v>OMebibj6-ZgD?oiJWb0*%O|(Hvgh;k_TTvjzMZ=<9xo5$Z`WzitFdwCH?II!IV}2X zznhNNBxEEiU6c+MdcLGUHc{=sW9)O_@xY^JXk-K8#m9{^X;{O2W9iIJsS9=29BhZK=#;<_M<-N8r8_n4qoeyI86*a zpTP}#Rj^*{L%jTkKb@E9}baoPIxO6s-6v<5KyO zAHPfO0T?vLA(W`I@Sik&84z2Bt4PU^U1_lJMO9Fs8R3`}F-rz!Pg%4|=?l9SWYlhRK8+@AN z5N>ke7R?8fT2(GZdX8x=)HN-7@L|oWVg10V5_lAkksDUmv8bB*Yb1s6Ijgp?v%k%e zZq=x5MGLXN3^8w7@^E)g-|vD1OK>esV*S#WcF;q-jY@1bp;CZZQAHYK3O^;{7`$yp zoO_qcoeRuN<@VOB&Pd^Zz;|TO3);aR?OYjZlD;TJl(ZFTkfuCXHcun! z!)HEtR5`>bWSVEx%#pjx`pVLvGrCrNhG1=DW#YD0R5P_T8=|buE4NK= zu6}{aF%j#m@6EQv(mWFNE!Uig-<EI0LT;Vglz;QX6Cz;*rLLCY`{ON} z@#Az^DLRG@N{*W$MVJ1(k8JPg;AsdGT6jD72e2e?Sm@z8oX3g#gu?CZ?Mrp{qb{WJ z%H~{hL>@f8Pn8T*2!T)QNLQ5n!{O#aL8UgfRX&Y96DT|2%qPz$+b1nzM2@ihXpO#>7jOioS$FBE$Fs`r(s zD<7>wU2`tl^L1T7aL09I3)6WUh@$`vtHkW3<9jHG*zTv6S-oT5pM7biBO$CfrM_6C z3p>@|6B-znr0dNx39OZIx)!)89fRB(xnnqZ{seS5fl^8_uaGJ0>Lu!**1>nNKIM|XnXj}HS%BPJQx(w&AVFd(fSHT^8KY4t+2oAAsC*KR>SI!Zf_NLP0$ZYlkz}aKp8KPB&Mre zs&+nEswVOa!Uk@VP=frq+k!>e+a|KW1oA?qX$;tgL&!G)eHlvh>=qk|3pAeGTqGS7 zGB#<0aD%5v|BE7x-0u$e_gDr&SU%y>;0$nHYO0UKlp^CA>Zx2}Du~|?*L_fwhCJEf zbi8`ttK`~!;LjE}^%t1kzFwZ|V?#cMiSv6wKd~u>#RYSIXtc7i5ilsd;kB;yWcc;{ z#X8`KIt$d2!GlCaQx0|}1aIBCwUC}&X%MP!T75rBKqitmNyJtiU97=I3@wcZAw0M#6b!IFXQr7(ebZbe3l zV9*g#Ky4}talhfQ3N{?4lD|oxfdqDtuS$tRG*jG9d0dtIq@!axEqhXi?l3`~SXwYq z24duhhPCR6nkDRH!MyGLdkf6}zydlCA-9Sy6;bGyP|!-KL9i3NG>%h3`9&;K^-cq} zoyBR=jr*V*`;Oo7$)wj~imvZ%*Mf?$b%%pAr*p|mUs<{$jFs^lDh#pYOh{1h~hae-C2=!)m| zTL9GN#d!XfD!DD#MnHdH!(RM%czK1_E1=V<;B{3aDY%u{C#3(EDTKVvsv|gHvz<$M zB`uo=@f~7!7vO>FVugM3_uo?}_4f8^q^;pbEu-Ug{IZrEikTSt04^QSBelfj(Ipf= z?Z7h#58N4B3S)G6G&Q%6++XKyP$pW0GkY(k`Gh@9j7wLHtAEG843y9$U3_yC2;ZZ% zJc5YxtO~ocuje?pawLo>z6f-2%X|gJYuCgxKt-4@!(6*3dXQT*s|01XFX!2?TCVC# zXT21s>-#buNguy{M~nmlR~ilhtF%jvP5pyDzv&h9%N2SQzH*!YMn^}-kz+1+?L5Di z&(0;aCeAqvU;3sy(*awcZ(M`xUJ)pp63R){R+n1LhN`O!!Bu>c;?g@3>)A#aT^lb? z&kWMjuY)5M4-$aYu?lFvj6*12ypfa>4jeo=NU|HU;WY9F5bV~*68$>^-`(v2jqtwf z)P%J}53SbIbU#Bpb?p%SJ2DJcIu-=F+fc z<~tV(bE)TMkG^zSU4C!D3b9r>pbiQQtlK!)OsTHjnJuj7p%CM${P3QqddvoP@AY{x z=kdyS-Eh<X>I+`vjM(;1@=tHD<^@}gke)t|z zz7b(gyy>^Si&z^ixtXeFP#%T@MOQR|9>5-JK>^`W0cPCv z0vxoKzvv2%rlwLR&%S#=enefRgo8;02)iVj5#Z(rJYt7)f@t71Ktxex%Z~$9WFQU` zY!I$&6aYs)|1t#Ir7^rG+w71ATj0X1y*Yyq+*ur1XWg27(VxVv@G$fM{up(pm<>Q<8D73D~T{4>2q zY$v-kG~y}=>x^#{+j(8s)kS@7&8VtP;UHIGtZ{98zcxNDj!AB_@PTSVm{>C*zZGWme`(EP4fLOuplni?_HshCmNL`q9;UC@+b@nNtMsxmZ7pnBruzp0 z-&ne|Mn)sK(yC;2umnFtEpwQdCUe!qW5q8&T*RhZey?kbW-K@Z8YM++FdIBnN|VhC zo>2|ou`3G+ z&~#63&1F2?9l3n?k{$f+iF#V<%c_8ujUZdlP!fRQx9Ojqh?kG){_Pp*fE4pj6qf`5y^^!;P_xW4ZWdXLyC;AB8 zJE-z0>0tuv(PTfJcQ2v>|DO8SrdO==#gH_--Ox1LC4NLY9};zx&Ru%ll|5$%9a{K) zkIXfBq~3AhYHnn(RKDuTZ{MD$ExqsOmtEP&XKotMs?W;q)n0b=$RFSD{HE90mD+lq zwV$_UsC=j;JQ6}|=J0?@&mUWWrv0hYym5(2WUMB7X4B@vT=^m=UkNjC`Ej^AtN4vZ z#{S9SRl1+yo11N!ulE5wUs|T&58W@Yx`b&y;2&rznuKGlU}^HEy#EF-h`;}gt^vYj)ob` z8XiG2lc|r8I-1S9XRfGzPBAy}oP|V(9L8oO%h~kZo2arg*E18}m4h)IO>O4sw;WG7 zNWsB=&o&C9(eNQS_-9f&B%Z6K5|^^M1i zc9$p&-3`z-@$6YD;lwo^&)QA;sq4p|dy@Wt+zC~YmrBR2M3vEZF&*9*15EIVjXB;r zTlm@-_Za>8kiVWIN|&tlDE}F)1?r{{9l8k02)*Aco#O}lnsPef2GX~EwqmWix9L$p7Xj=>h4ia`@-lK4WJiaPzXb% z`#wD|GcwYueYS{>6}xa3XO*2R*4^%smXUb0UQ*x_!uiW}TWE}937=n||_S!7AC%=fUVMUmjCf&Lbo)A=yk51mhM#?NCEBl^&c|O-3NUg#r7JPQeH9U$A#FfG z;-taQVB=TU%H%eCdVf78z7Dz6;H(8cPbFC(N`2&@@7}7u{M&H(VkoL%lYm!X$Z%3Y z)=Xt;=8{AOYwWd*VLxkioez}aA1ZzZD`@u>z0bKmVB1AlED@MK%i9HpE#o!FF@Q{o zAMD_ianUvI)jaYo3?cqh1|T7*o5ha=ifv)6pugW74AnQOdHy{%J52l+7=Mw{5t(Rr z8!h-0!1jb!oh2|KNAL0rFd>f}Y;mLf#RoVEAs38J#K{-FCr}z#ru(`Om&`d~jT-W> zOJN@g7{(fO-pVnjMD<86@byH~167u5Tb^3H&J&dab|}B3Bq1O$?|PM;YGzp}ouzC^ z0K~W@9^K=S#%5;gb7WDY1^W2(De3TVS}qMn(%#o_)?j35-fjEF0)+zbdUu;+-3Vh@ z1qLPtl^-*m;Z}$#LhkpBAbFwu4^ijV)EPmbte_B-As4oW*zXBnMQJ3epM!pS40L-? z`=1o}j4G}A2UnEO=rlSEZ7zn&Tx7285pxuBQ6zKq7;4F?W)#i@k+WLLLP*9Pp-gk^ zofqcn$ve2!I^|os2bwvWDPpeo^lTnpI#f7WVB9Zd*Rjn-K_U*99ais&em>7C$bcO1 z&QROk1k%qJ6*4rEDlt71GtY-YUz0f@3}Je5DjI?gnPxFzglJwnH4DrP~g7{P4%v0UWWk6wy)ON-)od*`Y zJ*ObKt`wfW)d@v9Hai9dPm3G7Ugv!GPA_14g&x2?eGB>K9KX2Ds(3DTs!z}qKTAuA zGOlO@G4C})oOG7D%pR8lV^w46kE)Pf`2Z!opW_N)Qd>V!r0=;t)A$YIxro@XPtsXO z1c#_3&h7lLF&3FI*cTJNS_8&||1+pC0D+z?3-tFVRF>G-*xKrrtp(D^AxFNnrr{=d z^$Jb=+Wl;G5bo#B5OBz~`p(#t-MKIO>5y+4&=ljP(m~J3opI;f1pbu7jIB1Ppe$jK za&f8BDF(GvETdb$XSig3_&V$1v>R3t0l`V)7FfA(Im2fR@{NdPN5N4HJo*K0j2;@x zz+;En8(a|qCTF#m+(0!kH+qX^eX{HZ?s-S$b=_5qrbKO*I?T%>468`BHG6z>(|rpD z-0DX!_*E&;hOfKG!@xn>B@lw=A#IG&le{q*4`nC_xKzx=@Gza1^}8i?*Rwj*u;SfyWNZA9;&GC4Wh_mD*l1m>{Rs{R}Is!bq3U z2fWB6$vSizkVp%eiAdyA9ZvTfByPtjTo;YHu}Am^7Le&`CmOA=)&DwLp4Mi)alU$g z6}j~y2$9Io+er8(Q#0n@nMI>;qbqo&tO4B5Y)CZmng{MoX8T1T=rAwpF`PQF?zcSU z#u}P~pV?8c*m^SH?g8U7EO(j}57dH%nC&cU3vv!s_gLhw)Z)epY{#}|4u1_-)l3Hd z5DE`nxf27M@El32(cnig`Rfw|9t-(zKEWnbTsNc|9l>VX|a@KU?Oqcp4#bW28tr)N-wjRz_@ zc&$4)We=BHT2q`RLnMC9s#zU#9vY`S_%`Fa9|&6U@6B^8>0SGrKGi_nT(I=_!V++) zbru=eM!cpLZPl*jQB}=Neb&>CEB)h>`VeJ%-vR(|nX?Z;9Hy4c|O7$|s2Li0JX#tkVw)#_=nLZ=+`QQIdPxGd<}dg89|s2gf^02<$9fZL+nR z5kYn7`qepSyzKVId~dv5S6f@{kERM#x(GG}wqD@5bxE&DBgvN#s$YVfi@H;09bFt) zjoxdX*Px`cL2q9#As%Fa{m6E0P`!o0H!ED4QjeuRDyut-}iRbrUjOpEbB!8&(aE75mI8hlSdk+ zIm|5xm;he!kjPs?TF84{!#s*zPfh(u$1CIIG{erd|CY>!-*_qFEmSeM?$^$Kl-%ZQ zAbuP-$CXZLYSZ5TZYdzt&THck61oRcR{?JB_6`F6dFWMWVa**rjLCd8UZKT1d+S@3?CD%^I_v>NBUVg4wQJott$1S>qIAzVp1N zaWDVv`*ZXHMyV+RMrAj>g5goj;~M)8dSe|eE#SJK;M7NF7{zHg*bl%t`U9`i`SbCv zyNVVqhUq8(&HR!d{bHyxjE$2+GzvKKaJ1%C`THS+6*r}@JW)>bf z$c)?Ao^85YhlT(W{cVr(YUow(UAJ64gSE(-X-WmTdM_j}EugS~C2S>aszUJSp#CzY zRPXg1?c83wesqzBCnok60MTn0FG3u)2)+P$b)9pgQH zhH}$f>a|W5@3qM}*xnFgPRGDw-(4b%2I~Y**khyAGjRU$k%JUqI~kfta@8_cJ9iZ2 z+j*krjmak}U1A0&bw_4|Fc>Ma^@i4FA9E5+MCouRHA7)L7o&)v7@D7qINV*U$U&}! zO<;lk!i-CEHJIsMdO<_~j$cZlDs(@6F#SSb6AKFq?;X?tl&BFV?EG+`e_g~Ht6mLVE>~ z6l!!((z+XiTftM7yHOwT969IErDq<>?)T3W)U9;}L$Va_H6VOuq#lQtN&iY}Rv<2H z4dNdquzp4z9&{fDLa_2q;e&cJ6G6{?VX-NBQ>=_&;Fl^0ZK!BoQ3uj7Ie zV&~h0_NPFvR$QXFBs$ST^H+gxJj)_0iGeYF&Vy#A3>+h|Da(dNuL_2z4;w z!vst1d`hgCW021xF8{$I+4FJz3W39BDg{|9lr2mBK`~>=wLTv>AU3(c)SraAssBDL z81AJkY4q<_!^anL=O1!{E5o`3{*cIr{{G{61L~ueyQMtC`7O0MK-8NhX!Z?Y;BtEs zQY8JxcYC?yHwPm+6T~)Mm*G8m{RWZD3fvN0yu30pfT=h_O5F0JAy1vhvXqvhj2|b< z!wE3ab$>d~^}b?#yo+v$c7&Vig%9X;G8Q#)xuNU-*nO(xGQU?&_`}!p_cdbTrq33b zW7nBwe%C>O+$P2$>L|DAn;leQYVYY`kaLeNsPf17&pZ2$+hXqo9g_{}~ zJK@xzJE2cB@uy!qXNgxQ5i}=um9To^r6=w(q?2_rBMJT#26c6HuL<}mH#-!kS~*nB zz{~~89Jb9Y`xFLh-t}w)=k=Jyn2+DkA|Hh*0^xO@_PsBl{XD0L2kk*r>1tsYmTKyg zM=rG@8BO7#-nSx$D#qi#Kb?;PZZ!=tBM-S+ITL_2t#O?aRv7zQ={(@xJ2&BV+m8M` zn@GiZ^TXP=(Z)j#a>p-!=6}f!&RpRCq#gcBkV|8w59#bOkh(`nUt(q&E9xyZW_Yl_ zy*!d@yJh1?wkGk>u!3Qx&tZV6rl5$F*WcE4f(Sjo6$}EqZ(Pp(U3I#A)J0YRBW*vg ztE02M8c`A;2T=z`nxT;@ZjbIdGM7lrUCF5`k1u+1GPc$>-m6ba@$1bnQTy1z;ZGti zx)Y^YDp^9_#O%q`!ot zTK{?%-vU=M3$3P@{Si_RJreFw{ z*DpzaglI__OmG3Y4_UmT_rmQ#HMM6VwdvK`p+MWMt4}fu2&9iXzt$ zd?@;iQRHcSvalE7t1@&+&;aCFd3km%;O1g%7kukl*z=O(fbzIQtc(ZtUoi~q}rk(qU`Tv+6t-c_zsmw8RBiqj%sj`+Xzg;TZaOGKmSBg@B zcgb`!TH**8RZFe58r%HwY~;#smoJdwt_t#BBxMQfrGy>9x3{hJ5VhM| zPmRFlt}HEk?C>n{-^Lr-NW6-Ny*8EvFT=7TIHNXa)Y~~T1#&d zl)cByEcx2S{gVeE3(M4m>wQ)UkOz>>si(KxTK+G9$NxIG z@}EJI|9%Wg2{M(xTwx++W z>F+@3pO+B)?Ir#nd5JX=NIOWRfsk8AEfvong$!p-$>3G<)BYe{2R}Kb{6PJW;`>iu F{TmrnSl<8u literal 0 HcmV?d00001 diff --git a/k8s/docs/img/lab14_rollouts_dashboard_overview.png b/k8s/docs/img/lab14_rollouts_dashboard_overview.png new file mode 100644 index 0000000000000000000000000000000000000000..0a1fba940c94dcfb7c9d2c10b245b3e449a02001 GIT binary patch literal 116022 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

y_i<;TXs_Z^{MSWLf}V`}PVl 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 literal 0 HcmV?d00001 From 1268046429b443f710529de8084f3b7091ac83dc Mon Sep 17 00:00:00 2001 From: LocalT0aster Dan <90502400+LocalT0aster@users.noreply.github.com> Date: Thu, 7 May 2026 20:49:51 +0300 Subject: [PATCH 15/21] Lab15 Complete (#15) * Complete Lab 15 StatefulSets --- k8s/README.md | 3 + k8s/STATEFULSET.md | 16 + k8s/devops-app-py/Chart.yaml | 2 +- k8s/devops-app-py/templates/NOTES.txt | 4 +- k8s/devops-app-py/templates/_helpers.tpl | 12 +- k8s/devops-app-py/templates/deployment.yaml | 2 +- k8s/devops-app-py/templates/pvc.yaml | 4 +- .../templates/service-headless.yaml | 17 + k8s/devops-app-py/templates/statefulset.yaml | 40 ++ k8s/devops-app-py/values-statefulset.yaml | 36 ++ k8s/devops-app-py/values.yaml | 12 + k8s/docs/LAB15.md | 441 ++++++++++++++++++ 12 files changed, 581 insertions(+), 8 deletions(-) create mode 100644 k8s/STATEFULSET.md create mode 100644 k8s/devops-app-py/templates/service-headless.yaml create mode 100644 k8s/devops-app-py/templates/statefulset.yaml create mode 100644 k8s/devops-app-py/values-statefulset.yaml create mode 100644 k8s/docs/LAB15.md diff --git a/k8s/README.md b/k8s/README.md index b96b36bb0e..309548a499 100644 --- a/k8s/README.md +++ b/k8s/README.md @@ -8,6 +8,7 @@ The main deployment assets are: - `service.yml`: baseline Kubernetes `Service` manifest exposing the app inside the cluster and via `NodePort`. - `devops-app-py/`: Helm chart version of the application deployment. - `ROLLOUTS.md`: compatibility entry point for the Lab 14 Argo Rollouts report. +- `STATEFULSET.md`: compatibility entry point for the Lab 15 StatefulSet report. - `docs/`: lab documentation split by assignment. ## Documentation @@ -17,9 +18,11 @@ The main deployment assets are: - [ConfigMap Notes](CONFIGMAPS.md) - [ArgoCD Notes](ARGOCD.md) - [Argo Rollouts Notes](ROLLOUTS.md) +- [StatefulSet Notes](STATEFULSET.md) - [Lab 09 - Kubernetes Basics](docs/LAB09.md) - [Lab 10 - Helm Package Manager](docs/LAB10.md) - [Lab 11 - Kubernetes Secrets and Vault](docs/LAB11.md) - [Lab 12 - ConfigMaps and Persistent Volumes](docs/LAB12.md) - [Lab 13 - GitOps with ArgoCD](docs/LAB13.md) - [Lab 14 - Progressive Delivery with Argo Rollouts](docs/LAB14.md) +- [Lab 15 - StatefulSets and Persistent Storage](docs/LAB15.md) diff --git a/k8s/STATEFULSET.md b/k8s/STATEFULSET.md new file mode 100644 index 0000000000..e3fb59d72f --- /dev/null +++ b/k8s/STATEFULSET.md @@ -0,0 +1,16 @@ +# StatefulSet Notes + +This file exists to satisfy the Lab 15 requirement for a dedicated StatefulSet document without flattening the Kubernetes module back into one large documentation directory. + +## Lab 15 Documentation + +The full Lab 15 write-up, StatefulSet-enabled Helm chart changes, headless Service notes, PVC evidence, DNS verification, persistence proof, and bonus update strategy transcripts are kept in [docs/LAB15.md](docs/LAB15.md). + +## Why This Structure Is Better + +- `k8s/README.md` stays short and useful as the Kubernetes module entry point. +- `k8s/docs/LAB09.md`, [docs/LAB10.md](docs/LAB10.md), [docs/LAB11.md](docs/LAB11.md), [docs/LAB12.md](docs/LAB12.md), [docs/LAB13.md](docs/LAB13.md), [docs/LAB14.md](docs/LAB14.md), and [docs/LAB15.md](docs/LAB15.md) keep each Kubernetes lab self-contained. +- Raw manifests, Helm chart files, ArgoCD applications, Rollout values, StatefulSet values, and documentation stay separated. +- `k8s/STATEFULSET.md` provides the compatibility filename the lab expects while the actual report remains in the `docs/` hierarchy. + +In short, `STATEFULSET.md` is the compatibility layer, and `k8s/docs/` remains the maintainable long-term structure. diff --git a/k8s/devops-app-py/Chart.yaml b/k8s/devops-app-py/Chart.yaml index 37efb207e0..410998ccc3 100644 --- a/k8s/devops-app-py/Chart.yaml +++ b/k8s/devops-app-py/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: devops-app-py description: Helm chart for the DevOps Core Python application type: application -version: 0.6.0 +version: 0.7.0 appVersion: "1.12.0" keywords: - python diff --git a/k8s/devops-app-py/templates/NOTES.txt b/k8s/devops-app-py/templates/NOTES.txt index 7919c1775c..f805ea2bc9 100644 --- a/k8s/devops-app-py/templates/NOTES.txt +++ b/k8s/devops-app-py/templates/NOTES.txt @@ -5,5 +5,5 @@ kubectl port-forward svc/{{ include "devops-app-py.serviceName" . }} 8080:{{ .Values.service.port }} -n {{ .Release.Namespace }} 3. Verify the application: - curl -fsSL http://127.0.0.1:8080/health | jq - curl -fsSL http://127.0.0.1:8080/ready | jq + curl -fsSL 127.0.0.1:8080/health | jq + curl -fsSL 127.0.0.1:8080/ready | jq diff --git a/k8s/devops-app-py/templates/_helpers.tpl b/k8s/devops-app-py/templates/_helpers.tpl index f593068be3..db3af83918 100644 --- a/k8s/devops-app-py/templates/_helpers.tpl +++ b/k8s/devops-app-py/templates/_helpers.tpl @@ -58,6 +58,13 @@ Create the service name. {{- printf "%s-service" (include "devops-app-py.fullname" .) | trunc 63 | trimSuffix "-" }} {{- end }} +{{/* +Create the headless service name for StatefulSet pod identity. +*/}} +{{- define "devops-app-py.headlessServiceName" -}} +{{- printf "%s-headless" (include "devops-app-py.fullname" .) | trunc 63 | trimSuffix "-" }} +{{- end }} + {{/* Create the blue-green preview service name. */}} @@ -118,6 +125,7 @@ Render the workload pod template shared by Deployments and Rollouts. {{- $envVars := include "devops-app-py.envVars" . | trim }} {{- $vaultAnnotations := include "devops-app-py.vaultAnnotations" . | trim }} {{- $configChecksums := include "devops-app-py.configChecksums" . | trim }} +{{- $usesStatefulSet := and .Values.statefulset.enabled (not .Values.rollout.enabled) }} metadata: {{- if or $vaultAnnotations $configChecksums .Values.podAnnotations }} annotations: @@ -186,14 +194,14 @@ spec: resources: {{- toYaml . | nindent 8 }} {{- end }} - {{- if or .Values.config.file.enabled .Values.persistence.enabled }} + {{- if or .Values.config.file.enabled (and .Values.persistence.enabled (not $usesStatefulSet)) }} volumes: {{- if .Values.config.file.enabled }} - name: config-volume configMap: name: {{ include "devops-app-py.fileConfigMapName" . }} {{- end }} - {{- if .Values.persistence.enabled }} + {{- if and .Values.persistence.enabled (not $usesStatefulSet) }} - name: data-volume persistentVolumeClaim: claimName: {{ include "devops-app-py.pvcName" . }} diff --git a/k8s/devops-app-py/templates/deployment.yaml b/k8s/devops-app-py/templates/deployment.yaml index 58689bb8c7..33511cb299 100644 --- a/k8s/devops-app-py/templates/deployment.yaml +++ b/k8s/devops-app-py/templates/deployment.yaml @@ -1,4 +1,4 @@ -{{- if not .Values.rollout.enabled }} +{{- if and .Values.deployment.enabled (not .Values.rollout.enabled) (not .Values.statefulset.enabled) }} apiVersion: apps/v1 kind: Deployment metadata: diff --git a/k8s/devops-app-py/templates/pvc.yaml b/k8s/devops-app-py/templates/pvc.yaml index 5f817de35e..2148f467df 100644 --- a/k8s/devops-app-py/templates/pvc.yaml +++ b/k8s/devops-app-py/templates/pvc.yaml @@ -1,4 +1,4 @@ -{{- if .Values.persistence.enabled }} +{{- if and .Values.persistence.enabled (not (and .Values.statefulset.enabled (not .Values.rollout.enabled))) }} apiVersion: v1 kind: PersistentVolumeClaim metadata: @@ -7,7 +7,7 @@ metadata: {{- include "devops-app-py.labels" . | nindent 4 }} spec: accessModes: - - ReadWriteOnce + {{- toYaml .Values.persistence.accessModes | nindent 4 }} resources: requests: storage: {{ .Values.persistence.size }} diff --git a/k8s/devops-app-py/templates/service-headless.yaml b/k8s/devops-app-py/templates/service-headless.yaml new file mode 100644 index 0000000000..78fe84e805 --- /dev/null +++ b/k8s/devops-app-py/templates/service-headless.yaml @@ -0,0 +1,17 @@ +{{- if and .Values.statefulset.enabled (not .Values.rollout.enabled) }} +apiVersion: v1 +kind: Service +metadata: + name: {{ include "devops-app-py.headlessServiceName" . }} + labels: + {{- include "devops-app-py.labels" . | nindent 4 }} +spec: + clusterIP: None + ports: + - name: http + protocol: TCP + port: {{ .Values.service.port }} + targetPort: {{ .Values.service.targetPort }} + selector: + {{- include "devops-app-py.selectorLabels" . | nindent 4 }} +{{- end }} diff --git a/k8s/devops-app-py/templates/statefulset.yaml b/k8s/devops-app-py/templates/statefulset.yaml new file mode 100644 index 0000000000..b192bc13da --- /dev/null +++ b/k8s/devops-app-py/templates/statefulset.yaml @@ -0,0 +1,40 @@ +{{- if and .Values.statefulset.enabled (not .Values.rollout.enabled) }} +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: {{ include "devops-app-py.fullname" . }} + labels: + {{- include "devops-app-py.labels" . | nindent 4 }} +spec: + serviceName: {{ include "devops-app-py.headlessServiceName" . }} + replicas: {{ .Values.replicaCount }} + podManagementPolicy: {{ .Values.statefulset.podManagementPolicy }} + revisionHistoryLimit: {{ .Values.statefulset.revisionHistoryLimit }} + updateStrategy: + type: {{ .Values.statefulset.updateStrategy.type }} + {{- if eq .Values.statefulset.updateStrategy.type "RollingUpdate" }} + rollingUpdate: + partition: {{ .Values.statefulset.updateStrategy.rollingUpdate.partition }} + {{- end }} + selector: + matchLabels: + {{- include "devops-app-py.selectorLabels" . | nindent 6 }} + template: + {{- include "devops-app-py.podTemplate" . | nindent 4 }} + {{- if .Values.persistence.enabled }} + volumeClaimTemplates: + - metadata: + name: data-volume + labels: + {{- include "devops-app-py.labels" . | nindent 10 }} + spec: + accessModes: + {{- toYaml .Values.persistence.accessModes | nindent 10 }} + resources: + requests: + storage: {{ .Values.persistence.size }} + {{- if .Values.persistence.storageClass }} + storageClassName: {{ .Values.persistence.storageClass | quote }} + {{- end }} + {{- end }} +{{- end }} diff --git a/k8s/devops-app-py/values-statefulset.yaml b/k8s/devops-app-py/values-statefulset.yaml new file mode 100644 index 0000000000..09dd3868d2 --- /dev/null +++ b/k8s/devops-app-py/values-statefulset.yaml @@ -0,0 +1,36 @@ +replicaCount: 3 + +image: + tag: "1.12" + +deployment: + enabled: false + revisionHistoryLimit: 5 + +statefulset: + enabled: true + podManagementPolicy: OrderedReady + revisionHistoryLimit: 5 + updateStrategy: + type: RollingUpdate + rollingUpdate: + partition: 0 + +rollout: + enabled: false + +podAnnotations: + lab15-version: "stateful-v1" + +persistence: + enabled: true + mountPath: /data + accessModes: + - ReadWriteOnce + size: 100Mi + storageClass: "" + +service: + type: ClusterIP + port: 80 + targetPort: 5000 diff --git a/k8s/devops-app-py/values.yaml b/k8s/devops-app-py/values.yaml index 368afe6405..848751fe5a 100644 --- a/k8s/devops-app-py/values.yaml +++ b/k8s/devops-app-py/values.yaml @@ -15,11 +15,21 @@ podAnnotations: {} podLabels: {} deployment: + enabled: false revisionHistoryLimit: 5 strategy: maxSurge: 1 maxUnavailable: 0 +statefulset: + enabled: true + podManagementPolicy: OrderedReady + revisionHistoryLimit: 5 + updateStrategy: + type: RollingUpdate + rollingUpdate: + partition: 0 + rollout: enabled: false strategy: canary @@ -75,6 +85,8 @@ config: persistence: enabled: true mountPath: /data + accessModes: + - ReadWriteOnce size: 100Mi storageClass: "" diff --git a/k8s/docs/LAB15.md b/k8s/docs/LAB15.md new file mode 100644 index 0000000000..ab1d0041e8 --- /dev/null +++ b/k8s/docs/LAB15.md @@ -0,0 +1,441 @@ +# Kubernetes Lab 15 - StatefulSets and Persistent Storage + +Lab 15 converts the Helm chart's default workload from a Deployment to a StatefulSet so the Lab 12 visits counter can demonstrate stable pod identity and per-pod persistent storage. I used a separate `lab15` namespace and a direct Helm release named `lab15`, leaving the Lab 13 ArgoCD applications untouched. Those ArgoCD applications still target branch `lab13`, so this Lab 15 chart default change does not affect them unless their target revision is changed later. + +The chart is now version `0.7.0`. Default rendering creates a StatefulSet, a headless Service, the normal ClusterIP Service, and `volumeClaimTemplates`. Argo Rollouts mode still renders a Rollout and standalone PVC, and a Deployment fallback remains available with `statefulset.enabled=false` and `deployment.enabled=true`. + +## StatefulSet Concepts + +StatefulSets are useful when a workload needs identity or storage that belongs to a specific replica. Databases, queues, and distributed systems often need this. The Python app is not a database, but its `/data/visits` counter is a small, inspectable state file that makes the StatefulSet behavior easy to prove. + +| Feature | Deployment | StatefulSet | +| --- | --- | --- | +| Pod names | Random ReplicaSet suffixes | Stable ordinal names such as `app-0` | +| Storage | Usually shared or manually named PVCs | Per-pod PVCs from `volumeClaimTemplates` | +| Scaling | Any order | Ordered by default | +| Network identity | Service load balancing hides individual pods | Pod DNS names are stable through the headless Service | +| Best use | Stateless apps and progressive delivery | Stateful replicas that need stable identity or storage | + +A headless Service uses `clusterIP: None`. Instead of giving one virtual service IP, Kubernetes DNS publishes records for the selected pods. For this release the pattern is: + +```text +.lab15-devops-app-py-headless.lab15.svc.cluster.local +``` + +## Chart Implementation + +The main chart changes are: + +- `templates/statefulset.yaml` renders the default `apps/v1 StatefulSet`. +- `templates/service-headless.yaml` renders `lab15-devops-app-py-headless` with `clusterIP: None`. +- `values-statefulset.yaml` sets `replicaCount: 3`, image tag `1.12`, and the default `RollingUpdate` strategy. +- The shared pod template mounts `data-volume` in all modes, but StatefulSet mode gets that volume from `volumeClaimTemplates`; Rollout and Deployment modes still use the standalone PVC. + +The relevant values shape is: + +```yaml +deployment: + enabled: false + +statefulset: + enabled: true + podManagementPolicy: OrderedReady + revisionHistoryLimit: 5 + updateStrategy: + type: RollingUpdate + rollingUpdate: + partition: 0 + +persistence: + enabled: true + mountPath: /data + accessModes: + - ReadWriteOnce + size: 100Mi +``` + +
+static Helm checks + +```text +$ helm lint k8s/devops-app-py +==> Linting k8s/devops-app-py +[INFO] Chart.yaml: icon is recommended + +1 chart(s) linted, 0 chart(s) failed + +$ helm template lab15 k8s/devops-app-py --namespace lab15 -f k8s/devops-app-py/values-statefulset.yaml | rg "^kind:|serviceName:|volumeClaimTemplates:|clusterIP:|updateStrategy:|partition:" +kind: ServiceAccount +kind: Secret +kind: ConfigMap +kind: ConfigMap +kind: Service + clusterIP: None +kind: Service +kind: StatefulSet + serviceName: lab15-devops-app-py-headless + updateStrategy: + partition: 0 + volumeClaimTemplates: +kind: Job +kind: Job + +$ helm template lab15-rollout k8s/devops-app-py --namespace lab15 -f k8s/devops-app-py/values-rollout-canary.yaml | rg "^kind:|claimName:|volumeClaimTemplates:" +kind: ServiceAccount +kind: Secret +kind: ConfigMap +kind: ConfigMap +kind: PersistentVolumeClaim +kind: Service +kind: Rollout + claimName: lab15-rollout-devops-app-py-data +kind: Job +kind: Job + +$ helm template lab15-deploy k8s/devops-app-py --namespace lab15 --set statefulset.enabled=false --set deployment.enabled=true | rg "^kind:|claimName:|volumeClaimTemplates:" +kind: ServiceAccount +kind: Secret +kind: ConfigMap +kind: ConfigMap +kind: PersistentVolumeClaim +kind: Service +kind: Deployment + claimName: lab15-deploy-devops-app-py-data +kind: Job +kind: Job +``` + +
+ +## Cluster Setup + +The saved Docker-backed `minikube` profile existed but was stopped. A normal restart recovered it; no profile deletion was needed. The `standard` storage class is the minikube hostPath provisioner, which is sufficient for this local StatefulSet lab. + +
+cluster recovery and storage class + +```text +$ minikube status -p minikube +minikube +type: Control Plane +host: Stopped +kubelet: Stopped +apiserver: Stopped +kubeconfig: Stopped + + +$ minikube start -p minikube --driver=docker +* minikube v1.38.1 on Arch +* Using the docker driver based on existing profile +* Starting "minikube" primary control-plane node in "minikube" cluster +* Pulling base image v0.0.50 ... +* Verifying Kubernetes components... + - Using image gcr.io/k8s-minikube/storage-provisioner:v5 +* Enabled addons: default-storageclass, storage-provisioner +* Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default + +$ kubectl get nodes -o wide +NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME +minikube Ready control-plane 8d v1.35.1 192.168.49.2 Debian GNU/Linux 12 (bookworm) 7.0.3-1-cachyos docker://29.2.1 + +$ kubectl get storageclass +NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE +standard (default) k8s.io/minikube-hostpath Delete Immediate false 8d + +$ helm version --short +v4.1.4+g05fa379 +``` + +
+ +After installation, the StatefulSet created three ordered pods and three automatically named PVCs: + +
+StatefulSet, services, and PVCs + +```text +$ kubectl wait --for=condition=Ready pod -l app.kubernetes.io/instance=lab15 -n lab15 +pod/lab15-devops-app-py-0 condition met +pod/lab15-devops-app-py-1 condition met +pod/lab15-devops-app-py-2 condition met + +$ kubectl get po,sts,svc,pvc -n lab15 -o wide +NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES +pod/lab15-devops-app-py-0 1/1 Running 0 67s 10.244.0.65 minikube +pod/lab15-devops-app-py-1 1/1 Running 0 16s 10.244.0.66 minikube +pod/lab15-devops-app-py-2 1/1 Running 0 9s 10.244.0.67 minikube + +NAME READY AGE CONTAINERS IMAGES +statefulset.apps/lab15-devops-app-py 3/3 67s devops-app-py localt0aster/devops-app-py:1.12 + +NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR +service/lab15-devops-app-py-headless ClusterIP None 80/TCP 67s app.kubernetes.io/instance=lab15,app.kubernetes.io/name=devops-app-py +service/lab15-devops-app-py-service ClusterIP 10.96.64.122 80/TCP 67s app.kubernetes.io/instance=lab15,app.kubernetes.io/name=devops-app-py + +NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE VOLUMEMODE +persistentvolumeclaim/data-volume-lab15-devops-app-py-0 Bound pvc-fb42ff13-ec37-4604-9833-84381c98e194 100Mi RWO standard 67s Filesystem +persistentvolumeclaim/data-volume-lab15-devops-app-py-1 Bound pvc-e2f72f28-1577-4b27-82b4-e5b0eb001d88 100Mi RWO standard 16s Filesystem +persistentvolumeclaim/data-volume-lab15-devops-app-py-2 Bound pvc-32239c77-37ff-4eb5-89a4-86f1be4a84e7 100Mi RWO standard 9s Filesystem +``` + +
+ +## Network Identity + +The application image includes BusyBox tooling, so I could run DNS checks directly from pod 0. Pod 1 and pod 2 both resolve through the headless Service using their stable ordinal DNS names. + +
+pod DNS resolution + +```text +$ kubectl exec -n lab15 lab15-devops-app-py-0 -- nslookup lab15-devops-app-py-1.lab15-devops-app-py-headless.lab15.svc.cluster.local +Server: 10.96.0.10 +Address: 10.96.0.10:53 + + +Name: lab15-devops-app-py-1.lab15-devops-app-py-headless.lab15.svc.cluster.local +Address: 10.244.0.66 + + +$ kubectl exec -n lab15 lab15-devops-app-py-0 -- nslookup lab15-devops-app-py-2.lab15-devops-app-py-headless.lab15.svc.cluster.local +Server: 10.96.0.10 +Address: 10.96.0.10:53 + + +Name: lab15-devops-app-py-2.lab15-devops-app-py-headless.lab15.svc.cluster.local +Address: 10.244.0.67 +``` + +
+ +## Per-Pod Storage + +I port-forwarded each pod directly and hit `/` a different number of times. Each pod kept its own `/data/visits` file, proving that the PVCs are per ordinal rather than shared behind the normal Service. + +
+per-pod visit counters + +```text +$ kubectl port-forward pod/lab15-devops-app-py-0 -n lab15 18080:5000 +$ kubectl port-forward pod/lab15-devops-app-py-1 -n lab15 18081:5000 +$ kubectl port-forward pod/lab15-devops-app-py-2 -n lab15 18082:5000 + +$ curl -sS 127.0.0.1:18080/visits | jq . +{ + "visits": 0 +} + +$ curl -sS 127.0.0.1:18081/visits | jq . +{ + "visits": 0 +} + +$ curl -sS 127.0.0.1:18082/visits | jq . +{ + "visits": 0 +} + +$ curl -sS 127.0.0.1:18080/ >/dev/null + +$ curl -sS 127.0.0.1:18080/ >/dev/null + +$ curl -sS 127.0.0.1:18081/ >/dev/null + +$ curl -sS 127.0.0.1:18082/ >/dev/null + +$ curl -sS 127.0.0.1:18082/ >/dev/null + +$ curl -sS 127.0.0.1:18082/ >/dev/null + +$ curl -sS 127.0.0.1:18080/visits | jq . +{ + "visits": 2 +} + +$ curl -sS 127.0.0.1:18081/visits | jq . +{ + "visits": 1 +} + +$ curl -sS 127.0.0.1:18082/visits | jq . +{ + "visits": 3 +} +``` + +
+ +Deleting pod 0 changed its IP address but preserved the visit count because the replacement pod reused `data-volume-lab15-devops-app-py-0`. + +
+persistence after pod deletion + +```text +$ kubectl exec -n lab15 lab15-devops-app-py-0 -- cat /data/visits +2 + +$ kubectl delete pod -n lab15 lab15-devops-app-py-0 +pod "lab15-devops-app-py-0" deleted from lab15 namespace + +$ kubectl wait --for=condition=Ready pod/lab15-devops-app-py-0 -n lab15 +pod/lab15-devops-app-py-0 condition met + +$ kubectl get pod -n lab15 lab15-devops-app-py-0 -o wide +NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES +lab15-devops-app-py-0 1/1 Running 0 7s 10.244.0.68 minikube + +$ kubectl exec -n lab15 lab15-devops-app-py-0 -- cat /data/visits +2 +``` + +
+ +## Bonus - Update Strategies + +With `RollingUpdate` and `partition: 2`, only pods with ordinal `>= 2` update. The annotation change below moved pod 2 to `partition-v2`; pods 0 and 1 stayed on `stateful-v1`. + +
+partitioned RollingUpdate + +```text +$ cat /tmp/lab15/partition.values.yaml +podAnnotations: + lab15-version: partition-v2 +statefulset: + updateStrategy: + type: RollingUpdate + rollingUpdate: + partition: 2 + +$ helm upgrade lab15 k8s/devops-app-py -n lab15 -f k8s/devops-app-py/values-statefulset.yaml -f /tmp/lab15/partition.values.yaml +Release "lab15" has been upgraded. Happy Helming! +NAME: lab15 +LAST DEPLOYED: Thu May 7 20:22:57 2026 +NAMESPACE: lab15 +STATUS: deployed +REVISION: 3 +DESCRIPTION: Upgrade complete +TEST SUITE: None +$ kubectl get pods -n lab15 -l app.kubernetes.io/instance=lab15 -o json | jq -r ... +lab15-devops-app-py-0 stateful-v1 2026-05-07T17:21:33Z +lab15-devops-app-py-1 stateful-v1 2026-05-07T17:19:58Z +lab15-devops-app-py-2 partition-v2 2026-05-07T17:22:07Z + +$ kubectl get sts lab15-devops-app-py -n lab15 -o json | jq ... +{ + "currentRevision": "lab15-devops-app-py-5d8fd446ff", + "updateRevision": "lab15-devops-app-py-5bb76d9794", + "currentReplicas": 2, + "updatedReplicas": 1, + "readyReplicas": 3 +} +``` + +
+ +`OnDelete` is useful when an operator wants to control exactly when each stateful replica restarts. After switching to `OnDelete`, no existing pod picked up `ondelete-v3`. Only the manually deleted ordinal 1 was recreated with the new annotation. + +
+OnDelete update strategy + +```text +$ cat /tmp/lab15/rolling-all.values.yaml +podAnnotations: + lab15-version: partition-v2 +statefulset: + updateStrategy: + type: RollingUpdate + rollingUpdate: + partition: 0 + +$ helm upgrade lab15 k8s/devops-app-py -n lab15 -f k8s/devops-app-py/values-statefulset.yaml -f /tmp/lab15/rolling-all.values.yaml +Release "lab15" has been upgraded. Happy Helming! +NAME: lab15 +LAST DEPLOYED: Thu May 7 20:24:40 2026 +NAMESPACE: lab15 +STATUS: deployed +REVISION: 6 +DESCRIPTION: Upgrade complete +TEST SUITE: None + +$ kubectl get pods -n lab15 -l app.kubernetes.io/instance=lab15 -o json | jq -r ... +lab15-devops-app-py-0 partition-v2 2026-05-07T17:23:44Z +lab15-devops-app-py-1 partition-v2 2026-05-07T17:24:42Z +lab15-devops-app-py-2 partition-v2 2026-05-07T17:22:07Z + +$ cat /tmp/lab15/ondelete.values.yaml +podAnnotations: + lab15-version: ondelete-v3 +statefulset: + updateStrategy: + type: OnDelete + +$ helm upgrade lab15 k8s/devops-app-py -n lab15 -f k8s/devops-app-py/values-statefulset.yaml -f /tmp/lab15/ondelete.values.yaml +Release "lab15" has been upgraded. Happy Helming! +NAME: lab15 +LAST DEPLOYED: Thu May 7 20:24:43 2026 +NAMESPACE: lab15 +STATUS: deployed +REVISION: 7 +DESCRIPTION: Upgrade complete +TEST SUITE: None + +$ kubectl get pods -n lab15 -l app.kubernetes.io/instance=lab15 -o json | jq -r ... +lab15-devops-app-py-0 partition-v2 2026-05-07T17:23:44Z +lab15-devops-app-py-1 partition-v2 2026-05-07T17:24:42Z +lab15-devops-app-py-2 partition-v2 2026-05-07T17:22:07Z + +$ kubectl delete pod -n lab15 lab15-devops-app-py-1 +pod "lab15-devops-app-py-1" deleted from lab15 namespace + +$ kubectl wait --for=condition=Ready pod/lab15-devops-app-py-1 -n lab15 +pod/lab15-devops-app-py-1 condition met + +$ kubectl get pods -n lab15 -l app.kubernetes.io/instance=lab15 -o json | jq -r ... +lab15-devops-app-py-0 partition-v2 2026-05-07T17:23:44Z +lab15-devops-app-py-1 ondelete-v3 2026-05-07T17:25:15Z +lab15-devops-app-py-2 partition-v2 2026-05-07T17:22:07Z +``` + +
+ +## Final State + +After the bonus tests, I restored the release to the default Lab 15 values: `RollingUpdate`, partition `0`, and `lab15-version=stateful-v1`. All three pods are ready and all three PVCs remain bound. + +
+final healthy state + +```text +$ kubectl wait --for=condition=Ready pod -l app.kubernetes.io/instance=lab15 -n lab15 +pod/lab15-devops-app-py-0 condition met +pod/lab15-devops-app-py-1 condition met +pod/lab15-devops-app-py-2 condition met + +$ kubectl get po,sts,svc,pvc -n lab15 -o wide +NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES +pod/lab15-devops-app-py-0 1/1 Running 0 17s 10.244.0.77 minikube +pod/lab15-devops-app-py-1 1/1 Running 0 25s 10.244.0.76 minikube +pod/lab15-devops-app-py-2 1/1 Running 0 32s 10.244.0.75 minikube + +NAME READY AGE CONTAINERS IMAGES +statefulset.apps/lab15-devops-app-py 3/3 7m1s devops-app-py localt0aster/devops-app-py:1.12 + +NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR +service/lab15-devops-app-py-headless ClusterIP None 80/TCP 7m1s app.kubernetes.io/instance=lab15,app.kubernetes.io/name=devops-app-py +service/lab15-devops-app-py-service ClusterIP 10.96.64.122 80/TCP 7m1s app.kubernetes.io/instance=lab15,app.kubernetes.io/name=devops-app-py + +NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE VOLUMEMODE +persistentvolumeclaim/data-volume-lab15-devops-app-py-0 Bound pvc-fb42ff13-ec37-4604-9833-84381c98e194 100Mi RWO standard 7m1s Filesystem +persistentvolumeclaim/data-volume-lab15-devops-app-py-1 Bound pvc-e2f72f28-1577-4b27-82b4-e5b0eb001d88 100Mi RWO standard 6m10s Filesystem +persistentvolumeclaim/data-volume-lab15-devops-app-py-2 Bound pvc-32239c77-37ff-4eb5-89a4-86f1be4a84e7 100Mi RWO standard 6m3s Filesystem + +$ kubectl get pods -n lab15 -l app.kubernetes.io/instance=lab15 -o json | jq -r ... +lab15-devops-app-py-0 stateful-v1 Running +lab15-devops-app-py-1 stateful-v1 Running +lab15-devops-app-py-2 stateful-v1 Running +``` + +
+ +The Lab 15 checklist is complete: StatefulSet guarantees are documented, the chart renders a StatefulSet with `volumeClaimTemplates`, the headless Service resolves pod identities, each pod has its own PVC-backed visit counter, pod deletion preserves data, and both bonus update strategies were implemented and verified. From f26a5d0aeb6cfc20ad986bab8a0718b683d75bb4 Mon Sep 17 00:00:00 2001 From: LocalT0aster Dan <90502400+LocalT0aster@users.noreply.github.com> Date: Thu, 7 May 2026 21:39:56 +0300 Subject: [PATCH 16/21] Lab16 Complete (#16) * Complete Lab 16 monitoring --- k8s/MONITORING.md | 29 ++ k8s/README.md | 3 + k8s/devops-app-py/Chart.yaml | 2 +- k8s/devops-app-py/templates/_helpers.tpl | 14 +- .../templates/service-monitor.yaml | 20 + k8s/devops-app-py/templates/statefulset.yaml | 4 + k8s/devops-app-py/values-lab16.yaml | 63 +++ k8s/devops-app-py/values.yaml | 12 + k8s/docs/LAB16.md | 443 ++++++++++++++++++ k8s/docs/img/lab16_alertmanager_alerts.png | Bin 0 -> 34753 bytes k8s/docs/img/lab16_grafana_kubelet.png | Bin 0 -> 124860 bytes k8s/docs/img/lab16_grafana_node_metrics.png | Bin 0 -> 120178 bytes .../lab16_grafana_statefulset_resources.png | Bin 0 -> 78249 bytes k8s/docs/img/lab16_prometheus_app_metrics.png | Bin 0 -> 86323 bytes 14 files changed, 587 insertions(+), 3 deletions(-) create mode 100644 k8s/MONITORING.md create mode 100644 k8s/devops-app-py/templates/service-monitor.yaml create mode 100644 k8s/devops-app-py/values-lab16.yaml create mode 100644 k8s/docs/LAB16.md create mode 100644 k8s/docs/img/lab16_alertmanager_alerts.png create mode 100644 k8s/docs/img/lab16_grafana_kubelet.png create mode 100644 k8s/docs/img/lab16_grafana_node_metrics.png create mode 100644 k8s/docs/img/lab16_grafana_statefulset_resources.png create mode 100644 k8s/docs/img/lab16_prometheus_app_metrics.png diff --git a/k8s/MONITORING.md b/k8s/MONITORING.md new file mode 100644 index 0000000000..dc432604cc --- /dev/null +++ b/k8s/MONITORING.md @@ -0,0 +1,29 @@ +# Monitoring Notes + +This file is the Lab 16 entry point for Kubernetes monitoring and init containers. + +## Lab 16 Documentation + +The full report is in [docs/LAB16.md](docs/LAB16.md). It includes: + +- kube-prometheus-stack component descriptions and installation evidence. +- Grafana dashboard answers for pod resources, namespace CPU, node metrics, kubelet counts, default namespace network traffic, and active alerts. +- Init container implementation and proof that the main container can read the downloaded file. +- Bonus ServiceMonitor configuration and Prometheus query evidence for the app's `/metrics` endpoint. + +## Screenshots + +- [Grafana StatefulSet resources](docs/img/lab16_grafana_statefulset_resources.png) +- [Grafana node metrics](docs/img/lab16_grafana_node_metrics.png) +- [Grafana kubelet dashboard](docs/img/lab16_grafana_kubelet.png) +- [Alertmanager active alerts](docs/img/lab16_alertmanager_alerts.png) +- [Prometheus application metrics](docs/img/lab16_prometheus_app_metrics.png) + +## Current Results + +- Monitoring stack: `monitoring` Helm release on kube-prometheus-stack `84.5.0`. +- App release: existing `lab15` StatefulSet release upgraded with chart `devops-app-py` `0.8.0`. +- Init containers: `wait-for-headless-service` and `init-download`, both completed successfully. +- ServiceMonitor: `lab15-devops-app-py` in namespace `lab15`, labeled `release: monitoring`. +- Prometheus targets: six healthy app targets because both normal and headless Services match the ServiceMonitor selector. + diff --git a/k8s/README.md b/k8s/README.md index 309548a499..cfccccea39 100644 --- a/k8s/README.md +++ b/k8s/README.md @@ -9,6 +9,7 @@ The main deployment assets are: - `devops-app-py/`: Helm chart version of the application deployment. - `ROLLOUTS.md`: compatibility entry point for the Lab 14 Argo Rollouts report. - `STATEFULSET.md`: compatibility entry point for the Lab 15 StatefulSet report. +- `MONITORING.md`: compatibility entry point for the Lab 16 monitoring and init container report. - `docs/`: lab documentation split by assignment. ## Documentation @@ -19,6 +20,7 @@ The main deployment assets are: - [ArgoCD Notes](ARGOCD.md) - [Argo Rollouts Notes](ROLLOUTS.md) - [StatefulSet Notes](STATEFULSET.md) +- [Monitoring Notes](MONITORING.md) - [Lab 09 - Kubernetes Basics](docs/LAB09.md) - [Lab 10 - Helm Package Manager](docs/LAB10.md) - [Lab 11 - Kubernetes Secrets and Vault](docs/LAB11.md) @@ -26,3 +28,4 @@ The main deployment assets are: - [Lab 13 - GitOps with ArgoCD](docs/LAB13.md) - [Lab 14 - Progressive Delivery with Argo Rollouts](docs/LAB14.md) - [Lab 15 - StatefulSets and Persistent Storage](docs/LAB15.md) +- [Lab 16 - Monitoring and Init Containers](docs/LAB16.md) diff --git a/k8s/devops-app-py/Chart.yaml b/k8s/devops-app-py/Chart.yaml index 410998ccc3..426715c77c 100644 --- a/k8s/devops-app-py/Chart.yaml +++ b/k8s/devops-app-py/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: devops-app-py description: Helm chart for the DevOps Core Python application type: application -version: 0.7.0 +version: 0.8.0 appVersion: "1.12.0" keywords: - python diff --git a/k8s/devops-app-py/templates/_helpers.tpl b/k8s/devops-app-py/templates/_helpers.tpl index db3af83918..6862f4fde5 100644 --- a/k8s/devops-app-py/templates/_helpers.tpl +++ b/k8s/devops-app-py/templates/_helpers.tpl @@ -147,6 +147,10 @@ metadata: {{- end }} spec: serviceAccountName: {{ include "devops-app-py.serviceAccountName" . }} + {{- with .Values.initContainers }} + initContainers: + {{- toYaml . | nindent 4 }} + {{- end }} containers: - name: {{ include "devops-app-py.name" . }} image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" @@ -155,7 +159,7 @@ spec: - name: http containerPort: {{ .Values.containerPort }} protocol: TCP - {{- if or .Values.config.file.enabled .Values.persistence.enabled }} + {{- if or .Values.config.file.enabled .Values.persistence.enabled .Values.extraVolumeMounts }} volumeMounts: {{- if .Values.config.file.enabled }} - name: config-volume @@ -166,6 +170,9 @@ spec: - name: data-volume mountPath: {{ .Values.persistence.mountPath | quote }} {{- end }} + {{- with .Values.extraVolumeMounts }} + {{- toYaml . | nindent 8 }} + {{- end }} {{- end }} {{- if or .Values.config.env.enabled .Values.secrets.enabled }} envFrom: @@ -194,7 +201,7 @@ spec: resources: {{- toYaml . | nindent 8 }} {{- end }} - {{- if or .Values.config.file.enabled (and .Values.persistence.enabled (not $usesStatefulSet)) }} + {{- if or .Values.config.file.enabled (and .Values.persistence.enabled (not $usesStatefulSet)) .Values.extraVolumes }} volumes: {{- if .Values.config.file.enabled }} - name: config-volume @@ -206,6 +213,9 @@ spec: persistentVolumeClaim: claimName: {{ include "devops-app-py.pvcName" . }} {{- end }} + {{- with .Values.extraVolumes }} + {{- toYaml . | nindent 4 }} + {{- end }} {{- end }} {{- end }} diff --git a/k8s/devops-app-py/templates/service-monitor.yaml b/k8s/devops-app-py/templates/service-monitor.yaml new file mode 100644 index 0000000000..73278e6cfb --- /dev/null +++ b/k8s/devops-app-py/templates/service-monitor.yaml @@ -0,0 +1,20 @@ +{{- if .Values.serviceMonitor.enabled }} +apiVersion: monitoring.coreos.com/v1 +kind: ServiceMonitor +metadata: + name: {{ include "devops-app-py.fullname" . }} + labels: + {{- include "devops-app-py.labels" . | nindent 4 }} + {{- with .Values.serviceMonitor.labels }} + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + selector: + matchLabels: + {{- include "devops-app-py.selectorLabels" . | nindent 6 }} + endpoints: + - port: http + path: {{ .Values.serviceMonitor.path | quote }} + interval: {{ .Values.serviceMonitor.interval | quote }} + scrapeTimeout: {{ .Values.serviceMonitor.scrapeTimeout | quote }} +{{- end }} diff --git a/k8s/devops-app-py/templates/statefulset.yaml b/k8s/devops-app-py/templates/statefulset.yaml index b192bc13da..084c3c7e8a 100644 --- a/k8s/devops-app-py/templates/statefulset.yaml +++ b/k8s/devops-app-py/templates/statefulset.yaml @@ -26,7 +26,11 @@ spec: - metadata: name: data-volume labels: + {{- if .Values.statefulset.volumeClaimTemplateLabels }} + {{- toYaml .Values.statefulset.volumeClaimTemplateLabels | nindent 10 }} + {{- else }} {{- include "devops-app-py.labels" . | nindent 10 }} + {{- end }} spec: accessModes: {{- toYaml .Values.persistence.accessModes | nindent 10 }} diff --git a/k8s/devops-app-py/values-lab16.yaml b/k8s/devops-app-py/values-lab16.yaml new file mode 100644 index 0000000000..bccd95fab1 --- /dev/null +++ b/k8s/devops-app-py/values-lab16.yaml @@ -0,0 +1,63 @@ +image: + tag: "1.12" + +podAnnotations: + lab15-version: "stateful-v1" + lab16-init-demo: "enabled" + +statefulset: + # Preserve the already-created Lab 15 volumeClaimTemplates metadata. Kubernetes + # rejects StatefulSet upgrades that change claim template labels. + volumeClaimTemplateLabels: + helm.sh/chart: devops-app-py-0.7.0 + app.kubernetes.io/name: devops-app-py + app.kubernetes.io/instance: lab15 + app.kubernetes.io/version: "1.12" + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/part-of: devops-core-s26 + +initContainers: + - name: wait-for-headless-service + image: busybox:1.37.0 + imagePullPolicy: IfNotPresent + command: + - sh + - -c + - | + set -eu + until nslookup lab15-devops-app-py-headless.lab15.svc.cluster.local; do + echo "waiting for headless service" + sleep 2 + done + echo "headless service resolved" + - name: init-download + image: busybox:1.37.0 + imagePullPolicy: IfNotPresent + command: + - sh + - -c + - | + set -eu + wget -O /init-data/lab16-init.txt http://lab15-devops-app-py-service.lab15.svc.cluster.local/ready + echo >> /init-data/lab16-init.txt + echo "downloaded-by=init-download" >> /init-data/lab16-init.txt + volumeMounts: + - name: init-data + mountPath: /init-data + +extraVolumes: + - name: init-data + emptyDir: {} + +extraVolumeMounts: + - name: init-data + mountPath: /init-data + readOnly: true + +serviceMonitor: + enabled: true + labels: + release: monitoring + path: /metrics + interval: 15s + scrapeTimeout: 10s diff --git a/k8s/devops-app-py/values.yaml b/k8s/devops-app-py/values.yaml index 848751fe5a..62385832e9 100644 --- a/k8s/devops-app-py/values.yaml +++ b/k8s/devops-app-py/values.yaml @@ -14,6 +14,17 @@ fullnameOverride: "" podAnnotations: {} podLabels: {} +initContainers: [] +extraVolumes: [] +extraVolumeMounts: [] + +serviceMonitor: + enabled: false + labels: {} + path: /metrics + interval: 30s + scrapeTimeout: 10s + deployment: enabled: false revisionHistoryLimit: 5 @@ -25,6 +36,7 @@ statefulset: enabled: true podManagementPolicy: OrderedReady revisionHistoryLimit: 5 + volumeClaimTemplateLabels: {} updateStrategy: type: RollingUpdate rollingUpdate: diff --git a/k8s/docs/LAB16.md b/k8s/docs/LAB16.md new file mode 100644 index 0000000000..857b37b87d --- /dev/null +++ b/k8s/docs/LAB16.md @@ -0,0 +1,443 @@ +# Kubernetes Lab 16 - Monitoring and Init Containers + +Lab 16 adds a kube-prometheus-stack monitoring installation to the existing Lab 15 StatefulSet release and implements init container support in the Helm chart. I kept the application release in the `lab15` namespace so the StatefulSet, PVCs, and stable pod identities from Lab 15 remain the monitored workload. + +The monitoring stack is installed as Helm release `monitoring` in namespace `monitoring`, pinned to kube-prometheus-stack chart `84.5.0`. The chart version for `devops-app-py` is now `0.8.0`. + +## Stack Components + +| Component | Role in this lab | +| ------------------- | -------------------------------------------------------------------------------------------- | +| Prometheus Operator | Reconciles Prometheus, Alertmanager, ServiceMonitor, and rule CRDs into running workloads. | +| Prometheus | Scrapes Kubernetes, node, and application metrics, then answers PromQL queries. | +| Alertmanager | Receives firing alerts from Prometheus and groups them in the Alertmanager UI. | +| Grafana | Provides dashboards for pod, namespace, node, kubelet, and persistent volume metrics. | +| kube-state-metrics | Exposes Kubernetes object state such as pod resources, StatefulSet status, and PVC metadata. | +| node-exporter | Exposes host CPU, memory, disk, and filesystem metrics from the minikube node. | + +## Chart Implementation + +The Helm chart now supports: + +- `initContainers`: raw Kubernetes init container specs rendered into the shared pod template. +- `extraVolumes` and `extraVolumeMounts`: reusable shared volumes for init and main containers. +- `serviceMonitor.enabled`: optional `monitoring.coreos.com/v1 ServiceMonitor` rendering. +- `statefulset.volumeClaimTemplateLabels`: an upgrade escape hatch for existing StatefulSets, because Kubernetes forbids changes to `volumeClaimTemplates`. + +The Lab 16 values file adds two init containers: + +- `wait-for-headless-service` waits until `lab15-devops-app-py-headless.lab15.svc.cluster.local` resolves. +- `init-download` uses BusyBox `wget` to save the app service's `/ready` response into `/init-data/lab16-init.txt`, an `emptyDir` volume mounted read-only by the main app container. + +I used the in-cluster `/ready` endpoint instead of an external URL so the init container proves the download pattern without depending on outside network access. + +## Static Checks + +
+Helm render checks + +```text +$ helm lint k8s/devops-app-py +==> Linting k8s/devops-app-py +[INFO] Chart.yaml: icon is recommended + +1 chart(s) linted, 0 chart(s) failed + +$ helm template lab15 k8s/devops-app-py --namespace lab15 -f k8s/devops-app-py/values-statefulset.yaml -f k8s/devops-app-py/values-lab16.yaml | rg "helm.sh/chart|volumeClaimTemplates:|initContainers:|ServiceMonitor|release: monitoring" + helm.sh/chart: devops-app-py-0.8.0 + helm.sh/chart: devops-app-py-0.8.0 + helm.sh/chart: devops-app-py-0.8.0 + helm.sh/chart: devops-app-py-0.8.0 + helm.sh/chart: devops-app-py-0.8.0 + helm.sh/chart: devops-app-py-0.8.0 + helm.sh/chart: devops-app-py-0.8.0 + initContainers: + volumeClaimTemplates: + helm.sh/chart: devops-app-py-0.7.0 +kind: ServiceMonitor + helm.sh/chart: devops-app-py-0.8.0 + release: monitoring + helm.sh/chart: devops-app-py-0.8.0 + helm.sh/chart: devops-app-py-0.8.0 +``` + +
+ +The `volumeClaimTemplates` chart label remains `devops-app-py-0.7.0` only in `values-lab16.yaml` for the already-created Lab 15 StatefulSet. Without that compatibility label, Kubernetes rejects the upgrade because the rendered claim template metadata changes. + +## Monitoring Install + +The first install succeeded, but several images initially pulled from `quay.io` slowly or failed transiently. To make the local minikube install repeatable, I upgraded the same chart version with equivalent Docker Hub and GHCR image names and preloaded those images into minikube. + +
+Monitoring release and final readiness + +```text +$ helm upgrade monitoring prometheus-community/kube-prometheus-stack --version 84.5.0 -n monitoring -f /tmp/lab16/monitoring.values.yaml +Release "monitoring" has been upgraded. Happy Helming! +NAME: monitoring +LAST DEPLOYED: Thu May 7 21:17:29 2026 +NAMESPACE: monitoring +STATUS: deployed +REVISION: 2 +DESCRIPTION: Upgrade complete +TEST SUITE: None + +$ kubectl get pods,statefulsets,deployments,daemonsets -n monitoring -o wide +NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES +pod/alertmanager-monitoring-kube-prometheus-alertmanager-0 2/2 Running 0 14s 10.244.0.91 minikube +pod/monitoring-grafana-785747497f-lkmxf 3/3 Running 0 26s 10.244.0.87 minikube +pod/monitoring-kube-prometheus-operator-cf8cf4744-ml69q 1/1 Running 0 26s 10.244.0.86 minikube +pod/monitoring-kube-state-metrics-5957bd45bc-n84lk 1/1 Running 0 5m55s 10.244.0.79 minikube +pod/monitoring-prometheus-node-exporter-qq9q6 1/1 Running 0 25s 192.168.49.2 minikube +pod/prometheus-monitoring-kube-prometheus-prometheus-0 2/2 Running 0 24s 10.244.0.89 minikube + +NAME READY AGE CONTAINERS IMAGES +statefulset.apps/alertmanager-monitoring-kube-prometheus-alertmanager 1/1 2m30s alertmanager,config-reloader docker.io/prom/alertmanager:v0.32.1,ghcr.io/prometheus-operator/prometheus-config-reloader:v0.90.1 +statefulset.apps/prometheus-monitoring-kube-prometheus-prometheus 1/1 2m30s prometheus,config-reloader docker.io/prom/prometheus:v3.11.3,ghcr.io/prometheus-operator/prometheus-config-reloader:v0.90.1 + +NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR +deployment.apps/monitoring-grafana 1/1 1 1 5m55s grafana-sc-dashboard,grafana-sc-datasources,grafana docker.io/kiwigrid/k8s-sidecar:2.7.1,docker.io/kiwigrid/k8s-sidecar:2.7.1,docker.io/grafana/grafana:13.0.1 app.kubernetes.io/instance=monitoring,app.kubernetes.io/name=grafana +deployment.apps/monitoring-kube-prometheus-operator 1/1 1 1 5m55s kube-prometheus-stack ghcr.io/prometheus-operator/prometheus-operator:v0.90.1 app=kube-prometheus-stack-operator,release=monitoring +deployment.apps/monitoring-kube-state-metrics 1/1 1 1 5m55s kube-state-metrics registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.18.0 app.kubernetes.io/instance=monitoring,app.kubernetes.io/name=kube-state-metrics + +NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR +daemonset.apps/monitoring-prometheus-node-exporter 1 1 1 1 1 kubernetes.io/os=linux 5m55s node-exporter docker.io/prom/node-exporter:v1.11.1 app.kubernetes.io/instance=monitoring,app.kubernetes.io/name=prometheus-node-exporter + +$ kubectl get prometheus,alertmanager -n monitoring +NAME VERSION DESIRED READY RECONCILED AVAILABLE AGE +prometheus.monitoring.coreos.com/monitoring-kube-prometheus-prometheus v3.11.3 1 1 True True 5m55s + +NAME VERSION REPLICAS READY RECONCILED AVAILABLE AGE +alertmanager.monitoring.coreos.com/monitoring-kube-prometheus-alertmanager v0.32.1 1 1 True True 5m55s +``` + +
+ +## Init Container Proof + +
+StatefulSet upgrade and init output + +```text +$ helm status lab15 -n lab15 +NAME: lab15 +LAST DEPLOYED: Thu May 7 21:18:53 2026 +NAMESPACE: lab15 +STATUS: deployed +REVISION: 10 +DESCRIPTION: Upgrade complete + +$ kubectl get pods,statefulsets,svc,pvc,servicemonitor -n lab15 -o wide +NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES +pod/lab15-devops-app-py-0 1/1 Running 0 15s 10.244.0.94 minikube +pod/lab15-devops-app-py-1 1/1 Running 0 25s 10.244.0.93 minikube +pod/lab15-devops-app-py-2 1/1 Running 0 35s 10.244.0.92 minikube + +NAME READY AGE CONTAINERS IMAGES +statefulset.apps/lab15-devops-app-py 3/3 60m devops-app-py localt0aster/devops-app-py:1.12 + +NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR +service/lab15-devops-app-py-headless ClusterIP None 80/TCP 60m app.kubernetes.io/instance=lab15,app.kubernetes.io/name=devops-app-py +service/lab15-devops-app-py-service ClusterIP 10.96.64.122 80/TCP 60m app.kubernetes.io/instance=lab15,app.kubernetes.io/name=devops-app-py + +NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE VOLUMEMODE +persistentvolumeclaim/data-volume-lab15-devops-app-py-0 Bound pvc-fb42ff13-ec37-4604-9833-84381c98e194 100Mi RWO standard 60m Filesystem +persistentvolumeclaim/data-volume-lab15-devops-app-py-1 Bound pvc-e2f72f28-1577-4b27-82b4-e5b0eb001d88 100Mi RWO standard 59m Filesystem +persistentvolumeclaim/data-volume-lab15-devops-app-py-2 Bound pvc-32239c77-37ff-4eb5-89a4-86f1be4a84e7 100Mi RWO standard 59m Filesystem + +NAME AGE +servicemonitor.monitoring.coreos.com/lab15-devops-app-py 77s + +$ kubectl get pod lab15-devops-app-py-0 -n lab15 -o json | jq '{name: .metadata.name, initContainers: [.status.initContainerStatuses[] | {name, ready, restartCount, state}], containerImages: [.spec.containers[] | {name, image}], annotations: .metadata.annotations}' +{ + "name": "lab15-devops-app-py-0", + "initContainers": [ + { + "name": "wait-for-headless-service", + "ready": true, + "restartCount": 0, + "state": { + "terminated": { + "exitCode": 0, + "reason": "Completed" + } + } + }, + { + "name": "init-download", + "ready": true, + "restartCount": 0, + "state": { + "terminated": { + "exitCode": 0, + "reason": "Completed" + } + } + } + ], + "containerImages": [ + { + "name": "devops-app-py", + "image": "localt0aster/devops-app-py:1.12" + } + ], + "annotations": { + "lab15-version": "stateful-v1", + "lab16-init-demo": "enabled" + } +} + +$ kubectl logs -n lab15 lab15-devops-app-py-0 -c wait-for-headless-service +Name: lab15-devops-app-py-headless.lab15.svc.cluster.local +Address: 10.244.0.92 +Name: lab15-devops-app-py-headless.lab15.svc.cluster.local +Address: 10.244.0.93 + +headless service resolved + +$ kubectl logs -n lab15 lab15-devops-app-py-0 -c init-download +Connecting to lab15-devops-app-py-service.lab15.svc.cluster.local (10.96.64.122:80) +saving to '/init-data/lab16-init.txt' +lab16-init.txt 100% |********************************| 86 0:00:00 ETA +'/init-data/lab16-init.txt' saved + +$ kubectl exec -n lab15 lab15-devops-app-py-0 -- sed -n '1,8p' /init-data/lab16-init.txt +{"status":"ready","timestamp":"2026-05-07T18:19:16.092960+00:00","uptime_seconds":13} + +downloaded-by=init-download +``` + +
+ +## Dashboard Answers + +I used Grafana for the dashboard views and Prometheus queries for exact values where the Grafana panel aggregated or omitted raw numbers. The default namespace had no pods at capture time, so the "default namespace" CPU and network questions have an empty result. + +| Question | Answer | +| -------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Pod resources for the StatefulSet | `lab15-devops-app-py-0`, `-1`, and `-2` were about `0.63` to `0.72` millicores and `42.48` to `43.18` MiB working set. The Grafana quota panel also showed each pod requesting `0.100` CPU and limiting at `0.250` CPU. | +| Pods using most/least CPU in `default` | There were no pods in `default`, so there was no most/least CPU consumer. | +| Node metrics | Minikube node memory was about `35.99%` used, or `14323.58` MiB, with `8` logical CPU cores. | +| Kubelet | Kubelet reported `31` running pods and `66` running containers. | +| Network traffic in `default` | No `default` namespace pods existed, so the network query returned no series. | +| Alerts | Alertmanager had `5` active alerts: `Watchdog` plus kube-system alerts including `TargetDown` and `etcdInsufficientMembers`. | + +
+Dashboard answer queries + +```text +$ kubectl get pods -n default +No resources found in default namespace. + +$ curl -fsS -G 127.0.0.1:9090/api/v1/query --data-urlencode 'query=sum by (pod) (rate(container_cpu_usage_seconds_total{namespace="lab15", pod=~"lab15-devops-app-py-.*"}[5m])) * 1000' | jq '[.data.result[] | {pod: .metric.pod, cpu_millicores: .value[1]}]' +[ + { + "pod": "lab15-devops-app-py-2", + "cpu_millicores": "0.7247538053105157" + }, + { + "pod": "lab15-devops-app-py-1", + "cpu_millicores": "0.6301911409320081" + }, + { + "pod": "lab15-devops-app-py-0", + "cpu_millicores": "0.700071927370977" + } +] + +$ curl -fsS -G 127.0.0.1:9090/api/v1/query --data-urlencode 'query=sum by (pod) (container_memory_working_set_bytes{namespace="lab15", pod=~"lab15-devops-app-py-.*"}) / 1024 / 1024' | jq '[.data.result[] | {pod: .metric.pod, memory_mib: .value[1]}]' +[ + { + "pod": "lab15-devops-app-py-2", + "memory_mib": "42.4765625" + }, + { + "pod": "lab15-devops-app-py-1", + "memory_mib": "43.18359375" + }, + { + "pod": "lab15-devops-app-py-0", + "memory_mib": "42.96875" + } +] + +$ curl -fsS -G 127.0.0.1:9090/api/v1/query --data-urlencode 'query=sum by (pod) (rate(container_cpu_usage_seconds_total{namespace="default"}[5m])) * 1000' | jq '.data.result' +[] + +$ curl -fsS -G 127.0.0.1:9090/api/v1/query --data-urlencode 'query=(1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100' | jq '[.data.result[] | {instance: .metric.instance, memory_percent: .value[1]}]' +[ + { + "instance": "192.168.49.2:9100", + "memory_percent": "35.99074072983496" + } +] + +$ curl -fsS -G 127.0.0.1:9090/api/v1/query --data-urlencode 'query=(node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / 1024 / 1024' | jq '[.data.result[] | {instance: .metric.instance, memory_mib: .value[1]}]' +[ + { + "instance": "192.168.49.2:9100", + "memory_mib": "14323.578125" + } +] + +$ curl -fsS -G 127.0.0.1:9090/api/v1/query --data-urlencode 'query=count(count by (cpu) (node_cpu_seconds_total{mode="idle"}))' | jq '[.data.result[] | {logical_cores: .value[1]}]' +[ + { + "logical_cores": "8" + } +] + +$ curl -fsS -G 127.0.0.1:9090/api/v1/query --data-urlencode 'query=sum(kubelet_running_pods)' | jq '[.data.result[] | {running_pods: .value[1]}]' +[ + { + "running_pods": "31" + } +] + +$ curl -fsS -G 127.0.0.1:9090/api/v1/query --data-urlencode 'query=sum(kubelet_running_containers)' | jq '[.data.result[] | {running_containers: .value[1]}]' +[ + { + "running_containers": "66" + } +] + +$ curl -fsS -G 127.0.0.1:9090/api/v1/query --data-urlencode 'query=sum by (namespace, pod) (rate(container_network_receive_bytes_total{namespace="default"}[5m]) + rate(container_network_transmit_bytes_total{namespace="default"}[5m]))' | jq '.data.result' +[] + +$ curl -fsS 127.0.0.1:9093/api/v2/alerts | jq 'group_by(.status.state) | map({state: .[0].status.state, count: length})' +[ + { + "state": "active", + "count": 5 + } +] +``` + +
+ +## Bonus: ServiceMonitor + +The application already exposed `/metrics`, so Lab 16 adds Helm-managed `ServiceMonitor` support instead of modifying the Python code. The ServiceMonitor has label `release: monitoring`, which matches the kube-prometheus-stack release selector. + +Because the chart has both a normal Service and a headless Service with the same selector labels, Prometheus discovered both Services and scraped all three pods through each, for six healthy targets. That is acceptable for this lab and makes the duplicate service behavior visible. + +
+ServiceMonitor and Prometheus proof + +```text +$ kubectl get servicemonitor lab15-devops-app-py -n lab15 -o yaml | sed -n '1,80p' +apiVersion: monitoring.coreos.com/v1 +kind: ServiceMonitor +metadata: + labels: + app.kubernetes.io/instance: lab15 + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: devops-app-py + app.kubernetes.io/part-of: devops-core-s26 + app.kubernetes.io/version: "1.12" + helm.sh/chart: devops-app-py-0.8.0 + release: monitoring + name: lab15-devops-app-py + namespace: lab15 +spec: + endpoints: + - interval: 15s + path: /metrics + port: http + scrapeTimeout: 10s + selector: + matchLabels: + app.kubernetes.io/instance: lab15 + app.kubernetes.io/name: devops-app-py + +$ curl -fsS 127.0.0.1:9090/api/v1/targets?state=active | jq '[.data.activeTargets[] | select((.labels.namespace // .discoveredLabels.__meta_kubernetes_namespace) == "lab15") | {job: .labels.job, service: (.discoveredLabels.__meta_kubernetes_service_name // ""), health: .health, scrapeUrl: .scrapeUrl}]' +[ + { + "job": "lab15-devops-app-py-headless", + "service": "lab15-devops-app-py-headless", + "health": "up", + "scrapeUrl": "http://10.244.0.94:5000/metrics" + }, + { + "job": "lab15-devops-app-py-service", + "service": "lab15-devops-app-py-service", + "health": "up", + "scrapeUrl": "http://10.244.0.92:5000/metrics" + }, + { + "job": "lab15-devops-app-py-service", + "service": "lab15-devops-app-py-service", + "health": "up", + "scrapeUrl": "http://10.244.0.93:5000/metrics" + }, + { + "job": "lab15-devops-app-py-service", + "service": "lab15-devops-app-py-service", + "health": "up", + "scrapeUrl": "http://10.244.0.94:5000/metrics" + }, + { + "job": "lab15-devops-app-py-headless", + "service": "lab15-devops-app-py-headless", + "health": "up", + "scrapeUrl": "http://10.244.0.92:5000/metrics" + }, + { + "job": "lab15-devops-app-py-headless", + "service": "lab15-devops-app-py-headless", + "health": "up", + "scrapeUrl": "http://10.244.0.93:5000/metrics" + } +] + +$ curl -fsS -G 127.0.0.1:9090/api/v1/query --data-urlencode 'query=sum by (service, pod, exported_endpoint) (http_requests_total{namespace="lab15", exported_endpoint=~"/|/visits|/metrics"})' | jq '[.data.result[] | {service: .metric.service, pod: .metric.pod, endpoint: .metric.exported_endpoint, value: .value[1]}]' +[ + { + "service": "lab15-devops-app-py-service", + "pod": "lab15-devops-app-py-2", + "endpoint": "/", + "value": "1" + }, + { + "service": "lab15-devops-app-py-service", + "pod": "lab15-devops-app-py-2", + "endpoint": "/visits", + "value": "1" + }, + { + "service": "lab15-devops-app-py-headless", + "pod": "lab15-devops-app-py-2", + "endpoint": "/", + "value": "1" + }, + { + "service": "lab15-devops-app-py-headless", + "pod": "lab15-devops-app-py-2", + "endpoint": "/visits", + "value": "1" + } +] +``` + +
+ +## Screenshots + +![Grafana StatefulSet resources](img/lab16_grafana_statefulset_resources.png) + +![Grafana node metrics](img/lab16_grafana_node_metrics.png) + +![Grafana kubelet dashboard](img/lab16_grafana_kubelet.png) + +![Alertmanager active alerts](img/lab16_alertmanager_alerts.png) + +![Prometheus application metrics](img/lab16_prometheus_app_metrics.png) + +## Final State + +The final cluster state is healthy: + +- `monitoring` namespace: Prometheus, Alertmanager, Grafana, kube-state-metrics, node-exporter, and the Prometheus Operator are ready. +- `lab15` namespace: StatefulSet `lab15-devops-app-py` is `3/3`, all PVCs remain bound, and init containers completed on the rolled pods. +- Bonus ServiceMonitor is active and Prometheus scrapes six healthy app targets from the normal and headless Services. diff --git a/k8s/docs/img/lab16_alertmanager_alerts.png b/k8s/docs/img/lab16_alertmanager_alerts.png new file mode 100644 index 0000000000000000000000000000000000000000..48fdccc3c800bb4cd190bfbe2acafc04d4f8ddc6 GIT binary patch literal 34753 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 Z&hW?O$&n=G`+_596y#JNA!VMw`4{Cz>-PWv literal 0 HcmV?d00001 diff --git a/k8s/docs/img/lab16_grafana_kubelet.png b/k8s/docs/img/lab16_grafana_kubelet.png new file mode 100644 index 0000000000000000000000000000000000000000..7ba7585d95671d6549208dc254c2fc454e36e60c GIT binary patch literal 124860 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�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

m24s8fvaK!pD_zUaScG3*FVvd&$09F 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 DCC7_z literal 0 HcmV?d00001 diff --git a/k8s/docs/img/lab16_grafana_statefulset_resources.png b/k8s/docs/img/lab16_grafana_statefulset_resources.png new file mode 100644 index 0000000000000000000000000000000000000000..f67828b45d0bab5fe440942bdabecbc49258059d GIT binary patch literal 78249 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 CXJ1PI literal 0 HcmV?d00001 diff --git a/k8s/docs/img/lab16_prometheus_app_metrics.png b/k8s/docs/img/lab16_prometheus_app_metrics.png new file mode 100644 index 0000000000000000000000000000000000000000..848a923c20169a6d4077f1433c45a0255b6601d7 GIT binary patch literal 86323 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 p4lIBE|NlDKKpn_n1C0SNGn}sto9x&WCI~8} literal 0 HcmV?d00001 From e222081433774066cb3a782ff0b29a1e742ff876 Mon Sep 17 00:00:00 2001 From: LocalT0aster Dan <90502400+LocalT0aster@users.noreply.github.com> Date: Thu, 14 May 2026 22:22:27 +0300 Subject: [PATCH 17/21] Lab17 Complete (#17) Add Lab 17 Cloudflare Workers API --- edge-api/.gitignore | 28 + edge-api/AGENTS.md | 41 + edge-api/README.md | 24 + edge-api/WORKERS.md | 619 + .../docs/img/lab17_cloudflare_bindings.png | Bin 0 -> 83906 bytes .../docs/img/lab17_cloudflare_deployments.png | Bin 0 -> 38607 bytes .../img/lab17_cloudflare_metrics_or_logs.png | Bin 0 -> 90345 bytes .../img/lab17_cloudflare_workers_pages.png | Bin 0 -> 180297 bytes edge-api/package-lock.json | 1597 ++ edge-api/package.json | 20 + edge-api/src/index.ts | 176 + edge-api/tsconfig.json | 27 + edge-api/worker-configuration.d.ts | 13563 ++++++++++++++++ edge-api/wrangler.jsonc | 32 + 14 files changed, 16127 insertions(+) create mode 100644 edge-api/.gitignore create mode 100644 edge-api/AGENTS.md create mode 100644 edge-api/README.md create mode 100644 edge-api/WORKERS.md create mode 100644 edge-api/docs/img/lab17_cloudflare_bindings.png create mode 100644 edge-api/docs/img/lab17_cloudflare_deployments.png create mode 100644 edge-api/docs/img/lab17_cloudflare_metrics_or_logs.png create mode 100644 edge-api/docs/img/lab17_cloudflare_workers_pages.png create mode 100644 edge-api/package-lock.json create mode 100644 edge-api/package.json create mode 100644 edge-api/src/index.ts create mode 100644 edge-api/tsconfig.json create mode 100644 edge-api/worker-configuration.d.ts create mode 100644 edge-api/wrangler.jsonc diff --git a/edge-api/.gitignore b/edge-api/.gitignore new file mode 100644 index 0000000000..7f42eebdff --- /dev/null +++ b/edge-api/.gitignore @@ -0,0 +1,28 @@ +# Dependencies +node_modules/ + +# Wrangler local state and secrets +.wrangler/ +.dev.vars* +!.dev.vars.example +.env* +!.env.example + +# Build and cache output +dist/ +coverage/ +.cache/ +.parcel-cache/ +.eslintcache +*.tsbuildinfo + +# Logs and diagnostics +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +report.*.json + +# Packed npm artifacts +*.tgz diff --git a/edge-api/AGENTS.md b/edge-api/AGENTS.md new file mode 100644 index 0000000000..340506a599 --- /dev/null +++ b/edge-api/AGENTS.md @@ -0,0 +1,41 @@ +# Cloudflare Workers + +STOP. Your knowledge of Cloudflare Workers APIs and limits may be outdated. Always retrieve current documentation before any Workers, KV, R2, D1, Durable Objects, Queues, Vectorize, AI, or Agents SDK task. + +## Docs + +- https://developers.cloudflare.com/workers/ +- MCP: `https://docs.mcp.cloudflare.com/mcp` + +For all limits and quotas, retrieve from the product's `/platform/limits/` page. eg. `/workers/platform/limits` + +## Commands + +| Command | Purpose | +|---------|---------| +| `npx wrangler dev` | Local development | +| `npx wrangler deploy` | Deploy to Cloudflare | +| `npx wrangler types` | Generate TypeScript types | + +Run `wrangler types` after changing bindings in wrangler.jsonc. + +## Node.js Compatibility + +https://developers.cloudflare.com/workers/runtime-apis/nodejs/ + +## Errors + +- **Error 1102** (CPU/Memory exceeded): Retrieve limits from `/workers/platform/limits/` +- **All errors**: https://developers.cloudflare.com/workers/observability/errors/ + +## Product Docs + +Retrieve API references and limits from: +`/kv/` · `/r2/` · `/d1/` · `/durable-objects/` · `/queues/` · `/vectorize/` · `/workers-ai/` · `/agents/` + +## Best Practices (conditional) + +If the application uses Durable Objects or Workflows, refer to the relevant best practices: + +- Durable Objects: https://developers.cloudflare.com/durable-objects/best-practices/rules-of-durable-objects/ +- Workflows: https://developers.cloudflare.com/workflows/build/rules-of-workflows/ diff --git a/edge-api/README.md b/edge-api/README.md new file mode 100644 index 0000000000..f61c2c3ff6 --- /dev/null +++ b/edge-api/README.md @@ -0,0 +1,24 @@ +# edge-api + +Cloudflare Worker for Lab 17. The full lab report is in [`WORKERS.md`](WORKERS.md). + +The Worker is a small Hono API with Cloudflare edge metadata, redacted configuration inspection, and a KV-backed counter. + +## Commands + +```bash +npm install +npm run typecheck +npx wrangler types +npx wrangler dev --port 8787 +npx wrangler deploy +``` + +## Routes + +- `GET /` +- `GET /health` +- `GET /edge` +- `GET /config` +- `GET /counter` +- `POST /counter` diff --git a/edge-api/WORKERS.md b/edge-api/WORKERS.md new file mode 100644 index 0000000000..733f99e851 --- /dev/null +++ b/edge-api/WORKERS.md @@ -0,0 +1,619 @@ +# Lab 17: Cloudflare Workers + +This lab deploys a small TypeScript API to Cloudflare Workers at: + +```text +https://edge-api.d-nesterov.workers.dev +``` + +The Worker source lives in this folder. It uses Hono for routing, Wrangler for local development and deployment, and Workers KV for state that survives code redeploys and rollback drills. + +Official Cloudflare references used for this implementation: + +- Wrangler configuration: https://developers.cloudflare.com/workers/wrangler/configuration/ +- Workers KV setup: https://developers.cloudflare.com/kv/get-started/ +- Request edge metadata: https://developers.cloudflare.com/workers/runtime-apis/request/ +- Workers observability: https://developers.cloudflare.com/workers/observability/ +- Versions, deployments, and rollback: https://developers.cloudflare.com/workers/configuration/versions-and-deployments/ + +## Implementation + +The Worker exposes these routes: + +| Method | Path | Purpose | +| --- | --- | --- | +| `GET` | `/` | Application metadata and route index | +| `GET` | `/health` | Health probe with timestamp | +| `GET` | `/edge` | Selected `request.cf` edge metadata | +| `GET` | `/config` | Plaintext config and redacted secret status | +| `GET` | `/counter` | Reads the KV-backed counter | +| `POST` | `/counter` | Increments the KV-backed counter | + +The important config is in `wrangler.jsonc`: + +- `workers_dev: true` publishes the app on the account `workers.dev` subdomain. +- `observability.enabled: true` enables Workers logs and metrics. +- `vars` stores non-sensitive app metadata. +- `secrets.required` declares `API_TOKEN` and `ADMIN_EMAIL` for type generation and local validation. +- `kv_namespaces` binds `SETTINGS` to the Worker. + +Secrets are only reported by configured/not configured status from `/config`. The Worker never returns secret values. + +## Screenshots + +The dashboard screenshots were captured manually because Cloudflare's human verification blocked repeatable Playwright login during the final pass. + +The report embeds these captures: + +![Cloudflare Workers and Pages overview](docs/img/lab17_cloudflare_workers_pages.png) + +![Cloudflare Worker metrics](docs/img/lab17_cloudflare_metrics_or_logs.png) + +![Cloudflare Worker KV binding](docs/img/lab17_cloudflare_bindings.png) + +![Cloudflare Worker active deployment](docs/img/lab17_cloudflare_deployments.png) + +

+Cloudflare login and account check + +```text +$ source ~/.sdk/nvm/nvm.sh + +$ nvm use 24 +Now using node v24.15.0 (npm v11.13.0) + +$ npx wrangler whoami + + ⛅️ wrangler 4.90.0 (update available 4.91.0) +───────────────────────────────────────────── +Getting User settings... +👋 You are logged in with an OAuth Token, associated with the email d.nesterov@innopolis.university. +┌───────────────────────────────────────────┬──────────────────────────────────┐ +│ Account Name │ Account ID │ +├───────────────────────────────────────────┼──────────────────────────────────┤ +│ D.nesterov@innopolis.university's Account │ 4d7eadac0e419c4614832b150c6867e3 │ +└───────────────────────────────────────────┴──────────────────────────────────┘ +``` + +
+ +
+KV namespace and secrets + +```text +$ npx wrangler kv namespace create SETTINGS + + ⛅️ wrangler 4.90.0 (update available 4.91.0) +───────────────────────────────────────────── +Resource location: remote + +🌀 Creating namespace with title "SETTINGS" +✨ Success! +To access your new KV Namespace in your Worker, add the following snippet to your configuration file: +{ + "kv_namespaces": [ + { + "binding": "SETTINGS", + "id": "a7dd06a571e7468d9906db5d52c32d12" + } + ] +} +? Would you like Wrangler to add it on your behalf? +🤖 Using fallback value in non-interactive context: no + +$ npx wrangler secret put API_TOKEN + + ⛅️ wrangler 4.90.0 (update available 4.91.0) +───────────────────────────────────────────── +🌀 Creating the secret for the Worker "edge-api" +? There doesn't seem to be a Worker called "edge-api". Do you want to create a new Worker with that name and add secrets to it? +🤖 Using fallback value in non-interactive context: yes +🌀 Creating new Worker "edge-api"... +✨ Success! Uploaded secret API_TOKEN + +$ npx wrangler secret put ADMIN_EMAIL + + ⛅️ wrangler 4.90.0 (update available 4.91.0) +───────────────────────────────────────────── +🌀 Creating the secret for the Worker "edge-api" +✨ Success! Uploaded secret ADMIN_EMAIL +``` + +Secret values were entered through stdin and intentionally omitted from the transcript. + +
+ +
+Static checks + +```text +$ npm install + +added 1 package, removed 8 packages, and audited 40 packages in 1s + +7 packages are looking for funding + run `npm fund` for details + +found 0 vulnerabilities + +$ npx wrangler types + + ⛅️ wrangler 4.90.0 (update available 4.91.0) +───────────────────────────────────────────── +Generating project types... + +declare namespace Cloudflare { + interface GlobalProps { + mainModule: typeof import("./src/index"); + } + interface Env { + SETTINGS: KVNamespace; + APP_NAME: "edge-api"; + COURSE_NAME: "DevOps Core S26"; + APP_VERSION: "1.0.1"; + ENVIRONMENT: "production"; + API_TOKEN: string; + ADMIN_EMAIL: string; + } +} + +✨ Types written to worker-configuration.d.ts + +$ npm run typecheck + +> edge-api@1.0.1 typecheck +> tsc --noEmit +``` + +
+ +
+Local Worker route checks + +```text +$ npx wrangler dev --port 8787 + + ⛅️ wrangler 4.90.0 (update available 4.91.0) +───────────────────────────────────────────── +Using secrets defined in .dev.vars +Your Worker has access to the following bindings: +Binding Resource Mode +env.SETTINGS (a7dd06a571e7468d9906db5d52c32d12) KV Namespace local +env.APP_NAME ("edge-api") Environment Variable local +env.COURSE_NAME ("DevOps Core S26") Environment Variable local +env.APP_VERSION ("1.0.0") Environment Variable local +env.ENVIRONMENT ("production") Environment Variable local +env.API_TOKEN ("(hidden)") Environment Variable local +env.ADMIN_EMAIL ("(hidden)") Environment Variable local + +$ curl -fsS 127.0.0.1:8787/health | jq +{ + "status": "ok", + "service": "edge-api", + "version": "1.0.0", + "timestamp": "2026-05-14T17:10:50.285Z" +} + +$ curl -fsS 127.0.0.1:8787/config | jq +{ + "vars": { + "APP_NAME": "edge-api", + "COURSE_NAME": "DevOps Core S26", + "APP_VERSION": "1.0.0", + "ENVIRONMENT": "production" + }, + "secrets": { + "API_TOKEN": { + "configured": true, + "value": "[redacted]" + }, + "ADMIN_EMAIL": { + "configured": true, + "value": "[redacted]" + } + }, + "kv": { + "binding": "SETTINGS", + "counterKey": "lab17-counter" + } +} + +$ curl -fsS -X POST 127.0.0.1:8787/counter | jq +{ + "key": "lab17-counter", + "previous": 1, + "value": 2, + "persisted": true +} + +$ curl -sS 127.0.0.1:8787/missing | jq +{ + "error": "not_found", + "path": "/missing", + "routes": [ + { + "method": "GET", + "path": "/", + "description": "Application metadata and route index" + }, + { + "method": "GET", + "path": "/health", + "description": "Health probe for uptime checks" + }, + { + "method": "GET", + "path": "/edge", + "description": "Selected Cloudflare edge request metadata" + }, + { + "method": "GET", + "path": "/config", + "description": "Plaintext config and redacted secret status" + }, + { + "method": "GET", + "path": "/counter", + "description": "Read the KV-backed counter" + }, + { + "method": "POST", + "path": "/counter", + "description": "Increment the KV-backed counter" + } + ] +} +``` + +The full local transcript is in `/tmp/lab17/local-routes.txt`. + +
+ +
+Deploy v1 and v2 + +```text +$ npx wrangler deploy + + ⛅️ wrangler 4.90.0 (update available 4.91.0) +───────────────────────────────────────────── +Total Upload: 64.96 KiB / gzip: 16.02 KiB +Worker Startup Time: 5 ms +Your Worker has access to the following bindings: +Binding Resource +env.SETTINGS (a7dd06a571e7468d9906db5d52c32d12) KV Namespace +env.APP_NAME ("edge-api") Environment Variable +env.COURSE_NAME ("DevOps Core S26") Environment Variable +env.APP_VERSION ("1.0.0") Environment Variable +env.ENVIRONMENT ("production") Environment Variable + +Deployed edge-api triggers (10.12 sec) + https://edge-api.d-nesterov.workers.dev +Current Version ID: a20f4d8a-ccd7-4bb7-a040-f3be3f87a255 + +$ npx wrangler deploy + + ⛅️ wrangler 4.90.0 (update available 4.91.0) +───────────────────────────────────────────── +Total Upload: 64.96 KiB / gzip: 16.02 KiB +Worker Startup Time: 8 ms +Your Worker has access to the following bindings: +Binding Resource +env.SETTINGS (a7dd06a571e7468d9906db5d52c32d12) KV Namespace +env.APP_NAME ("edge-api") Environment Variable +env.COURSE_NAME ("DevOps Core S26") Environment Variable +env.APP_VERSION ("1.0.1") Environment Variable +env.ENVIRONMENT ("production") Environment Variable + +Deployed edge-api triggers (6.30 sec) + https://edge-api.d-nesterov.workers.dev +Current Version ID: 469bd470-53b7-4b7d-b229-4ce161da0333 +``` + +
+ +
+Public route checks + +```text +$ WORKER_URL=https://edge-api.d-nesterov.workers.dev + +$ curl -fsS "$WORKER_URL/health" | jq +{ + "status": "ok", + "service": "edge-api", + "version": "1.0.1", + "timestamp": "2026-05-14T17:13:31.426Z" +} + +$ curl -fsS "$WORKER_URL/edge" | jq +{ + "colo": "ARN", + "country": "FI", + "city": "Helsinki", + "region": "Uusimaa", + "postalCode": "00100", + "timezone": "Europe/Helsinki", + "asn": 56971, + "asOrganization": "CGI GLOBAL LIMITED", + "httpProtocol": "HTTP/2", + "tlsVersion": "TLSv1.3" +} + +$ curl -fsS "$WORKER_URL/config" | jq +{ + "vars": { + "APP_NAME": "edge-api", + "COURSE_NAME": "DevOps Core S26", + "APP_VERSION": "1.0.1", + "ENVIRONMENT": "production" + }, + "secrets": { + "API_TOKEN": { + "configured": true, + "value": "[redacted]" + }, + "ADMIN_EMAIL": { + "configured": true, + "value": "[redacted]" + } + }, + "kv": { + "binding": "SETTINGS", + "counterKey": "lab17-counter" + } +} + +$ curl -fsS -X POST "$WORKER_URL/counter" | jq +{ + "key": "lab17-counter", + "previous": 1, + "value": 2, + "persisted": true +} +``` + +The full route transcript is in `/tmp/lab17/public-routes.txt`. + +
+ +
+KV persistence across redeploy + +```text +$ curl -fsS "$WORKER_URL/config" | jq .vars +{ + "APP_NAME": "edge-api", + "COURSE_NAME": "DevOps Core S26", + "APP_VERSION": "1.0.0", + "ENVIRONMENT": "production" +} + +$ curl -fsS -X POST "$WORKER_URL/counter" | jq +{ + "key": "lab17-counter", + "previous": 0, + "value": 1, + "persisted": true +} + +$ curl -fsS "$WORKER_URL/config" | jq .vars +{ + "APP_NAME": "edge-api", + "COURSE_NAME": "DevOps Core S26", + "APP_VERSION": "1.0.1", + "ENVIRONMENT": "production" +} + +$ curl -fsS "$WORKER_URL/counter" | jq +{ + "key": "lab17-counter", + "value": 2, + "persisted": true +} +``` + +
+ +
+Observability with Wrangler tail + +```text +$ npx wrangler tail --format json | jq ' +{ + outcome, + scriptName, + scriptVersion: .scriptVersion.id, + log: .logs[0].message[0], + request: { + method: .event.request.method, + url: .event.request.url, + colo: .event.request.cf.colo, + country: .event.request.cf.country + }, + status: .event.response.status +}' +{ + "outcome": "ok", + "scriptName": "edge-api", + "scriptVersion": "469bd470-53b7-4b7d-b229-4ce161da0333", + "log": "{\"event\":\"request\",\"method\":\"GET\",\"path\":\"/health\",\"colo\":\"ARN\",\"country\":\"FI\"}", + "request": { + "method": "GET", + "url": "https://edge-api.d-nesterov.workers.dev/health", + "colo": "ARN", + "country": "FI" + }, + "status": 200 +} +{ + "outcome": "ok", + "scriptName": "edge-api", + "scriptVersion": "469bd470-53b7-4b7d-b229-4ce161da0333", + "log": "{\"event\":\"request\",\"method\":\"POST\",\"path\":\"/counter\",\"colo\":\"ARN\",\"country\":\"FI\"}", + "request": { + "method": "POST", + "url": "https://edge-api.d-nesterov.workers.dev/counter", + "colo": "ARN", + "country": "FI" + }, + "status": 200 +} + +$ curl -fsS "$WORKER_URL/health" | jq .status +"ok" + +$ curl -fsS -X POST "$WORKER_URL/counter" | jq .value +3 +``` + +
+ +
+Rollback drill + +```text +$ npx wrangler rollback a20f4d8a-ccd7-4bb7-a040-f3be3f87a255 --message "Lab 17 rollback drill" --yes + + ⛅️ wrangler 4.90.0 (update available 4.91.0) +───────────────────────────────────────────── +├ Fetching latest deployment +│ +├ Your current deployment has 1 version(s): +│ +│ (100%) 469bd470-53b7-4b7d-b229-4ce161da0333 +│ Created: 2026-05-14T17:13:05.782035Z +│ Tag: - +│ Message: - +│ +├  WARNING  You are about to rollback to Worker Version a20f4d8a-ccd7-4bb7-a040-f3be3f87a255. +│ This will immediately replace the current deployment and become the active deployment across all your deployed triggers. +│ However, your local development environment will not be affected by this rollback. +│ Rolling back to a previous deployment will not rollback any of the bound resources (Durable Object, D1, R2, KV, etc). +│ +╰  SUCCESS  Worker Version a20f4d8a-ccd7-4bb7-a040-f3be3f87a255 has been deployed to 100% of traffic. + +Current Version ID: a20f4d8a-ccd7-4bb7-a040-f3be3f87a255 + +$ curl -fsS "$WORKER_URL/config" | jq .vars +{ + "APP_NAME": "edge-api", + "COURSE_NAME": "DevOps Core S26", + "APP_VERSION": "1.0.0", + "ENVIRONMENT": "production" +} + +$ npx wrangler deploy + +Deployed edge-api triggers (5.76 sec) + https://edge-api.d-nesterov.workers.dev +Current Version ID: e46aeb10-5fab-49df-a416-44d42bdc27f9 + +$ curl -fsS "$WORKER_URL/config" | jq .vars +{ + "APP_NAME": "edge-api", + "COURSE_NAME": "DevOps Core S26", + "APP_VERSION": "1.0.1", + "ENVIRONMENT": "production" +} + +$ curl -fsS "$WORKER_URL/counter" | jq +{ + "key": "lab17-counter", + "value": 3, + "persisted": true +} +``` + +The rollback test confirmed two things: traffic can be returned to an older Worker version, and KV data is not rolled back with code. + +
+ +
+Final redeploy after source cleanup + +```text +$ npm run typecheck + +> edge-api@1.0.1 typecheck +> tsc --noEmit + + +$ npx wrangler deploy + + ⛅️ wrangler 4.90.0 (update available 4.91.0) +───────────────────────────────────────────── +Total Upload: 65.04 KiB / gzip: 16.02 KiB +Worker Startup Time: 4 ms +Your Worker has access to the following bindings: +Binding Resource +env.SETTINGS (a7dd06a571e7468d9906db5d52c32d12) KV Namespace +env.APP_NAME ("edge-api") Environment Variable +env.COURSE_NAME ("DevOps Core S26") Environment Variable +env.APP_VERSION ("1.0.1") Environment Variable +env.ENVIRONMENT ("production") Environment Variable + +Uploaded edge-api (12.21 sec) +Deployed edge-api triggers (6.00 sec) + https://edge-api.d-nesterov.workers.dev +Current Version ID: 2297d0f9-493e-4de6-8745-b34f7c9c9f99 + +$ curl -fsS https://edge-api.d-nesterov.workers.dev/config | jq .vars +{ + "APP_NAME": "edge-api", + "COURSE_NAME": "DevOps Core S26", + "APP_VERSION": "1.0.1", + "ENVIRONMENT": "production" +} + +$ curl -fsS https://edge-api.d-nesterov.workers.dev/counter | jq +{ + "key": "lab17-counter", + "value": 3, + "persisted": true +} +``` + +
+ +
+Manual dashboard screenshot checklist + +```text +$ ls -lh docs/img/lab17_cloudflare_*.png +-rw-r--r-- 1 t0ast t0ast 82K May 14 21:42 docs/img/lab17_cloudflare_bindings.png +-rw-r--r-- 1 t0ast t0ast 38K May 14 21:43 docs/img/lab17_cloudflare_deployments.png +-rw-r--r-- 1 t0ast t0ast 89K May 14 21:41 docs/img/lab17_cloudflare_metrics_or_logs.png +-rw-r--r-- 1 t0ast t0ast 177K May 14 21:38 docs/img/lab17_cloudflare_workers_pages.png + +$ sha256sum docs/img/lab17_cloudflare_*.png +d92191268434e69a1d33d497c13ed9afaa2a75ceef1bdcbee2c49246d840efc5 docs/img/lab17_cloudflare_bindings.png +ace7f62e5bedca06b0d47183561fd9efde7309146b1ccd45158f1a76d2813afc docs/img/lab17_cloudflare_deployments.png +9f1f892a15ba70d12fc5c5731f03a99250031244306e853a86795b145e5326df docs/img/lab17_cloudflare_metrics_or_logs.png +1e8f16984c018e78ee20812a1d57da058d1e99a6311721056db78aa40b817978 docs/img/lab17_cloudflare_workers_pages.png + +$ file docs/img/lab17_cloudflare_*.png +docs/img/lab17_cloudflare_bindings.png: PNG image data, 1597 x 976, 8-bit/color RGBA, non-interlaced +docs/img/lab17_cloudflare_deployments.png: PNG image data, 895 x 406, 8-bit/color RGBA, non-interlaced +docs/img/lab17_cloudflare_metrics_or_logs.png: PNG image data, 1596 x 975, 8-bit/color RGBA, non-interlaced +docs/img/lab17_cloudflare_workers_pages.png: PNG image data, 1220 x 1145, 8-bit/color RGBA, non-interlaced +``` + +The four images cover the Workers & Pages list, Worker metrics, the `SETTINGS` KV binding, and the active deployment/version view. + +
+ +## Kubernetes vs Workers + +Kubernetes gives more control over runtime shape, deployment strategy, network policies, and cluster-level behavior. That control is valuable for long-running services and platform engineering, but it carries operational cost: nodes, controllers, ingress, image distribution, and rollout machinery all need care. + +Cloudflare Workers removes most of that operational surface. Deployment is a source upload plus platform-managed global execution. Rollback is version based, logs are available through Wrangler and the dashboard, and KV can hold small global state without provisioning a database. The tradeoff is less control over runtime placement, request lifecycle, and local parity. It is a strong fit for edge APIs, request adapters, webhooks, and lightweight public APIs; it is not a direct replacement for every Kubernetes service. + +## Final State + +- Worker URL: `https://edge-api.d-nesterov.workers.dev` +- Final app version: `1.0.1` +- Current final deployment after rollback drill and final redeploy: `2297d0f9-493e-4de6-8745-b34f7c9c9f99` +- KV binding: `SETTINGS` +- KV counter after final redeploy: `3` +- Dashboard screenshots are stored under `docs/img/` diff --git a/edge-api/docs/img/lab17_cloudflare_bindings.png b/edge-api/docs/img/lab17_cloudflare_bindings.png new file mode 100644 index 0000000000000000000000000000000000000000..0e1cad08adff6c04695ec898303c47563ee14907 GIT binary patch literal 83906 zcmeFZ1yI!A|Nkq3gh)$BEC>romvpOi3eqJY-Q6Jw(jeWTq?B}ry3~@=jndtn|FfU( z$KU@qcjnIAng9L&XYS0M!C_^0&z^msb6)v)zC)E2rLZ27KD>AD9+r&sE0ufqP=)W^ zLmom$1%I(wX|MvnFzltZobKJjh9UkTB`{%=fj?q9OK3V<+nHGy8(M4LGgr?uTzQt-qh#1l@&jwU9y_e@?Xvv3f~X@9{J_=LA!?Ftwb`>)%&N0|I zsOV7W)ZX=;J#ST9%G6ZiT*l4aKuVP$*Ir-qO6!h?t%auhx~albnOG>|M}?P4Y;Gv( z?C`3PM`3TGDXGlwWgFw3>#LNL;UU}`vs9NHnT42tUJ72lncb67X+a|BYCY2ZiN?4) z=BXN8+2#<#;S|9uP{dk_ct`?!epcu9ipE#EP*FOG#?HgVy4djvV+Uj~nP>Qy~-ymiv@Y$fv_g9=C($~F=IqWi(Ec? zkS6WwyqsG)?tpi_+q9Pt?f(5eFwIIxPQ@U>j@kmtOhY3UT2z-~f<}lgN`E|k=RkPFqS!}xny-b$dUI`vv}t;DPLJ@mu{DqJsFz7qTzTnqZ_`!ml+ z74(CKj#%3C@+qEoR0ER_nI;Z{Iq$Id^ttmP%P|Fo={ z7At1n_k-)}xz}{Up2f{O0$c}%a(@k+N_l*zYKF4O{S$LAH+lE=|9kuRE2uM)jQH;M ztZfNc|63A*8&4G`r5cNBDC#h$8O_NZ_er~19f7CpwVv1SNTy1R7JdsJ5s!b zj4Jpmlak|%kQR;b^@Wc#cQ?f)S&%>BY^@<5DSi1QBS`SRNJfUeM@H-1t{Q|el~$|t z@h*6)iA>#OdTtigZ{(*L0nbozcYCFgQt8Hjb3C&2C0a!GZm(uSpJOe3<*eE7dWrJj za;v=H&Tl`E5=I@)tm4`z%lFOi{LjaVS;yXv>Jdd96L`RkZ4-;nYMhctr~>a?H9TIJ zz~m-3PSNsU`mw4!-iVT@5A(P7`xT2}Or7#vE;o3mZf#e3+6!n9_qPc}n_V|&3t2>_ zHDl^q4ww=Fh6_GtHV4{ww>QSMQ>NjOyz_j%2jK>=M_hd|`hF`38pG9(woi^nlnRy< zrF^arx+*4(!aG#tSP1LpJ*|?iCGFUKug~4V6HB6Z7fJ$j71zvHz_bx8-0Zr2sc=|S zgOS-a?S*=n23SXU`b?QQi>S9<4lEe{VS3QEY%=!YU%yOid7-f5>n;iWFoTL*Fn7@k`G zwvRN?wRc9yoJLf#pXu(^!}91$fyLG&8tg{K#g$J9B6{=QTv9@Q?y#;eG^+y77t;>n z6uI0}LwKV@lZW0Un@$en`H>SHTwmeIQE+V>C+N0H!K_E5ysu4QZJEs1Z4+Pd*qSLF zE(p{_G^IS9hnMEu79zn$;}f~NK6?Bn)wXeCvADc7jM%`NLwH=%I8xIr!{w{@%d=F! z+lvw7KS9K0oN9Zg%W+DH3ZBZChkkcg3()eq4#e*_WC`zNSl&OmuK>kP)HDiZR6W6V z>gU$Dl%x9C&cza(>Ao2H_?fQrF9{}JMVllxh^Nso&C((hJ(g57gkn(S%KCbR%}?h2 zIhk$!(+BKeS$E%v)N`OB
?#z*56nW;nRy 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

I7!#TVcb6Lzy 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

ZI9 z6URES@eVHF>^qUGSw!}RG>^&Pu?d332QhOw)Z#1Fh`J@wRn7LhBm^-d5+N6gSNh`e zrH}JP*4QOJb)y&Q5{kp7h@LIC-_E7v)zH+Ld#nEOk9#5+wkAQ~(45y!QT)r31+P;J z0<&Pya3jEbfX)ouQf71En4)Hlit&EoPCc6a?piE%pZ(KZ>XoIumpEk354s}WMHK$M zm#Vrw%&E~tnc+>R&4ch^r3BN!xGlcfFi&qByPJdHvB-a3c8d)c@b+Zf9o6;+Xa z`G&lHjAJ41wp3m6AJ7Gq*eDLIf8RncrJPU*X6uWQU}BJuVT9H@7mT3;6Y8CN|380uI`u5cY*eelIm=2izit`u4n&^?{=Kgx+zvVHI6PxI{=OKah#9oT zpE{kL>~#~YHvjVunE@N`9RfGnO?L?c&+QkmsqO)3nc)`jvb*uGlmkCO6ymOe3>mr3 z=Spt;SZ;#?n=t?(=sYJ(wg2;x(I=$oq<~qaV7|uw_hWs@dCLLkiw|tTA4&ZKeyB_F zCN=+TjN%-wXW*E8y#}se1y0cNwctKiyG_=cL#E2w-J^QoegZFV_7`*(py(p3vgt=q zAEfk`yafsYHzb9t-v!kG@22MtvIgccW^MHraEO`zFK1RFIu-v1)KM13rfjqvZ*@E1R|@842IFINRx1ZA6z-- z>V^5I!nPd^>m*!4CXw@*=?UaO{`dD43b;-5QXI-mJ7)p`=YxhpCH49pJrrYuGz zwA*xaA`4YR6x*u9O9(YWrDvYtIs_`y%@BUjdH92d(N6pW<}G7?8HPgXhf=1*8Bdc+ zidpEw<1eyazDgPCc_8AMer6=dRa_EZy{)I|$jPHyfr0Uj4*wGP z@kJfe82rE}e*X{`{CKTF;C})9>|wgd0Uy?projR~9%kb%ZD)G`FZy=C?@)!Ncbujz zA%%eO)sFx^x@Nz7k}gr;z*ht=4n1VKFa&JMZD@etBs&7&2J)Ria4({G7V-T%@HFgW6{mqOZkN$~@nY}Ig$YC2`L1|f7<>WVD?1zjLFN_vpW*l$ zfY?d?9+0wB&0tR(cqaaN@h#N>wCAIMRc_x}H;{60zTEyTy;}~}g?7kFI6MJTTLXYV zEtB5WRw26kB*zenPF}_X0F-Ohz%M1SD!(_in>;oHIfpfT;2?6w1ar6VUFd;}$Jspy zN3$73F>-GF2@}1lYE?w3lzAfwEDjtQ&>gIvlf* z1>VJ#b{`J576waH$*$O2;J88mA)uG~h?{>4d=zeQ@U;dg3nF)00d!~{Y=90}XafS^ zHXur>c%FzUh0_ER`9eSz=^toA(;{MlSBc4qNp(8rbAfJD4Qh@YYJsC5o6LY26_4IS z0$LAi7^5N+&_e#kaKDIwQM);)%+-(poWwVwDifB)G<+I6Vz}CYyQjvP|Af&y$~GV> zseXR8Tm)4!fW1*oRS7U|+Xaigqp+6@aaNqbyYo=s!?AKAnZ*?Ghm13z{8GYum=&IXOrH$mOR5uD2o9 zwTGreFi0&SAvDaa!Jhy<6Ug=e>Q_is!yW>K%7c4Qo^*ZOu?mi{TL+pdm3OJNNM9_2 zTsj_0`PY#ltSjMAv~z@5@_q8@%p5w&76O1)-x(I6C%Bnv-}fjJ8(T>$@b|f!YhW!x zRkcf*M^-W+26_QgC6im0W*2x@vKCI9F>$r2yxjrSzhr2G#0t*#%WoP-0MMeJt-qPl zo}g0V0^;KUQz;xE#KOR7BJ^ZXYhOP>MZIQ;;Do2cX4FiF(;i54$Yasb)u!=)gpxOr z2&>Bmd%*a*%_==!!wzV$bnautKd70+aoQ4!LmcmK@Jw9>U+a%PaHKeOvFWnAk%OuT z9^kP`F2xXTJ^!9(C8AwNA{~?>Yy1!}qI;}ByiH!s>B~gKdx(u6=lh{P@5%7H4VkWz zQ(0MAok-H^YYo5&`qy_HS%JNyxqe;^J4>OGj;yLt*wo7D(ORBTMTf<9PPEUHLACej zn#5vi_;o#7%D7r^oFokHJie*{+~V#*;OvzFV+0R{Ah7Hpxe?d>`5T(&<8NS2c^~rA zuGgu&jgZU5y+RFq*hHcdVt1RMFdYqMp0)R15{;p8K4rd*E z`3q`inL7z97%<0x`ejM4&^y@sN!TQG*X|49H-eE4w>0=_1EF&?HbMW*SwV-lceld+0&^VNU zSwu-ra3Ig}oz>b+nNm2_YAn#|5{bS~abBwsM_xF>iHLP=1a5_qzzg-k)?Ec&l|~mJ zkQ|(1RX5CBmFw3sBpg7a2wfTQ+o_L-9Tjo5IG0$sT2+i9x1NLyK7PCo93c0~?dI;s zY11RZbP*-$`dq{oRaZ77)8$Abc_-CgGIDnXRiEmlfCbX>$(+>Z=*J;JSVGc5!iab+s&DIVL^g z!cNRxU;+vWRT};b58H@Hic;Tl_Uj~Rg4OSE&Sk8pT7xK?3~c4>^*i5@GFLv&f#_V zxFxYSDg6EaFj2s6fG_(0*^ArqpOlTna9Kn`va9_|#QyrU864ewMD5{B#%DK1*Nln> zB7S)^lt@FrxutG+yC3wt6IC0~GWp>7(TYVY{|mH=Mg!vnmXBhmZb&eh&}JTo&WUliTf4O64{ka^ATBo61`Ay~h@61?3>csQICcqrMQmTZ9EABR{4Y0703eF(+_L}( zK)GuTJq+Jdcyu~Vr zNNe-EZKnn9-0IC_>XQsVTjs#Vswj9c@>%pu4df813O4SdDm6;`aKjME)y1ETr46zj zrNrht3b#2;Hyo?L-9U~)N28~~fKYC~p*(kcEji8F!Y>5x=fS*2 z;~jbk5>d>+ravpMJBBO$GceLdL-`@ZBtq)Zq5kZOvBMezIF8y+iy04Dehh$ru2^4y z{*0xU(!ScPj+OHWA097=8A2ReAxNSk0ir2a<5Rq2+kG=&-i`+GjtwS4Y^Ze!G66@^ z72om24 z8%cDx%kAlxV8XnEQWYqHY0T1lwSd%3)&=5e>4x*F6$1{MX(Opv> z@C5xnUFb(%(GAqE+Mb8M5+k9=dgsK~v0MpS?g{`W?lzEQm9Gn5IWhog9tKNh63A|a zonG%@hi ztwQEvILM4kyM|w)BQzI1wZXRv3hC_tbD$6Pzb|b?g|^zMK#AyZSev|iZA)N!$P3bUmvD=#Q#S9b8^^@E0=#iwTZymULC)#iaiM+J z2AJ|QAhndPHUw3fHkhbO<`~uc?I63V)@1LP%3}jY)Je8Mb2Nv^;vPW_!s7#}0~uMr5MflGSJ!G7i8S>IL)9_`fBV&s3A6 z*@A>HKdw+R^U3`tzBVwYpu!w>s3S%@0JXxKiD$>@So~zxiEWw1V)IAdBm6|G`hZSX zvdKi-1A$r)`s%s&(N`NM3}&``Z;d{@GU!e^4s=rD^kE@1WdKzWdIDYnK+3rzS_fi zNW|t`E6*Jv=#vJFYBdby^FQ_6MTBPZ%I)+qW#_0&whzu9y^>*y;&fjE0~XnNAIN#K z{3JS6X^wQym<q4dy|GuQQf64a(a$F3!L|81^{2A8mPEMP6KRQ9 zUjsNa&;~Azy|fdRq&_a1cHvyhiwQDBxv3Yk#Be+|%hQ3pJkCJrdBozkS1a}>j6K?f z$htYOF|t-yA0es%TJOHQR?rN)M1&g=;Bna)nxdW@g5ea_O#{Qoxr95;i)6(-v}$Yb z@a85{(kG6t?^a=g1JNRSy(IaO4XoadV_BMCPB%1(4sp4OEWzHu z<%R~<)*eIRTkRNQk1&>ARr;l{RY%JP)_I%Ytd27M0@Jp$5n#$7aOEypVPsbktO_qp9ie=#k zdN@WiV5!QbRpeS?QnFOYHn9W{2QWt$;w+iizffSqvLkC({I>mt3iCG+?^gi{`P_y+zXSl?| z<@rYP8mp0V7yVX4q31wLM?uHsBLI@r>rO8pXso)6lUCRb?58T%oq9jPwPnz091KA$ zeL3@WEmsn$uaFI6>|atGifH?;wtIcP%GV4rfkL*Y#)ItZbysiy`1r|WZwhe+Sy@8u z-ES@@vSpt%e)uw0T|qU2#Z*Ukwa`!^GG|bYf~PlYsCb&8p>-^4IniY6@L_Xx{~=Oj zY2js|otMu{kxZ$1jk$)7(~a^{Zyo8l*|@C2oS&09CEo=X#`aKy!XlipM`OqCbDs&H zp^p-p=XHu)gAwyy;KuPavl_?&+^wJBH00pa;-1&bwEsZep@hAcQ z;>=27C(hdW&wgOIR}F*uLi_KZ$?f?@KAsiu&&e^xVl@IAga^>XGzR27gdp4}Nxq8& zC;dAGXx&^|20L(&?AXlh*AV^fE#BZX=47V?^9{F%n^X1cw#=Feip= zpor5JoO2glLaQRZ*aH*zPd%jIpV)9peRbh)xTVA-=e5Gx_cZ^vN{MD~FB|LY>$`xR z3n)Nv+rHk5jDetDPY+P)AgOi*lWdW|g?+o=#Th96RW>xkPkE^1qe9DT+~8jbYl*-{ zJqlLS23-NL8s>bv?h5w5(v{e{#m-)l0n2v`cX*A|)>c$hR^Gy0Kjnl#$B1^e8Wb+2 zV6iQjB{6FWY3!ac?@rL4?}$+y07JVVUrZ05u78J@&sWpOdus zq3w@1m(kTntIVot3YpUyo(6h2wY^Np+6!0u_3l#eLU?DOwXQ4>mG|6fd9eBC&d3>7g_%w+dILdz{trtrS>*XSv<}ZJcGZ> NN=22.0.0" + } + }, + "node_modules/@cloudflare/unenv-preset": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/@cloudflare/unenv-preset/-/unenv-preset-2.16.1.tgz", + "integrity": "sha512-ECxObrMfyTl5bhQf/lZCXwo5G6xX9IAUo+nDMKK4SZ8m4Jvvxp52vilxyySSWh2YTZz8+HQ07qGH/2rEom1vDw==", + "dev": true, + "license": "MIT OR Apache-2.0", + "peerDependencies": { + "unenv": "2.0.0-rc.24", + "workerd": ">1.20260305.0 <2.0.0-0" + }, + "peerDependenciesMeta": { + "workerd": { + "optional": true + } + } + }, + "node_modules/@cloudflare/workerd-darwin-64": { + "version": "1.20260507.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20260507.1.tgz", + "integrity": "sha512-S85aMwcaPJUjKWDiG6iMMnioKWtPLACa6m0j/EhHR1GYfVpnxb974cBc6d25L+sf7jHWHJI2u5hGp0UTJ7MtXQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workerd-darwin-arm64": { + "version": "1.20260507.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20260507.1.tgz", + "integrity": "sha512-GMEBu8Zp9Q97HLnf7bWJN4KjWpN5MxpeqdvHjBGWNl8UYprJI0k+Jkp89+Wh5S8vIon+HoVbDfOzPa7VwgL6Eg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workerd-linux-64": { + "version": "1.20260507.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20260507.1.tgz", + "integrity": "sha512-QlrKEBdgA3uVc0Ok0Q3+0/CW0CTjgj5ySir1i1YY5FXVv0X6GpwtnB5umjunjF2MFprss+L+iFGZzxcSvMC1nA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workerd-linux-arm64": { + "version": "1.20260507.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20260507.1.tgz", + "integrity": "sha512-eGbbupEtK2nh9V9Dhcx3vv3GTKeXqSVNgAEYVCCN0NGS9tl9HbMoHRX/4JL181FKXROMigWBCQVL//qPhsAzBQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workerd-windows-64": { + "version": "1.20260507.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20260507.1.tgz", + "integrity": "sha512-dmClJ/E0BAcuDetQIZFqbeAXejWrG5pysGRMQ6T83Y0IW/7IAamY2zFEkAJ10I5xwZsdHuYsZtzlOxpEXpJs7A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", + "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", + "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", + "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", + "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", + "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", + "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", + "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", + "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", + "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", + "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", + "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", + "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", + "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", + "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", + "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", + "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", + "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", + "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", + "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", + "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", + "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", + "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", + "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", + "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", + "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", + "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", + "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/colour": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", + "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", + "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", + "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", + "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", + "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", + "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", + "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", + "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", + "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", + "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", + "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", + "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", + "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", + "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", + "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", + "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", + "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", + "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.7.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", + "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", + "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", + "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@poppinss/colors": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@poppinss/colors/-/colors-4.1.6.tgz", + "integrity": "sha512-H9xkIdFswbS8n1d6vmRd8+c10t2Qe+rZITbbDHHkQixH5+2x1FDGmi/0K+WgWiqQFKPSlIYB7jlH6Kpfn6Fleg==", + "dev": true, + "license": "MIT", + "dependencies": { + "kleur": "^4.1.5" + } + }, + "node_modules/@poppinss/dumper": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@poppinss/dumper/-/dumper-0.6.5.tgz", + "integrity": "sha512-NBdYIb90J7LfOI32dOewKI1r7wnkiH6m920puQ3qHUeZkxNkQiFnXVWoE6YtFSv6QOiPPf7ys6i+HWWecDz7sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@poppinss/colors": "^4.1.5", + "@sindresorhus/is": "^7.0.2", + "supports-color": "^10.0.0" + } + }, + "node_modules/@poppinss/exception": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@poppinss/exception/-/exception-1.2.3.tgz", + "integrity": "sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sindresorhus/is": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-7.2.0.tgz", + "integrity": "sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@speed-highlight/core": { + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@speed-highlight/core/-/core-1.2.15.tgz", + "integrity": "sha512-BMq1K3DsElxDWawkX6eLg9+CKJrTVGCBAWVuHXVUV2u0s2711qiChLSId6ikYPfxhdYocLNt3wWwSvDiTvFabw==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/@types/node": { + "version": "25.6.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.6.2.tgz", + "integrity": "sha512-sokuT28dxf9JT5Kady1fsXOvI4HVpjZa95NKT5y9PNTIrs2AsobR4GFAA90ZG8M+nxVRLysCXsVj6eGC7Vbrlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.19.0" + } + }, + "node_modules/blake3-wasm": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/blake3-wasm/-/blake3-wasm-2.1.5.tgz", + "integrity": "sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/error-stack-parser-es": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/error-stack-parser-es/-/error-stack-parser-es-1.0.5.tgz", + "integrity": "sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/esbuild": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", + "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.3", + "@esbuild/android-arm": "0.27.3", + "@esbuild/android-arm64": "0.27.3", + "@esbuild/android-x64": "0.27.3", + "@esbuild/darwin-arm64": "0.27.3", + "@esbuild/darwin-x64": "0.27.3", + "@esbuild/freebsd-arm64": "0.27.3", + "@esbuild/freebsd-x64": "0.27.3", + "@esbuild/linux-arm": "0.27.3", + "@esbuild/linux-arm64": "0.27.3", + "@esbuild/linux-ia32": "0.27.3", + "@esbuild/linux-loong64": "0.27.3", + "@esbuild/linux-mips64el": "0.27.3", + "@esbuild/linux-ppc64": "0.27.3", + "@esbuild/linux-riscv64": "0.27.3", + "@esbuild/linux-s390x": "0.27.3", + "@esbuild/linux-x64": "0.27.3", + "@esbuild/netbsd-arm64": "0.27.3", + "@esbuild/netbsd-x64": "0.27.3", + "@esbuild/openbsd-arm64": "0.27.3", + "@esbuild/openbsd-x64": "0.27.3", + "@esbuild/openharmony-arm64": "0.27.3", + "@esbuild/sunos-x64": "0.27.3", + "@esbuild/win32-arm64": "0.27.3", + "@esbuild/win32-ia32": "0.27.3", + "@esbuild/win32-x64": "0.27.3" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/hono": { + "version": "4.12.18", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.18.tgz", + "integrity": "sha512-RWzP96k/yv0PQfyXnWjs6zot20TqfpfsNXhOnev8d1InAxubW93L11/oNUc3tQqn2G0bSdAOBpX+2uDFHV7kdQ==", + "license": "MIT", + "engines": { + "node": ">=16.9.0" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/miniflare": { + "version": "4.20260507.1", + "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-4.20260507.1.tgz", + "integrity": "sha512-PSXBiLExTdZ4UGO/raKCHQauUpYL7F880ZRB7j0+78Rv8h7TsdN2E/iEDK9sK2Y+SPQ5wJSeAa+rDeVKoZZoEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspotcode/source-map-support": "0.8.1", + "sharp": "^0.34.5", + "undici": "7.24.8", + "workerd": "1.20260507.1", + "ws": "8.18.0", + "youch": "4.1.0-beta.10" + }, + "bin": { + "miniflare": "bootstrap.js" + }, + "engines": { + "node": ">=22.0.0" + } + }, + "node_modules/path-to-regexp": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sharp": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.2", + "semver": "^7.7.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.5", + "@img/sharp-darwin-x64": "0.34.5", + "@img/sharp-libvips-darwin-arm64": "1.2.4", + "@img/sharp-libvips-darwin-x64": "1.2.4", + "@img/sharp-libvips-linux-arm": "1.2.4", + "@img/sharp-libvips-linux-arm64": "1.2.4", + "@img/sharp-libvips-linux-ppc64": "1.2.4", + "@img/sharp-libvips-linux-riscv64": "1.2.4", + "@img/sharp-libvips-linux-s390x": "1.2.4", + "@img/sharp-libvips-linux-x64": "1.2.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", + "@img/sharp-libvips-linuxmusl-x64": "1.2.4", + "@img/sharp-linux-arm": "0.34.5", + "@img/sharp-linux-arm64": "0.34.5", + "@img/sharp-linux-ppc64": "0.34.5", + "@img/sharp-linux-riscv64": "0.34.5", + "@img/sharp-linux-s390x": "0.34.5", + "@img/sharp-linux-x64": "0.34.5", + "@img/sharp-linuxmusl-arm64": "0.34.5", + "@img/sharp-linuxmusl-x64": "0.34.5", + "@img/sharp-wasm32": "0.34.5", + "@img/sharp-win32-arm64": "0.34.5", + "@img/sharp-win32-ia32": "0.34.5", + "@img/sharp-win32-x64": "0.34.5" + } + }, + "node_modules/supports-color": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-10.2.2.tgz", + "integrity": "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD", + "optional": true + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.24.8.tgz", + "integrity": "sha512-6KQ/+QxK49Z/p3HO6E5ZCZWNnCasyZLa5ExaVYyvPxUwKtbCPMKELJOqh7EqOle0t9cH/7d2TaaTRRa6Nhs4YQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.18.1" + } + }, + "node_modules/undici-types": { + "version": "7.19.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.19.2.tgz", + "integrity": "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==", + "dev": true, + "license": "MIT" + }, + "node_modules/unenv": { + "version": "2.0.0-rc.24", + "resolved": "https://registry.npmjs.org/unenv/-/unenv-2.0.0-rc.24.tgz", + "integrity": "sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "pathe": "^2.0.3" + } + }, + "node_modules/workerd": { + "version": "1.20260507.1", + "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20260507.1.tgz", + "integrity": "sha512-z7JhsFSe6+X1b5fUHaVpo15VM1IRMJiLofEkq8iKdCo+Veqc+FUg5lIsuz8NwePxuSKrXtO4ZQpGkQLbPVXFhg==", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "bin": { + "workerd": "bin/workerd" + }, + "engines": { + "node": ">=16" + }, + "optionalDependencies": { + "@cloudflare/workerd-darwin-64": "1.20260507.1", + "@cloudflare/workerd-darwin-arm64": "1.20260507.1", + "@cloudflare/workerd-linux-64": "1.20260507.1", + "@cloudflare/workerd-linux-arm64": "1.20260507.1", + "@cloudflare/workerd-windows-64": "1.20260507.1" + } + }, + "node_modules/wrangler": { + "version": "4.90.0", + "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-4.90.0.tgz", + "integrity": "sha512-bmNIykl59TfCUn5xQgU7IWylSsPx3LQaPLMSAq2VQHt89CBrcj9qXQ0eYfjBCWA5XTBVgten391evt7xxtXwcA==", + "dev": true, + "license": "MIT OR Apache-2.0", + "dependencies": { + "@cloudflare/kv-asset-handler": "0.5.0", + "@cloudflare/unenv-preset": "2.16.1", + "blake3-wasm": "2.1.5", + "esbuild": "0.27.3", + "miniflare": "4.20260507.1", + "path-to-regexp": "6.3.0", + "unenv": "2.0.0-rc.24", + "workerd": "1.20260507.1" + }, + "bin": { + "wrangler": "bin/wrangler.js", + "wrangler2": "bin/wrangler.js" + }, + "engines": { + "node": ">=22.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@cloudflare/workers-types": "^4.20260507.1" + }, + "peerDependenciesMeta": { + "@cloudflare/workers-types": { + "optional": true + } + } + }, + "node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/youch": { + "version": "4.1.0-beta.10", + "resolved": "https://registry.npmjs.org/youch/-/youch-4.1.0-beta.10.tgz", + "integrity": "sha512-rLfVLB4FgQneDr0dv1oddCVZmKjcJ6yX6mS4pU82Mq/Dt9a3cLZQ62pDBL4AUO+uVrCvtWz3ZFUL2HFAFJ/BXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@poppinss/colors": "^4.1.5", + "@poppinss/dumper": "^0.6.4", + "@speed-highlight/core": "^1.2.7", + "cookie": "^1.0.2", + "youch-core": "^0.3.3" + } + }, + "node_modules/youch-core": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/youch-core/-/youch-core-0.3.3.tgz", + "integrity": "sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@poppinss/exception": "^1.2.2", + "error-stack-parser-es": "^1.0.5" + } + } + } +} diff --git a/edge-api/package.json b/edge-api/package.json new file mode 100644 index 0000000000..c3093b207b --- /dev/null +++ b/edge-api/package.json @@ -0,0 +1,20 @@ +{ + "name": "edge-api", + "version": "1.0.1", + "private": true, + "scripts": { + "deploy": "wrangler deploy", + "dev": "wrangler dev", + "start": "wrangler dev", + "typecheck": "tsc --noEmit", + "cf-typegen": "wrangler types" + }, + "dependencies": { + "hono": "^4.12.12" + }, + "devDependencies": { + "@types/node": "^25.6.2", + "typescript": "^5.9.3", + "wrangler": "^4.90.0" + } +} diff --git a/edge-api/src/index.ts b/edge-api/src/index.ts new file mode 100644 index 0000000000..1f8b8462a6 --- /dev/null +++ b/edge-api/src/index.ts @@ -0,0 +1,176 @@ +import { Hono } from "hono"; + +type WorkerEnv = { + APP_NAME: string; + COURSE_NAME: string; + APP_VERSION: string; + ENVIRONMENT: string; + API_TOKEN?: string; + ADMIN_EMAIL?: string; + SETTINGS: KVNamespace; +}; + +type CloudflareRequest = Request & { + cf?: Record; +}; + +const counterKey = "lab17-counter"; +const routes = [ + { method: "GET", path: "/", description: "Application metadata and route index" }, + { method: "GET", path: "/health", description: "Health probe for uptime checks" }, + { method: "GET", path: "/edge", description: "Selected Cloudflare edge request metadata" }, + { method: "GET", path: "/config", description: "Plaintext config and redacted secret status" }, + { method: "GET", path: "/counter", description: "Read the KV-backed counter" }, + { method: "POST", path: "/counter", description: "Increment the KV-backed counter" }, +] as const; + +const app = new Hono<{ Bindings: WorkerEnv }>(); + +const cfString = (cf: Record, key: string): string | null => { + const value = cf[key]; + + return typeof value === "string" ? value : null; +}; + +const cfNumber = (cf: Record, key: string): number | null => { + const value = cf[key]; + + return typeof value === "number" ? value : null; +}; + +const secretStatus = (value: string | undefined) => ({ + configured: Boolean(value), + value: value ? "[redacted]" : null, +}); + +app.use("*", async (c, next) => { + const request = c.req.raw as CloudflareRequest; + const cf = request.cf ?? {}; + const path = new URL(c.req.url).pathname; + + console.log( + JSON.stringify({ + event: "request", + method: c.req.method, + path, + colo: cfString(cf, "colo"), + country: cfString(cf, "country"), + }), + ); + + await next(); +}); + +app.get("/", (c) => { + return c.json({ + app: c.env.APP_NAME, + course: c.env.COURSE_NAME, + version: c.env.APP_VERSION, + environment: c.env.ENVIRONMENT, + routes, + }); +}); + +app.get("/health", (c) => { + return c.json({ + status: "ok", + service: c.env.APP_NAME, + version: c.env.APP_VERSION, + timestamp: new Date().toISOString(), + }); +}); + +app.get("/edge", (c) => { + const request = c.req.raw as CloudflareRequest; + const cf = request.cf ?? {}; + + return c.json({ + colo: cfString(cf, "colo"), + country: cfString(cf, "country"), + city: cfString(cf, "city"), + region: cfString(cf, "region"), + postalCode: cfString(cf, "postalCode"), + timezone: cfString(cf, "timezone"), + asn: cfNumber(cf, "asn"), + asOrganization: cfString(cf, "asOrganization"), + httpProtocol: cfString(cf, "httpProtocol"), + tlsVersion: cfString(cf, "tlsVersion"), + }); +}); + +app.get("/config", (c) => { + return c.json({ + vars: { + APP_NAME: c.env.APP_NAME, + COURSE_NAME: c.env.COURSE_NAME, + APP_VERSION: c.env.APP_VERSION, + ENVIRONMENT: c.env.ENVIRONMENT, + }, + secrets: { + API_TOKEN: secretStatus(c.env.API_TOKEN), + ADMIN_EMAIL: secretStatus(c.env.ADMIN_EMAIL), + }, + kv: { + binding: "SETTINGS", + counterKey, + }, + }); +}); + +app.get("/counter", async (c) => { + const rawValue = await c.env.SETTINGS.get(counterKey); + const value = Number.parseInt(rawValue ?? "0", 10); + + return c.json({ + key: counterKey, + value: Number.isFinite(value) ? value : 0, + persisted: rawValue !== null, + }); +}); + +app.post("/counter", async (c) => { + const rawValue = await c.env.SETTINGS.get(counterKey); + const currentValue = Number.parseInt(rawValue ?? "0", 10); + const previous = Number.isFinite(currentValue) ? currentValue : 0; + const value = previous + 1; + + await c.env.SETTINGS.put(counterKey, value.toString()); + + return c.json({ + key: counterKey, + previous, + value, + persisted: true, + }); +}); + +app.notFound((c) => { + return c.json( + { + error: "not_found", + path: new URL(c.req.url).pathname, + routes, + }, + 404, + ); +}); + +app.onError((error, c) => { + console.error( + JSON.stringify({ + event: "error", + message: error.message, + path: new URL(c.req.url).pathname, + }), + ); + + return c.json( + { + error: "internal_error", + message: "Unexpected Worker error", + }, + 500, + ); +}); + +export default app; diff --git a/edge-api/tsconfig.json b/edge-api/tsconfig.json new file mode 100644 index 0000000000..5879fef775 --- /dev/null +++ b/edge-api/tsconfig.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + /* Base Options: */ + "esModuleInterop": true, + "skipLibCheck": true, + "target": "es2024", + "verbatimModuleSyntax": false, + "allowJs": true, + "resolveJsonModule": true, + "moduleDetection": "force", + /* Strictness */ + "strict": true, + "noUncheckedIndexedAccess": true, + /* If NOT transpiling with TypeScript: */ + "moduleResolution": "Bundler", + "module": "es2022", + "noEmit": true, + "lib": ["es2024"], + "types": [ + "./worker-configuration.d.ts", + "@types/node", + "node" + ] + }, + "exclude": ["node_modules", "dist", "tests"], + "include": ["src", "worker-configuration.d.ts"] +} diff --git a/edge-api/worker-configuration.d.ts b/edge-api/worker-configuration.d.ts new file mode 100644 index 0000000000..f1d0f4a98a --- /dev/null +++ b/edge-api/worker-configuration.d.ts @@ -0,0 +1,13563 @@ +/* eslint-disable */ +// Generated by Wrangler by running `wrangler types` (hash: 957ac867a989f10144351edf09a586ea) +// Runtime types generated with workerd@1.20260507.1 2026-05-10 nodejs_compat +declare namespace Cloudflare { + interface GlobalProps { + mainModule: typeof import("./src/index"); + } + interface Env { + SETTINGS: KVNamespace; + APP_NAME: "edge-api"; + COURSE_NAME: "DevOps Core S26"; + APP_VERSION: "1.0.1"; + ENVIRONMENT: "production"; + API_TOKEN: string; + ADMIN_EMAIL: string; + } +} +interface Env extends Cloudflare.Env {} +type StringifyValues> = { + [Binding in keyof EnvType]: EnvType[Binding] extends string ? EnvType[Binding] : string; +}; +declare namespace NodeJS { + interface ProcessEnv extends StringifyValues> {} +} + +// Begin runtime types +/*! ***************************************************************************** +Copyright (c) Cloudflare. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); you may not use +this file except in compliance with the License. You may obtain a copy of the +License at http://www.apache.org/licenses/LICENSE-2.0 +THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED +WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, +MERCHANTABLITY OR NON-INFRINGEMENT. +See the Apache Version 2.0 License for specific language governing permissions +and limitations under the License. +***************************************************************************** */ +/* eslint-disable */ +// noinspection JSUnusedGlobalSymbols +declare var onmessage: never; +/** + * The **`DOMException`** interface represents an abnormal event (called an **exception**) that occurs as a result of calling a method or accessing a property of a web API. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/DOMException) + */ +declare class DOMException extends Error { + constructor(message?: string, name?: string); + /** + * The **`message`** read-only property of the a message or description associated with the given error name. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/DOMException/message) + */ + readonly message: string; + /** + * The **`name`** read-only property of the one of the strings associated with an error name. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/DOMException/name) + */ + readonly name: string; + /** + * The **`code`** read-only property of the DOMException interface returns one of the legacy error code constants, or `0` if none match. + * @deprecated + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/DOMException/code) + */ + readonly code: number; + static readonly INDEX_SIZE_ERR: number; + static readonly DOMSTRING_SIZE_ERR: number; + static readonly HIERARCHY_REQUEST_ERR: number; + static readonly WRONG_DOCUMENT_ERR: number; + static readonly INVALID_CHARACTER_ERR: number; + static readonly NO_DATA_ALLOWED_ERR: number; + static readonly NO_MODIFICATION_ALLOWED_ERR: number; + static readonly NOT_FOUND_ERR: number; + static readonly NOT_SUPPORTED_ERR: number; + static readonly INUSE_ATTRIBUTE_ERR: number; + static readonly INVALID_STATE_ERR: number; + static readonly SYNTAX_ERR: number; + static readonly INVALID_MODIFICATION_ERR: number; + static readonly NAMESPACE_ERR: number; + static readonly INVALID_ACCESS_ERR: number; + static readonly VALIDATION_ERR: number; + static readonly TYPE_MISMATCH_ERR: number; + static readonly SECURITY_ERR: number; + static readonly NETWORK_ERR: number; + static readonly ABORT_ERR: number; + static readonly URL_MISMATCH_ERR: number; + static readonly QUOTA_EXCEEDED_ERR: number; + static readonly TIMEOUT_ERR: number; + static readonly INVALID_NODE_TYPE_ERR: number; + static readonly DATA_CLONE_ERR: number; + get stack(): any; + set stack(value: any); +} +type WorkerGlobalScopeEventMap = { + fetch: FetchEvent; + scheduled: ScheduledEvent; + queue: QueueEvent; + unhandledrejection: PromiseRejectionEvent; + rejectionhandled: PromiseRejectionEvent; +}; +declare abstract class WorkerGlobalScope extends EventTarget { + EventTarget: typeof EventTarget; +} +/* The **`console`** object provides access to the debugging console (e.g., the Web console in Firefox). * + * The **`console`** object provides access to the debugging console (e.g., the Web console in Firefox). + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/console) + */ +interface Console { + "assert"(condition?: boolean, ...data: any[]): void; + /** + * The **`console.clear()`** static method clears the console if possible. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/clear_static) + */ + clear(): void; + /** + * The **`console.count()`** static method logs the number of times that this particular call to `count()` has been called. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/count_static) + */ + count(label?: string): void; + /** + * The **`console.countReset()`** static method resets counter used with console/count_static. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/countReset_static) + */ + countReset(label?: string): void; + /** + * The **`console.debug()`** static method outputs a message to the console at the 'debug' log level. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/debug_static) + */ + debug(...data: any[]): void; + /** + * The **`console.dir()`** static method displays a list of the properties of the specified JavaScript object. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/dir_static) + */ + dir(item?: any, options?: any): void; + /** + * The **`console.dirxml()`** static method displays an interactive tree of the descendant elements of the specified XML/HTML element. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/dirxml_static) + */ + dirxml(...data: any[]): void; + /** + * The **`console.error()`** static method outputs a message to the console at the 'error' log level. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/error_static) + */ + error(...data: any[]): void; + /** + * The **`console.group()`** static method creates a new inline group in the Web console log, causing any subsequent console messages to be indented by an additional level, until console/groupEnd_static is called. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/group_static) + */ + group(...data: any[]): void; + /** + * The **`console.groupCollapsed()`** static method creates a new inline group in the console. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/groupCollapsed_static) + */ + groupCollapsed(...data: any[]): void; + /** + * The **`console.groupEnd()`** static method exits the current inline group in the console. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/groupEnd_static) + */ + groupEnd(): void; + /** + * The **`console.info()`** static method outputs a message to the console at the 'info' log level. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/info_static) + */ + info(...data: any[]): void; + /** + * The **`console.log()`** static method outputs a message to the console. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/log_static) + */ + log(...data: any[]): void; + /** + * The **`console.table()`** static method displays tabular data as a table. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/table_static) + */ + table(tabularData?: any, properties?: string[]): void; + /** + * The **`console.time()`** static method starts a timer you can use to track how long an operation takes. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/time_static) + */ + time(label?: string): void; + /** + * The **`console.timeEnd()`** static method stops a timer that was previously started by calling console/time_static. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/timeEnd_static) + */ + timeEnd(label?: string): void; + /** + * The **`console.timeLog()`** static method logs the current value of a timer that was previously started by calling console/time_static. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/timeLog_static) + */ + timeLog(label?: string, ...data: any[]): void; + timeStamp(label?: string): void; + /** + * The **`console.trace()`** static method outputs a stack trace to the console. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/trace_static) + */ + trace(...data: any[]): void; + /** + * The **`console.warn()`** static method outputs a warning message to the console at the 'warning' log level. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/warn_static) + */ + warn(...data: any[]): void; +} +declare const console: Console; +type BufferSource = ArrayBufferView | ArrayBuffer; +type TypedArray = Int8Array | Uint8Array | Uint8ClampedArray | Int16Array | Uint16Array | Int32Array | Uint32Array | Float32Array | Float64Array | BigInt64Array | BigUint64Array; +declare namespace WebAssembly { + class CompileError extends Error { + constructor(message?: string); + } + class RuntimeError extends Error { + constructor(message?: string); + } + type ValueType = "anyfunc" | "externref" | "f32" | "f64" | "i32" | "i64" | "v128"; + interface GlobalDescriptor { + value: ValueType; + mutable?: boolean; + } + class Global { + constructor(descriptor: GlobalDescriptor, value?: any); + value: any; + valueOf(): any; + } + type ImportValue = ExportValue | number; + type ModuleImports = Record; + type Imports = Record; + type ExportValue = Function | Global | Memory | Table; + type Exports = Record; + class Instance { + constructor(module: Module, imports?: Imports); + readonly exports: Exports; + } + interface MemoryDescriptor { + initial: number; + maximum?: number; + shared?: boolean; + } + class Memory { + constructor(descriptor: MemoryDescriptor); + readonly buffer: ArrayBuffer; + grow(delta: number): number; + } + type ImportExportKind = "function" | "global" | "memory" | "table"; + interface ModuleExportDescriptor { + kind: ImportExportKind; + name: string; + } + interface ModuleImportDescriptor { + kind: ImportExportKind; + module: string; + name: string; + } + abstract class Module { + static customSections(module: Module, sectionName: string): ArrayBuffer[]; + static exports(module: Module): ModuleExportDescriptor[]; + static imports(module: Module): ModuleImportDescriptor[]; + } + type TableKind = "anyfunc" | "externref"; + interface TableDescriptor { + element: TableKind; + initial: number; + maximum?: number; + } + class Table { + constructor(descriptor: TableDescriptor, value?: any); + readonly length: number; + get(index: number): any; + grow(delta: number, value?: any): number; + set(index: number, value?: any): void; + } + function instantiate(module: Module, imports?: Imports): Promise; + function validate(bytes: BufferSource): boolean; +} +/** + * The **`ServiceWorkerGlobalScope`** interface of the Service Worker API represents the global execution context of a service worker. + * Available only in secure contexts. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ServiceWorkerGlobalScope) + */ +interface ServiceWorkerGlobalScope extends WorkerGlobalScope { + DOMException: typeof DOMException; + WorkerGlobalScope: typeof WorkerGlobalScope; + btoa(data: string): string; + atob(data: string): string; + setTimeout(callback: (...args: any[]) => void, msDelay?: number): number; + setTimeout(callback: (...args: Args) => void, msDelay?: number, ...args: Args): number; + clearTimeout(timeoutId: number | null): void; + setInterval(callback: (...args: any[]) => void, msDelay?: number): number; + setInterval(callback: (...args: Args) => void, msDelay?: number, ...args: Args): number; + clearInterval(timeoutId: number | null): void; + queueMicrotask(task: Function): void; + structuredClone(value: T, options?: StructuredSerializeOptions): T; + reportError(error: any): void; + fetch(input: RequestInfo | URL, init?: RequestInit): Promise; + self: ServiceWorkerGlobalScope; + crypto: Crypto; + caches: CacheStorage; + scheduler: Scheduler; + performance: Performance; + Cloudflare: Cloudflare; + readonly origin: string; + Event: typeof Event; + ExtendableEvent: typeof ExtendableEvent; + CustomEvent: typeof CustomEvent; + PromiseRejectionEvent: typeof PromiseRejectionEvent; + FetchEvent: typeof FetchEvent; + TailEvent: typeof TailEvent; + TraceEvent: typeof TailEvent; + ScheduledEvent: typeof ScheduledEvent; + MessageEvent: typeof MessageEvent; + CloseEvent: typeof CloseEvent; + ReadableStreamDefaultReader: typeof ReadableStreamDefaultReader; + ReadableStreamBYOBReader: typeof ReadableStreamBYOBReader; + ReadableStream: typeof ReadableStream; + WritableStream: typeof WritableStream; + WritableStreamDefaultWriter: typeof WritableStreamDefaultWriter; + TransformStream: typeof TransformStream; + ByteLengthQueuingStrategy: typeof ByteLengthQueuingStrategy; + CountQueuingStrategy: typeof CountQueuingStrategy; + ErrorEvent: typeof ErrorEvent; + MessageChannel: typeof MessageChannel; + MessagePort: typeof MessagePort; + EventSource: typeof EventSource; + ReadableStreamBYOBRequest: typeof ReadableStreamBYOBRequest; + ReadableStreamDefaultController: typeof ReadableStreamDefaultController; + ReadableByteStreamController: typeof ReadableByteStreamController; + WritableStreamDefaultController: typeof WritableStreamDefaultController; + TransformStreamDefaultController: typeof TransformStreamDefaultController; + CompressionStream: typeof CompressionStream; + DecompressionStream: typeof DecompressionStream; + TextEncoderStream: typeof TextEncoderStream; + TextDecoderStream: typeof TextDecoderStream; + Headers: typeof Headers; + Body: typeof Body; + Request: typeof Request; + Response: typeof Response; + WebSocket: typeof WebSocket; + WebSocketPair: typeof WebSocketPair; + WebSocketRequestResponsePair: typeof WebSocketRequestResponsePair; + AbortController: typeof AbortController; + AbortSignal: typeof AbortSignal; + TextDecoder: typeof TextDecoder; + TextEncoder: typeof TextEncoder; + navigator: Navigator; + Navigator: typeof Navigator; + URL: typeof URL; + URLSearchParams: typeof URLSearchParams; + URLPattern: typeof URLPattern; + Blob: typeof Blob; + File: typeof File; + FormData: typeof FormData; + Crypto: typeof Crypto; + SubtleCrypto: typeof SubtleCrypto; + CryptoKey: typeof CryptoKey; + CacheStorage: typeof CacheStorage; + Cache: typeof Cache; + FixedLengthStream: typeof FixedLengthStream; + IdentityTransformStream: typeof IdentityTransformStream; + HTMLRewriter: typeof HTMLRewriter; +} +declare function addEventListener(type: Type, handler: EventListenerOrEventListenerObject, options?: EventTargetAddEventListenerOptions | boolean): void; +declare function removeEventListener(type: Type, handler: EventListenerOrEventListenerObject, options?: EventTargetEventListenerOptions | boolean): void; +/** + * The **`dispatchEvent()`** method of the EventTarget sends an Event to the object, (synchronously) invoking the affected event listeners in the appropriate order. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventTarget/dispatchEvent) + */ +declare function dispatchEvent(event: WorkerGlobalScopeEventMap[keyof WorkerGlobalScopeEventMap]): boolean; +/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Window/btoa) */ +declare function btoa(data: string): string; +/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Window/atob) */ +declare function atob(data: string): string; +/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Window/setTimeout) */ +declare function setTimeout(callback: (...args: any[]) => void, msDelay?: number): number; +/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Window/setTimeout) */ +declare function setTimeout(callback: (...args: Args) => void, msDelay?: number, ...args: Args): number; +/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Window/clearTimeout) */ +declare function clearTimeout(timeoutId: number | null): void; +/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Window/setInterval) */ +declare function setInterval(callback: (...args: any[]) => void, msDelay?: number): number; +/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Window/setInterval) */ +declare function setInterval(callback: (...args: Args) => void, msDelay?: number, ...args: Args): number; +/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Window/clearInterval) */ +declare function clearInterval(timeoutId: number | null): void; +/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Window/queueMicrotask) */ +declare function queueMicrotask(task: Function): void; +/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Window/structuredClone) */ +declare function structuredClone(value: T, options?: StructuredSerializeOptions): T; +/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Window/reportError) */ +declare function reportError(error: any): void; +/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Window/fetch) */ +declare function fetch(input: RequestInfo | URL, init?: RequestInit): Promise; +declare const self: ServiceWorkerGlobalScope; +/** +* The Web Crypto API provides a set of low-level functions for common cryptographic tasks. +* The Workers runtime implements the full surface of this API, but with some differences in +* the [supported algorithms](https://developers.cloudflare.com/workers/runtime-apis/web-crypto/#supported-algorithms) +* compared to those implemented in most browsers. +* +* [Cloudflare Docs Reference](https://developers.cloudflare.com/workers/runtime-apis/web-crypto/) +*/ +declare const crypto: Crypto; +/** +* The Cache API allows fine grained control of reading and writing from the Cloudflare global network cache. +* +* [Cloudflare Docs Reference](https://developers.cloudflare.com/workers/runtime-apis/cache/) +*/ +declare const caches: CacheStorage; +declare const scheduler: Scheduler; +/** +* The Workers runtime supports a subset of the Performance API, used to measure timing and performance, +* as well as timing of subrequests and other operations. +* +* [Cloudflare Docs Reference](https://developers.cloudflare.com/workers/runtime-apis/performance/) +*/ +declare const performance: Performance; +declare const Cloudflare: Cloudflare; +declare const origin: string; +declare const navigator: Navigator; +interface TestController { +} +interface ExecutionContext { + waitUntil(promise: Promise): void; + passThroughOnException(): void; + readonly exports: Cloudflare.Exports; + readonly props: Props; + cache?: CacheContext; + tracing?: Tracing; +} +type ExportedHandlerFetchHandler = (request: Request>, env: Env, ctx: ExecutionContext) => Response | Promise; +type ExportedHandlerConnectHandler = (socket: Socket, env: Env, ctx: ExecutionContext) => void | Promise; +type ExportedHandlerTailHandler = (events: TraceItem[], env: Env, ctx: ExecutionContext) => void | Promise; +type ExportedHandlerTraceHandler = (traces: TraceItem[], env: Env, ctx: ExecutionContext) => void | Promise; +type ExportedHandlerTailStreamHandler = (event: TailStream.TailEvent, env: Env, ctx: ExecutionContext) => TailStream.TailEventHandlerType | Promise; +type ExportedHandlerScheduledHandler = (controller: ScheduledController, env: Env, ctx: ExecutionContext) => void | Promise; +type ExportedHandlerQueueHandler = (batch: MessageBatch, env: Env, ctx: ExecutionContext) => void | Promise; +type ExportedHandlerTestHandler = (controller: TestController, env: Env, ctx: ExecutionContext) => void | Promise; +interface ExportedHandler { + fetch?: ExportedHandlerFetchHandler; + connect?: ExportedHandlerConnectHandler; + tail?: ExportedHandlerTailHandler; + trace?: ExportedHandlerTraceHandler; + tailStream?: ExportedHandlerTailStreamHandler; + scheduled?: ExportedHandlerScheduledHandler; + test?: ExportedHandlerTestHandler; + email?: EmailExportedHandler; + queue?: ExportedHandlerQueueHandler; +} +interface StructuredSerializeOptions { + transfer?: any[]; +} +declare abstract class Navigator { + sendBeacon(url: string, body?: BodyInit): boolean; + readonly userAgent: string; + readonly hardwareConcurrency: number; + readonly platform: string; + readonly language: string; + readonly languages: string[]; +} +interface AlarmInvocationInfo { + readonly isRetry: boolean; + readonly retryCount: number; + readonly scheduledTime: number; +} +interface Cloudflare { + readonly compatibilityFlags: Record; +} +interface CachePurgeError { + code: number; + message: string; +} +interface CachePurgeResult { + success: boolean; + errors: CachePurgeError[]; +} +interface CachePurgeOptions { + tags?: string[]; + pathPrefixes?: string[]; + purgeEverything?: boolean; +} +interface CacheContext { + purge(options: CachePurgeOptions): Promise; +} +declare abstract class ColoLocalActorNamespace { + get(actorId: string): Fetcher; +} +interface DurableObject { + fetch(request: Request): Response | Promise; + connect?(socket: Socket): void | Promise; + alarm?(alarmInfo?: AlarmInvocationInfo): void | Promise; + webSocketMessage?(ws: WebSocket, message: string | ArrayBuffer): void | Promise; + webSocketClose?(ws: WebSocket, code: number, reason: string, wasClean: boolean): void | Promise; + webSocketError?(ws: WebSocket, error: unknown): void | Promise; +} +type DurableObjectStub = Fetcher & { + readonly id: DurableObjectId; + readonly name?: string; +}; +interface DurableObjectId { + toString(): string; + equals(other: DurableObjectId): boolean; + readonly name?: string; + readonly jurisdiction?: string; +} +declare abstract class DurableObjectNamespace { + newUniqueId(options?: DurableObjectNamespaceNewUniqueIdOptions): DurableObjectId; + idFromName(name: string): DurableObjectId; + idFromString(id: string): DurableObjectId; + get(id: DurableObjectId, options?: DurableObjectNamespaceGetDurableObjectOptions): DurableObjectStub; + getByName(name: string, options?: DurableObjectNamespaceGetDurableObjectOptions): DurableObjectStub; + jurisdiction(jurisdiction: DurableObjectJurisdiction): DurableObjectNamespace; +} +type DurableObjectJurisdiction = "eu" | "fedramp" | "fedramp-high"; +interface DurableObjectNamespaceNewUniqueIdOptions { + jurisdiction?: DurableObjectJurisdiction; +} +type DurableObjectLocationHint = "wnam" | "enam" | "sam" | "weur" | "eeur" | "apac" | "oc" | "afr" | "me"; +type DurableObjectRoutingMode = "primary-only"; +interface DurableObjectNamespaceGetDurableObjectOptions { + locationHint?: DurableObjectLocationHint; + routingMode?: DurableObjectRoutingMode; +} +interface DurableObjectClass<_T extends Rpc.DurableObjectBranded | undefined = undefined> { +} +interface DurableObjectState { + waitUntil(promise: Promise): void; + readonly exports: Cloudflare.Exports; + readonly props: Props; + readonly id: DurableObjectId; + readonly storage: DurableObjectStorage; + container?: Container; + facets: DurableObjectFacets; + blockConcurrencyWhile(callback: () => Promise): Promise; + acceptWebSocket(ws: WebSocket, tags?: string[]): void; + getWebSockets(tag?: string): WebSocket[]; + setWebSocketAutoResponse(maybeReqResp?: WebSocketRequestResponsePair): void; + getWebSocketAutoResponse(): WebSocketRequestResponsePair | null; + getWebSocketAutoResponseTimestamp(ws: WebSocket): Date | null; + setHibernatableWebSocketEventTimeout(timeoutMs?: number): void; + getHibernatableWebSocketEventTimeout(): number | null; + getTags(ws: WebSocket): string[]; + abort(reason?: string): void; +} +interface DurableObjectTransaction { + get(key: string, options?: DurableObjectGetOptions): Promise; + get(keys: string[], options?: DurableObjectGetOptions): Promise>; + list(options?: DurableObjectListOptions): Promise>; + put(key: string, value: T, options?: DurableObjectPutOptions): Promise; + put(entries: Record, options?: DurableObjectPutOptions): Promise; + delete(key: string, options?: DurableObjectPutOptions): Promise; + delete(keys: string[], options?: DurableObjectPutOptions): Promise; + rollback(): void; + getAlarm(options?: DurableObjectGetAlarmOptions): Promise; + setAlarm(scheduledTime: number | Date, options?: DurableObjectSetAlarmOptions): Promise; + deleteAlarm(options?: DurableObjectSetAlarmOptions): Promise; +} +interface DurableObjectStorage { + get(key: string, options?: DurableObjectGetOptions): Promise; + get(keys: string[], options?: DurableObjectGetOptions): Promise>; + list(options?: DurableObjectListOptions): Promise>; + put(key: string, value: T, options?: DurableObjectPutOptions): Promise; + put(entries: Record, options?: DurableObjectPutOptions): Promise; + delete(key: string, options?: DurableObjectPutOptions): Promise; + delete(keys: string[], options?: DurableObjectPutOptions): Promise; + deleteAll(options?: DurableObjectPutOptions): Promise; + transaction(closure: (txn: DurableObjectTransaction) => Promise): Promise; + getAlarm(options?: DurableObjectGetAlarmOptions): Promise; + setAlarm(scheduledTime: number | Date, options?: DurableObjectSetAlarmOptions): Promise; + deleteAlarm(options?: DurableObjectSetAlarmOptions): Promise; + sync(): Promise; + sql: SqlStorage; + kv: SyncKvStorage; + transactionSync(closure: () => T): T; + getCurrentBookmark(): Promise; + getBookmarkForTime(timestamp: number | Date): Promise; + onNextSessionRestoreBookmark(bookmark: string): Promise; +} +interface DurableObjectListOptions { + start?: string; + startAfter?: string; + end?: string; + prefix?: string; + reverse?: boolean; + limit?: number; + allowConcurrency?: boolean; + noCache?: boolean; +} +interface DurableObjectGetOptions { + allowConcurrency?: boolean; + noCache?: boolean; +} +interface DurableObjectGetAlarmOptions { + allowConcurrency?: boolean; +} +interface DurableObjectPutOptions { + allowConcurrency?: boolean; + allowUnconfirmed?: boolean; + noCache?: boolean; +} +interface DurableObjectSetAlarmOptions { + allowConcurrency?: boolean; + allowUnconfirmed?: boolean; +} +declare class WebSocketRequestResponsePair { + constructor(request: string, response: string); + get request(): string; + get response(): string; +} +interface DurableObjectFacets { + get(name: string, getStartupOptions: () => FacetStartupOptions | Promise>): Fetcher; + abort(name: string, reason: any): void; + delete(name: string): void; +} +interface FacetStartupOptions { + id?: DurableObjectId | string; + class: DurableObjectClass; +} +interface AnalyticsEngineDataset { + writeDataPoint(event?: AnalyticsEngineDataPoint): void; +} +interface AnalyticsEngineDataPoint { + indexes?: ((ArrayBuffer | string) | null)[]; + doubles?: number[]; + blobs?: ((ArrayBuffer | string) | null)[]; +} +/** + * The **`Event`** interface represents an event which takes place on an `EventTarget`. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event) + */ +declare class Event { + constructor(type: string, init?: EventInit); + /** + * The **`type`** read-only property of the Event interface returns a string containing the event's type. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/type) + */ + get type(): string; + /** + * The **`eventPhase`** read-only property of the being evaluated. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/eventPhase) + */ + get eventPhase(): number; + /** + * The read-only **`composed`** property of the or not the event will propagate across the shadow DOM boundary into the standard DOM. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/composed) + */ + get composed(): boolean; + /** + * The **`bubbles`** read-only property of the Event interface indicates whether the event bubbles up through the DOM tree or not. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/bubbles) + */ + get bubbles(): boolean; + /** + * The **`cancelable`** read-only property of the Event interface indicates whether the event can be canceled, and therefore prevented as if the event never happened. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/cancelable) + */ + get cancelable(): boolean; + /** + * The **`defaultPrevented`** read-only property of the Event interface returns a boolean value indicating whether or not the call to Event.preventDefault() canceled the event. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/defaultPrevented) + */ + get defaultPrevented(): boolean; + /** + * The Event property **`returnValue`** indicates whether the default action for this event has been prevented or not. + * @deprecated + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/returnValue) + */ + get returnValue(): boolean; + /** + * The **`currentTarget`** read-only property of the Event interface identifies the element to which the event handler has been attached. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/currentTarget) + */ + get currentTarget(): EventTarget | undefined; + /** + * The read-only **`target`** property of the dispatched. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/target) + */ + get target(): EventTarget | undefined; + /** + * The deprecated **`Event.srcElement`** is an alias for the Event.target property. + * @deprecated + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/srcElement) + */ + get srcElement(): EventTarget | undefined; + /** + * The **`timeStamp`** read-only property of the Event interface returns the time (in milliseconds) at which the event was created. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/timeStamp) + */ + get timeStamp(): number; + /** + * The **`isTrusted`** read-only property of the when the event was generated by the user agent (including via user actions and programmatic methods such as HTMLElement.focus()), and `false` when the event was dispatched via The only exception is the `click` event, which initializes the `isTrusted` property to `false` in user agents. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/isTrusted) + */ + get isTrusted(): boolean; + /** + * The **`cancelBubble`** property of the Event interface is deprecated. + * @deprecated + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/cancelBubble) + */ + get cancelBubble(): boolean; + /** + * The **`cancelBubble`** property of the Event interface is deprecated. + * @deprecated + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/cancelBubble) + */ + set cancelBubble(value: boolean); + /** + * The **`stopImmediatePropagation()`** method of the If several listeners are attached to the same element for the same event type, they are called in the order in which they were added. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/stopImmediatePropagation) + */ + stopImmediatePropagation(): void; + /** + * The **`preventDefault()`** method of the Event interface tells the user agent that if the event does not get explicitly handled, its default action should not be taken as it normally would be. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/preventDefault) + */ + preventDefault(): void; + /** + * The **`stopPropagation()`** method of the Event interface prevents further propagation of the current event in the capturing and bubbling phases. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/stopPropagation) + */ + stopPropagation(): void; + /** + * The **`composedPath()`** method of the Event interface returns the event's path which is an array of the objects on which listeners will be invoked. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/composedPath) + */ + composedPath(): EventTarget[]; + static readonly NONE: number; + static readonly CAPTURING_PHASE: number; + static readonly AT_TARGET: number; + static readonly BUBBLING_PHASE: number; +} +interface EventInit { + bubbles?: boolean; + cancelable?: boolean; + composed?: boolean; +} +type EventListener = (event: EventType) => void; +interface EventListenerObject { + handleEvent(event: EventType): void; +} +type EventListenerOrEventListenerObject = EventListener | EventListenerObject; +/** + * The **`EventTarget`** interface is implemented by objects that can receive events and may have listeners for them. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventTarget) + */ +declare class EventTarget = Record> { + constructor(); + /** + * The **`addEventListener()`** method of the EventTarget interface sets up a function that will be called whenever the specified event is delivered to the target. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventTarget/addEventListener) + */ + addEventListener(type: Type, handler: EventListenerOrEventListenerObject, options?: EventTargetAddEventListenerOptions | boolean): void; + /** + * The **`removeEventListener()`** method of the EventTarget interface removes an event listener previously registered with EventTarget.addEventListener() from the target. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventTarget/removeEventListener) + */ + removeEventListener(type: Type, handler: EventListenerOrEventListenerObject, options?: EventTargetEventListenerOptions | boolean): void; + /** + * The **`dispatchEvent()`** method of the EventTarget sends an Event to the object, (synchronously) invoking the affected event listeners in the appropriate order. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventTarget/dispatchEvent) + */ + dispatchEvent(event: EventMap[keyof EventMap]): boolean; +} +interface EventTargetEventListenerOptions { + capture?: boolean; +} +interface EventTargetAddEventListenerOptions { + capture?: boolean; + passive?: boolean; + once?: boolean; + signal?: AbortSignal; +} +interface EventTargetHandlerObject { + handleEvent: (event: Event) => any | undefined; +} +/** + * The **`AbortController`** interface represents a controller object that allows you to abort one or more Web requests as and when desired. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/AbortController) + */ +declare class AbortController { + constructor(); + /** + * The **`signal`** read-only property of the AbortController interface returns an AbortSignal object instance, which can be used to communicate with/abort an asynchronous operation as desired. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/AbortController/signal) + */ + get signal(): AbortSignal; + /** + * The **`abort()`** method of the AbortController interface aborts an asynchronous operation before it has completed. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/AbortController/abort) + */ + abort(reason?: any): void; +} +/** + * The **`AbortSignal`** interface represents a signal object that allows you to communicate with an asynchronous operation (such as a fetch request) and abort it if required via an AbortController object. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/AbortSignal) + */ +declare abstract class AbortSignal extends EventTarget { + /** + * The **`AbortSignal.abort()`** static method returns an AbortSignal that is already set as aborted (and which does not trigger an AbortSignal/abort_event event). + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/AbortSignal/abort_static) + */ + static abort(reason?: any): AbortSignal; + /** + * The **`AbortSignal.timeout()`** static method returns an AbortSignal that will automatically abort after a specified time. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/AbortSignal/timeout_static) + */ + static timeout(delay: number): AbortSignal; + /** + * The **`AbortSignal.any()`** static method takes an iterable of abort signals and returns an AbortSignal. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/AbortSignal/any_static) + */ + static any(signals: AbortSignal[]): AbortSignal; + /** + * The **`aborted`** read-only property returns a value that indicates whether the asynchronous operations the signal is communicating with are aborted (`true`) or not (`false`). + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/AbortSignal/aborted) + */ + get aborted(): boolean; + /** + * The **`reason`** read-only property returns a JavaScript value that indicates the abort reason. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/AbortSignal/reason) + */ + get reason(): any; + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/AbortSignal/abort_event) */ + get onabort(): any | null; + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/AbortSignal/abort_event) */ + set onabort(value: any | null); + /** + * The **`throwIfAborted()`** method throws the signal's abort AbortSignal.reason if the signal has been aborted; otherwise it does nothing. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/AbortSignal/throwIfAborted) + */ + throwIfAborted(): void; +} +interface Scheduler { + wait(delay: number, maybeOptions?: SchedulerWaitOptions): Promise; +} +interface SchedulerWaitOptions { + signal?: AbortSignal; +} +/** + * The **`ExtendableEvent`** interface extends the lifetime of the `install` and `activate` events dispatched on the global scope as part of the service worker lifecycle. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ExtendableEvent) + */ +declare abstract class ExtendableEvent extends Event { + /** + * The **`ExtendableEvent.waitUntil()`** method tells the event dispatcher that work is ongoing. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ExtendableEvent/waitUntil) + */ + waitUntil(promise: Promise): void; +} +/** + * The **`CustomEvent`** interface represents events initialized by an application for any purpose. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/CustomEvent) + */ +declare class CustomEvent extends Event { + constructor(type: string, init?: CustomEventCustomEventInit); + /** + * The read-only **`detail`** property of the CustomEvent interface returns any data passed when initializing the event. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/CustomEvent/detail) + */ + get detail(): T; +} +interface CustomEventCustomEventInit { + bubbles?: boolean; + cancelable?: boolean; + composed?: boolean; + detail?: any; +} +/** + * The **`Blob`** interface represents a blob, which is a file-like object of immutable, raw data; they can be read as text or binary data, or converted into a ReadableStream so its methods can be used for processing the data. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Blob) + */ +declare class Blob { + constructor(bits?: ((ArrayBuffer | ArrayBufferView) | string | Blob)[], options?: BlobOptions); + /** + * The **`size`** read-only property of the Blob interface returns the size of the Blob or File in bytes. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Blob/size) + */ + get size(): number; + /** + * The **`type`** read-only property of the Blob interface returns the MIME type of the file. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Blob/type) + */ + get type(): string; + /** + * The **`slice()`** method of the Blob interface creates and returns a new `Blob` object which contains data from a subset of the blob on which it's called. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Blob/slice) + */ + slice(start?: number, end?: number, type?: string): Blob; + /** + * The **`arrayBuffer()`** method of the Blob interface returns a Promise that resolves with the contents of the blob as binary data contained in an ArrayBuffer. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Blob/arrayBuffer) + */ + arrayBuffer(): Promise; + /** + * The **`bytes()`** method of the Blob interface returns a Promise that resolves with a Uint8Array containing the contents of the blob as an array of bytes. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Blob/bytes) + */ + bytes(): Promise; + /** + * The **`text()`** method of the string containing the contents of the blob, interpreted as UTF-8. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Blob/text) + */ + text(): Promise; + /** + * The **`stream()`** method of the Blob interface returns a ReadableStream which upon reading returns the data contained within the `Blob`. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Blob/stream) + */ + stream(): ReadableStream; +} +interface BlobOptions { + type?: string; +} +/** + * The **`File`** interface provides information about files and allows JavaScript in a web page to access their content. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/File) + */ +declare class File extends Blob { + constructor(bits: ((ArrayBuffer | ArrayBufferView) | string | Blob)[] | undefined, name: string, options?: FileOptions); + /** + * The **`name`** read-only property of the File interface returns the name of the file represented by a File object. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/File/name) + */ + get name(): string; + /** + * The **`lastModified`** read-only property of the File interface provides the last modified date of the file as the number of milliseconds since the Unix epoch (January 1, 1970 at midnight). + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/File/lastModified) + */ + get lastModified(): number; +} +interface FileOptions { + type?: string; + lastModified?: number; +} +/** +* The Cache API allows fine grained control of reading and writing from the Cloudflare global network cache. +* +* [Cloudflare Docs Reference](https://developers.cloudflare.com/workers/runtime-apis/cache/) +*/ +declare abstract class CacheStorage { + /** + * The **`open()`** method of the the Cache object matching the `cacheName`. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/CacheStorage/open) + */ + open(cacheName: string): Promise; + readonly default: Cache; +} +/** +* The Cache API allows fine grained control of reading and writing from the Cloudflare global network cache. +* +* [Cloudflare Docs Reference](https://developers.cloudflare.com/workers/runtime-apis/cache/) +*/ +declare abstract class Cache { + /* [Cloudflare Docs Reference](https://developers.cloudflare.com/workers/runtime-apis/cache/#delete) */ + delete(request: RequestInfo | URL, options?: CacheQueryOptions): Promise; + /* [Cloudflare Docs Reference](https://developers.cloudflare.com/workers/runtime-apis/cache/#match) */ + match(request: RequestInfo | URL, options?: CacheQueryOptions): Promise; + /* [Cloudflare Docs Reference](https://developers.cloudflare.com/workers/runtime-apis/cache/#put) */ + put(request: RequestInfo | URL, response: Response): Promise; +} +interface CacheQueryOptions { + ignoreMethod?: boolean; +} +/** +* The Web Crypto API provides a set of low-level functions for common cryptographic tasks. +* The Workers runtime implements the full surface of this API, but with some differences in +* the [supported algorithms](https://developers.cloudflare.com/workers/runtime-apis/web-crypto/#supported-algorithms) +* compared to those implemented in most browsers. +* +* [Cloudflare Docs Reference](https://developers.cloudflare.com/workers/runtime-apis/web-crypto/) +*/ +declare abstract class Crypto { + /** + * The **`Crypto.subtle`** read-only property returns a cryptographic operations. + * Available only in secure contexts. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Crypto/subtle) + */ + get subtle(): SubtleCrypto; + /** + * The **`Crypto.getRandomValues()`** method lets you get cryptographically strong random values. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Crypto/getRandomValues) + */ + getRandomValues(buffer: T): T; + /** + * The **`randomUUID()`** method of the Crypto interface is used to generate a v4 UUID using a cryptographically secure random number generator. + * Available only in secure contexts. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Crypto/randomUUID) + */ + randomUUID(): string; + DigestStream: typeof DigestStream; +} +/** + * The **`SubtleCrypto`** interface of the Web Crypto API provides a number of low-level cryptographic functions. + * Available only in secure contexts. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto) + */ +declare abstract class SubtleCrypto { + /** + * The **`encrypt()`** method of the SubtleCrypto interface encrypts data. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/encrypt) + */ + encrypt(algorithm: string | SubtleCryptoEncryptAlgorithm, key: CryptoKey, plainText: ArrayBuffer | ArrayBufferView): Promise; + /** + * The **`decrypt()`** method of the SubtleCrypto interface decrypts some encrypted data. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/decrypt) + */ + decrypt(algorithm: string | SubtleCryptoEncryptAlgorithm, key: CryptoKey, cipherText: ArrayBuffer | ArrayBufferView): Promise; + /** + * The **`sign()`** method of the SubtleCrypto interface generates a digital signature. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/sign) + */ + sign(algorithm: string | SubtleCryptoSignAlgorithm, key: CryptoKey, data: ArrayBuffer | ArrayBufferView): Promise; + /** + * The **`verify()`** method of the SubtleCrypto interface verifies a digital signature. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/verify) + */ + verify(algorithm: string | SubtleCryptoSignAlgorithm, key: CryptoKey, signature: ArrayBuffer | ArrayBufferView, data: ArrayBuffer | ArrayBufferView): Promise; + /** + * The **`digest()`** method of the SubtleCrypto interface generates a _digest_ of the given data, using the specified hash function. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/digest) + */ + digest(algorithm: string | SubtleCryptoHashAlgorithm, data: ArrayBuffer | ArrayBufferView): Promise; + /** + * The **`generateKey()`** method of the SubtleCrypto interface is used to generate a new key (for symmetric algorithms) or key pair (for public-key algorithms). + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/generateKey) + */ + generateKey(algorithm: string | SubtleCryptoGenerateKeyAlgorithm, extractable: boolean, keyUsages: string[]): Promise; + /** + * The **`deriveKey()`** method of the SubtleCrypto interface can be used to derive a secret key from a master key. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/deriveKey) + */ + deriveKey(algorithm: string | SubtleCryptoDeriveKeyAlgorithm, baseKey: CryptoKey, derivedKeyAlgorithm: string | SubtleCryptoImportKeyAlgorithm, extractable: boolean, keyUsages: string[]): Promise; + /** + * The **`deriveBits()`** method of the key. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/deriveBits) + */ + deriveBits(algorithm: string | SubtleCryptoDeriveKeyAlgorithm, baseKey: CryptoKey, length?: number | null): Promise; + /** + * The **`importKey()`** method of the SubtleCrypto interface imports a key: that is, it takes as input a key in an external, portable format and gives you a CryptoKey object that you can use in the Web Crypto API. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/importKey) + */ + importKey(format: string, keyData: (ArrayBuffer | ArrayBufferView) | JsonWebKey, algorithm: string | SubtleCryptoImportKeyAlgorithm, extractable: boolean, keyUsages: string[]): Promise; + /** + * The **`exportKey()`** method of the SubtleCrypto interface exports a key: that is, it takes as input a CryptoKey object and gives you the key in an external, portable format. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/exportKey) + */ + exportKey(format: string, key: CryptoKey): Promise; + /** + * The **`wrapKey()`** method of the SubtleCrypto interface 'wraps' a key. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/wrapKey) + */ + wrapKey(format: string, key: CryptoKey, wrappingKey: CryptoKey, wrapAlgorithm: string | SubtleCryptoEncryptAlgorithm): Promise; + /** + * The **`unwrapKey()`** method of the SubtleCrypto interface 'unwraps' a key. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/unwrapKey) + */ + unwrapKey(format: string, wrappedKey: ArrayBuffer | ArrayBufferView, unwrappingKey: CryptoKey, unwrapAlgorithm: string | SubtleCryptoEncryptAlgorithm, unwrappedKeyAlgorithm: string | SubtleCryptoImportKeyAlgorithm, extractable: boolean, keyUsages: string[]): Promise; + timingSafeEqual(a: ArrayBuffer | ArrayBufferView, b: ArrayBuffer | ArrayBufferView): boolean; +} +/** + * The **`CryptoKey`** interface of the Web Crypto API represents a cryptographic key obtained from one of the SubtleCrypto methods SubtleCrypto.generateKey, SubtleCrypto.deriveKey, SubtleCrypto.importKey, or SubtleCrypto.unwrapKey. + * Available only in secure contexts. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/CryptoKey) + */ +declare abstract class CryptoKey { + /** + * The read-only **`type`** property of the CryptoKey interface indicates which kind of key is represented by the object. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/CryptoKey/type) + */ + readonly type: string; + /** + * The read-only **`extractable`** property of the CryptoKey interface indicates whether or not the key may be extracted using `SubtleCrypto.exportKey()` or `SubtleCrypto.wrapKey()`. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/CryptoKey/extractable) + */ + readonly extractable: boolean; + /** + * The read-only **`algorithm`** property of the CryptoKey interface returns an object describing the algorithm for which this key can be used, and any associated extra parameters. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/CryptoKey/algorithm) + */ + readonly algorithm: CryptoKeyKeyAlgorithm | CryptoKeyAesKeyAlgorithm | CryptoKeyHmacKeyAlgorithm | CryptoKeyRsaKeyAlgorithm | CryptoKeyEllipticKeyAlgorithm | CryptoKeyArbitraryKeyAlgorithm; + /** + * The read-only **`usages`** property of the CryptoKey interface indicates what can be done with the key. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/CryptoKey/usages) + */ + readonly usages: string[]; +} +interface CryptoKeyPair { + publicKey: CryptoKey; + privateKey: CryptoKey; +} +interface JsonWebKey { + kty: string; + use?: string; + key_ops?: string[]; + alg?: string; + ext?: boolean; + crv?: string; + x?: string; + y?: string; + d?: string; + n?: string; + e?: string; + p?: string; + q?: string; + dp?: string; + dq?: string; + qi?: string; + oth?: RsaOtherPrimesInfo[]; + k?: string; +} +interface RsaOtherPrimesInfo { + r?: string; + d?: string; + t?: string; +} +interface SubtleCryptoDeriveKeyAlgorithm { + name: string; + salt?: (ArrayBuffer | ArrayBufferView); + iterations?: number; + hash?: (string | SubtleCryptoHashAlgorithm); + $public?: CryptoKey; + info?: (ArrayBuffer | ArrayBufferView); +} +interface SubtleCryptoEncryptAlgorithm { + name: string; + iv?: (ArrayBuffer | ArrayBufferView); + additionalData?: (ArrayBuffer | ArrayBufferView); + tagLength?: number; + counter?: (ArrayBuffer | ArrayBufferView); + length?: number; + label?: (ArrayBuffer | ArrayBufferView); +} +interface SubtleCryptoGenerateKeyAlgorithm { + name: string; + hash?: (string | SubtleCryptoHashAlgorithm); + modulusLength?: number; + publicExponent?: (ArrayBuffer | ArrayBufferView); + length?: number; + namedCurve?: string; +} +interface SubtleCryptoHashAlgorithm { + name: string; +} +interface SubtleCryptoImportKeyAlgorithm { + name: string; + hash?: (string | SubtleCryptoHashAlgorithm); + length?: number; + namedCurve?: string; + compressed?: boolean; +} +interface SubtleCryptoSignAlgorithm { + name: string; + hash?: (string | SubtleCryptoHashAlgorithm); + dataLength?: number; + saltLength?: number; +} +interface CryptoKeyKeyAlgorithm { + name: string; +} +interface CryptoKeyAesKeyAlgorithm { + name: string; + length: number; +} +interface CryptoKeyHmacKeyAlgorithm { + name: string; + hash: CryptoKeyKeyAlgorithm; + length: number; +} +interface CryptoKeyRsaKeyAlgorithm { + name: string; + modulusLength: number; + publicExponent: ArrayBuffer | ArrayBufferView; + hash?: CryptoKeyKeyAlgorithm; +} +interface CryptoKeyEllipticKeyAlgorithm { + name: string; + namedCurve: string; +} +interface CryptoKeyArbitraryKeyAlgorithm { + name: string; + hash?: CryptoKeyKeyAlgorithm; + namedCurve?: string; + length?: number; +} +declare class DigestStream extends WritableStream { + constructor(algorithm: string | SubtleCryptoHashAlgorithm); + readonly digest: Promise; + get bytesWritten(): number | bigint; +} +/** + * The **`TextDecoder`** interface represents a decoder for a specific text encoding, such as `UTF-8`, `ISO-8859-2`, `KOI8-R`, `GBK`, etc. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/TextDecoder) + */ +declare class TextDecoder { + constructor(label?: string, options?: TextDecoderConstructorOptions); + /** + * The **`TextDecoder.decode()`** method returns a string containing text decoded from the buffer passed as a parameter. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/TextDecoder/decode) + */ + decode(input?: (ArrayBuffer | ArrayBufferView), options?: TextDecoderDecodeOptions): string; + get encoding(): string; + get fatal(): boolean; + get ignoreBOM(): boolean; +} +/** + * The **`TextEncoder`** interface takes a stream of code points as input and emits a stream of UTF-8 bytes. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/TextEncoder) + */ +declare class TextEncoder { + constructor(); + /** + * The **`TextEncoder.encode()`** method takes a string as input, and returns a Global_Objects/Uint8Array containing the text given in parameters encoded with the specific method for that TextEncoder object. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/TextEncoder/encode) + */ + encode(input?: string): Uint8Array; + /** + * The **`TextEncoder.encodeInto()`** method takes a string to encode and a destination Uint8Array to put resulting UTF-8 encoded text into, and returns a dictionary object indicating the progress of the encoding. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/TextEncoder/encodeInto) + */ + encodeInto(input: string, buffer: Uint8Array): TextEncoderEncodeIntoResult; + get encoding(): string; +} +interface TextDecoderConstructorOptions { + fatal: boolean; + ignoreBOM: boolean; +} +interface TextDecoderDecodeOptions { + stream: boolean; +} +interface TextEncoderEncodeIntoResult { + read: number; + written: number; +} +/** + * The **`ErrorEvent`** interface represents events providing information related to errors in scripts or in files. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ErrorEvent) + */ +declare class ErrorEvent extends Event { + constructor(type: string, init?: ErrorEventErrorEventInit); + /** + * The **`filename`** read-only property of the ErrorEvent interface returns a string containing the name of the script file in which the error occurred. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ErrorEvent/filename) + */ + get filename(): string; + /** + * The **`message`** read-only property of the ErrorEvent interface returns a string containing a human-readable error message describing the problem. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ErrorEvent/message) + */ + get message(): string; + /** + * The **`lineno`** read-only property of the ErrorEvent interface returns an integer containing the line number of the script file on which the error occurred. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ErrorEvent/lineno) + */ + get lineno(): number; + /** + * The **`colno`** read-only property of the ErrorEvent interface returns an integer containing the column number of the script file on which the error occurred. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ErrorEvent/colno) + */ + get colno(): number; + /** + * The **`error`** read-only property of the ErrorEvent interface returns a JavaScript value, such as an Error or DOMException, representing the error associated with this event. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ErrorEvent/error) + */ + get error(): any; +} +interface ErrorEventErrorEventInit { + message?: string; + filename?: string; + lineno?: number; + colno?: number; + error?: any; +} +/** + * The **`MessageEvent`** interface represents a message received by a target object. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/MessageEvent) + */ +declare class MessageEvent extends Event { + constructor(type: string, initializer: MessageEventInit); + /** + * The **`data`** read-only property of the The data sent by the message emitter; this can be any data type, depending on what originated this event. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/MessageEvent/data) + */ + readonly data: any; + /** + * The **`origin`** read-only property of the origin of the message emitter. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/MessageEvent/origin) + */ + readonly origin: string | null; + /** + * The **`lastEventId`** read-only property of the unique ID for the event. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/MessageEvent/lastEventId) + */ + readonly lastEventId: string; + /** + * The **`source`** read-only property of the a WindowProxy, MessagePort, or a `MessageEventSource` (which can be a WindowProxy, message emitter. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/MessageEvent/source) + */ + readonly source: MessagePort | null; + /** + * The **`ports`** read-only property of the containing all MessagePort objects sent with the message, in order. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/MessageEvent/ports) + */ + readonly ports: MessagePort[]; +} +interface MessageEventInit { + data: ArrayBuffer | string; +} +/** + * The **`PromiseRejectionEvent`** interface represents events which are sent to the global script context when JavaScript Promises are rejected. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/PromiseRejectionEvent) + */ +declare abstract class PromiseRejectionEvent extends Event { + /** + * The PromiseRejectionEvent interface's **`promise`** read-only property indicates the JavaScript rejected. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/PromiseRejectionEvent/promise) + */ + readonly promise: Promise; + /** + * The PromiseRejectionEvent **`reason`** read-only property is any JavaScript value or Object which provides the reason passed into Promise.reject(). + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/PromiseRejectionEvent/reason) + */ + readonly reason: any; +} +/** + * The **`FormData`** interface provides a way to construct a set of key/value pairs representing form fields and their values, which can be sent using the Window/fetch, XMLHttpRequest.send() or navigator.sendBeacon() methods. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/FormData) + */ +declare class FormData { + constructor(); + /** + * The **`append()`** method of the FormData interface appends a new value onto an existing key inside a `FormData` object, or adds the key if it does not already exist. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/FormData/append) + */ + append(name: string, value: string | Blob): void; + /** + * The **`append()`** method of the FormData interface appends a new value onto an existing key inside a `FormData` object, or adds the key if it does not already exist. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/FormData/append) + */ + append(name: string, value: string): void; + /** + * The **`append()`** method of the FormData interface appends a new value onto an existing key inside a `FormData` object, or adds the key if it does not already exist. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/FormData/append) + */ + append(name: string, value: Blob, filename?: string): void; + /** + * The **`delete()`** method of the FormData interface deletes a key and its value(s) from a `FormData` object. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/FormData/delete) + */ + delete(name: string): void; + /** + * The **`get()`** method of the FormData interface returns the first value associated with a given key from within a `FormData` object. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/FormData/get) + */ + get(name: string): (File | string) | null; + /** + * The **`getAll()`** method of the FormData interface returns all the values associated with a given key from within a `FormData` object. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/FormData/getAll) + */ + getAll(name: string): (File | string)[]; + /** + * The **`has()`** method of the FormData interface returns whether a `FormData` object contains a certain key. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/FormData/has) + */ + has(name: string): boolean; + /** + * The **`set()`** method of the FormData interface sets a new value for an existing key inside a `FormData` object, or adds the key/value if it does not already exist. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/FormData/set) + */ + set(name: string, value: string | Blob): void; + /** + * The **`set()`** method of the FormData interface sets a new value for an existing key inside a `FormData` object, or adds the key/value if it does not already exist. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/FormData/set) + */ + set(name: string, value: string): void; + /** + * The **`set()`** method of the FormData interface sets a new value for an existing key inside a `FormData` object, or adds the key/value if it does not already exist. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/FormData/set) + */ + set(name: string, value: Blob, filename?: string): void; + /* Returns an array of key, value pairs for every entry in the list. */ + entries(): IterableIterator<[ + key: string, + value: File | string + ]>; + /* Returns a list of keys in the list. */ + keys(): IterableIterator; + /* Returns a list of values in the list. */ + values(): IterableIterator<(File | string)>; + forEach(callback: (this: This, value: File | string, key: string, parent: FormData) => void, thisArg?: This): void; + [Symbol.iterator](): IterableIterator<[ + key: string, + value: File | string + ]>; +} +interface ContentOptions { + html?: boolean; +} +declare class HTMLRewriter { + constructor(); + on(selector: string, handlers: HTMLRewriterElementContentHandlers): HTMLRewriter; + onDocument(handlers: HTMLRewriterDocumentContentHandlers): HTMLRewriter; + transform(response: Response): Response; +} +interface HTMLRewriterElementContentHandlers { + element?(element: Element): void | Promise; + comments?(comment: Comment): void | Promise; + text?(element: Text): void | Promise; +} +interface HTMLRewriterDocumentContentHandlers { + doctype?(doctype: Doctype): void | Promise; + comments?(comment: Comment): void | Promise; + text?(text: Text): void | Promise; + end?(end: DocumentEnd): void | Promise; +} +interface Doctype { + readonly name: string | null; + readonly publicId: string | null; + readonly systemId: string | null; +} +interface Element { + tagName: string; + readonly attributes: IterableIterator; + readonly removed: boolean; + readonly namespaceURI: string; + getAttribute(name: string): string | null; + hasAttribute(name: string): boolean; + setAttribute(name: string, value: string): Element; + removeAttribute(name: string): Element; + before(content: string | ReadableStream | Response, options?: ContentOptions): Element; + after(content: string | ReadableStream | Response, options?: ContentOptions): Element; + prepend(content: string | ReadableStream | Response, options?: ContentOptions): Element; + append(content: string | ReadableStream | Response, options?: ContentOptions): Element; + replace(content: string | ReadableStream | Response, options?: ContentOptions): Element; + remove(): Element; + removeAndKeepContent(): Element; + setInnerContent(content: string | ReadableStream | Response, options?: ContentOptions): Element; + onEndTag(handler: (tag: EndTag) => void | Promise): void; +} +interface EndTag { + name: string; + before(content: string | ReadableStream | Response, options?: ContentOptions): EndTag; + after(content: string | ReadableStream | Response, options?: ContentOptions): EndTag; + remove(): EndTag; +} +interface Comment { + text: string; + readonly removed: boolean; + before(content: string, options?: ContentOptions): Comment; + after(content: string, options?: ContentOptions): Comment; + replace(content: string, options?: ContentOptions): Comment; + remove(): Comment; +} +interface Text { + readonly text: string; + readonly lastInTextNode: boolean; + readonly removed: boolean; + before(content: string | ReadableStream | Response, options?: ContentOptions): Text; + after(content: string | ReadableStream | Response, options?: ContentOptions): Text; + replace(content: string | ReadableStream | Response, options?: ContentOptions): Text; + remove(): Text; +} +interface DocumentEnd { + append(content: string, options?: ContentOptions): DocumentEnd; +} +/** + * This is the event type for `fetch` events dispatched on the ServiceWorkerGlobalScope. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/FetchEvent) + */ +declare abstract class FetchEvent extends ExtendableEvent { + /** + * The **`request`** read-only property of the the event handler. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/FetchEvent/request) + */ + readonly request: Request; + /** + * The **`respondWith()`** method of allows you to provide a promise for a Response yourself. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/FetchEvent/respondWith) + */ + respondWith(promise: Response | Promise): void; + passThroughOnException(): void; +} +type HeadersInit = Headers | Iterable> | Record; +/** + * The **`Headers`** interface of the Fetch API allows you to perform various actions on HTTP request and response headers. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Headers) + */ +declare class Headers { + constructor(init?: HeadersInit); + /** + * The **`get()`** method of the Headers interface returns a byte string of all the values of a header within a `Headers` object with a given name. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Headers/get) + */ + get(name: string): string | null; + getAll(name: string): string[]; + /** + * The **`getSetCookie()`** method of the Headers interface returns an array containing the values of all Set-Cookie headers associated with a response. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Headers/getSetCookie) + */ + getSetCookie(): string[]; + /** + * The **`has()`** method of the Headers interface returns a boolean stating whether a `Headers` object contains a certain header. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Headers/has) + */ + has(name: string): boolean; + /** + * The **`set()`** method of the Headers interface sets a new value for an existing header inside a `Headers` object, or adds the header if it does not already exist. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Headers/set) + */ + set(name: string, value: string): void; + /** + * The **`append()`** method of the Headers interface appends a new value onto an existing header inside a `Headers` object, or adds the header if it does not already exist. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Headers/append) + */ + append(name: string, value: string): void; + /** + * The **`delete()`** method of the Headers interface deletes a header from the current `Headers` object. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Headers/delete) + */ + delete(name: string): void; + forEach(callback: (this: This, value: string, key: string, parent: Headers) => void, thisArg?: This): void; + /* Returns an iterator allowing to go through all key/value pairs contained in this object. */ + entries(): IterableIterator<[ + key: string, + value: string + ]>; + /* Returns an iterator allowing to go through all keys of the key/value pairs contained in this object. */ + keys(): IterableIterator; + /* Returns an iterator allowing to go through all values of the key/value pairs contained in this object. */ + values(): IterableIterator; + [Symbol.iterator](): IterableIterator<[ + key: string, + value: string + ]>; +} +type BodyInit = ReadableStream | string | ArrayBuffer | ArrayBufferView | Blob | URLSearchParams | FormData | Iterable | AsyncIterable; +declare abstract class Body { + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/body) */ + get body(): ReadableStream | null; + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/bodyUsed) */ + get bodyUsed(): boolean; + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/arrayBuffer) */ + arrayBuffer(): Promise; + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/bytes) */ + bytes(): Promise; + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/text) */ + text(): Promise; + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/json) */ + json(): Promise; + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/formData) */ + formData(): Promise; + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/blob) */ + blob(): Promise; +} +/** + * The **`Response`** interface of the Fetch API represents the response to a request. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Response) + */ +declare var Response: { + prototype: Response; + new (body?: BodyInit | null, init?: ResponseInit): Response; + error(): Response; + redirect(url: string, status?: number): Response; + json(any: any, maybeInit?: (ResponseInit | Response)): Response; +}; +/** + * The **`Response`** interface of the Fetch API represents the response to a request. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Response) + */ +interface Response extends Body { + /** + * The **`clone()`** method of the Response interface creates a clone of a response object, identical in every way, but stored in a different variable. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Response/clone) + */ + clone(): Response; + /** + * The **`status`** read-only property of the Response interface contains the HTTP status codes of the response. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Response/status) + */ + status: number; + /** + * The **`statusText`** read-only property of the Response interface contains the status message corresponding to the HTTP status code in Response.status. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Response/statusText) + */ + statusText: string; + /** + * The **`headers`** read-only property of the with the response. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Response/headers) + */ + headers: Headers; + /** + * The **`ok`** read-only property of the Response interface contains a Boolean stating whether the response was successful (status in the range 200-299) or not. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Response/ok) + */ + ok: boolean; + /** + * The **`redirected`** read-only property of the Response interface indicates whether or not the response is the result of a request you made which was redirected. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Response/redirected) + */ + redirected: boolean; + /** + * The **`url`** read-only property of the Response interface contains the URL of the response. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Response/url) + */ + url: string; + webSocket: WebSocket | null; + cf: any | undefined; + /** + * The **`type`** read-only property of the Response interface contains the type of the response. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Response/type) + */ + type: "default" | "error"; +} +interface ResponseInit { + status?: number; + statusText?: string; + headers?: HeadersInit; + cf?: any; + webSocket?: (WebSocket | null); + encodeBody?: "automatic" | "manual"; +} +type RequestInfo> = Request | string; +/** + * The **`Request`** interface of the Fetch API represents a resource request. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request) + */ +declare var Request: { + prototype: Request; + new >(input: RequestInfo | URL, init?: RequestInit): Request; +}; +/** + * The **`Request`** interface of the Fetch API represents a resource request. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request) + */ +interface Request> extends Body { + /** + * The **`clone()`** method of the Request interface creates a copy of the current `Request` object. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/clone) + */ + clone(): Request; + /** + * The **`method`** read-only property of the `POST`, etc.) A String indicating the method of the request. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/method) + */ + method: string; + /** + * The **`url`** read-only property of the Request interface contains the URL of the request. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/url) + */ + url: string; + /** + * The **`headers`** read-only property of the with the request. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/headers) + */ + headers: Headers; + /** + * The **`redirect`** read-only property of the Request interface contains the mode for how redirects are handled. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/redirect) + */ + redirect: string; + fetcher: Fetcher | null; + /** + * The read-only **`signal`** property of the Request interface returns the AbortSignal associated with the request. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/signal) + */ + signal: AbortSignal; + cf?: Cf; + /** + * The **`integrity`** read-only property of the Request interface contains the subresource integrity value of the request. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/integrity) + */ + integrity: string; + /** + * The **`keepalive`** read-only property of the Request interface contains the request's `keepalive` setting (`true` or `false`), which indicates whether the browser will keep the associated request alive if the page that initiated it is unloaded before the request is complete. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/keepalive) + */ + keepalive: boolean; + /** + * The **`cache`** read-only property of the Request interface contains the cache mode of the request. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/cache) + */ + cache?: "no-store" | "no-cache"; +} +interface RequestInit { + /* A string to set request's method. */ + method?: string; + /* A Headers object, an object literal, or an array of two-item arrays to set request's headers. */ + headers?: HeadersInit; + /* A BodyInit object or null to set request's body. */ + body?: BodyInit | null; + /* A string indicating whether request follows redirects, results in an error upon encountering a redirect, or returns the redirect (in an opaque fashion). Sets request's redirect. */ + redirect?: string; + fetcher?: (Fetcher | null); + cf?: Cf; + /* A string indicating how the request will interact with the browser's cache to set request's cache. */ + cache?: "no-store" | "no-cache"; + /* A cryptographic hash of the resource to be fetched by request. Sets request's integrity. */ + integrity?: string; + /* An AbortSignal to set request's signal. */ + signal?: (AbortSignal | null); + encodeResponseBody?: "automatic" | "manual"; +} +type Service Rpc.WorkerEntrypointBranded) | Rpc.WorkerEntrypointBranded | ExportedHandler | undefined = undefined> = T extends new (...args: any[]) => Rpc.WorkerEntrypointBranded ? Fetcher> : T extends Rpc.WorkerEntrypointBranded ? Fetcher : T extends Exclude ? never : Fetcher; +type Fetcher = (T extends Rpc.EntrypointBranded ? Rpc.Provider : unknown) & { + fetch(input: RequestInfo | URL, init?: RequestInit): Promise; + connect(address: SocketAddress | string, options?: SocketOptions): Socket; +}; +interface KVNamespaceListKey { + name: Key; + expiration?: number; + metadata?: Metadata; +} +type KVNamespaceListResult = { + list_complete: false; + keys: KVNamespaceListKey[]; + cursor: string; + cacheStatus: string | null; +} | { + list_complete: true; + keys: KVNamespaceListKey[]; + cacheStatus: string | null; +}; +interface KVNamespace { + get(key: Key, options?: Partial>): Promise; + get(key: Key, type: "text"): Promise; + get(key: Key, type: "json"): Promise; + get(key: Key, type: "arrayBuffer"): Promise; + get(key: Key, type: "stream"): Promise; + get(key: Key, options?: KVNamespaceGetOptions<"text">): Promise; + get(key: Key, options?: KVNamespaceGetOptions<"json">): Promise; + get(key: Key, options?: KVNamespaceGetOptions<"arrayBuffer">): Promise; + get(key: Key, options?: KVNamespaceGetOptions<"stream">): Promise; + get(key: Array, type: "text"): Promise>; + get(key: Array, type: "json"): Promise>; + get(key: Array, options?: Partial>): Promise>; + get(key: Array, options?: KVNamespaceGetOptions<"text">): Promise>; + get(key: Array, options?: KVNamespaceGetOptions<"json">): Promise>; + list(options?: KVNamespaceListOptions): Promise>; + put(key: Key, value: string | ArrayBuffer | ArrayBufferView | ReadableStream, options?: KVNamespacePutOptions): Promise; + getWithMetadata(key: Key, options?: Partial>): Promise>; + getWithMetadata(key: Key, type: "text"): Promise>; + getWithMetadata(key: Key, type: "json"): Promise>; + getWithMetadata(key: Key, type: "arrayBuffer"): Promise>; + getWithMetadata(key: Key, type: "stream"): Promise>; + getWithMetadata(key: Key, options: KVNamespaceGetOptions<"text">): Promise>; + getWithMetadata(key: Key, options: KVNamespaceGetOptions<"json">): Promise>; + getWithMetadata(key: Key, options: KVNamespaceGetOptions<"arrayBuffer">): Promise>; + getWithMetadata(key: Key, options: KVNamespaceGetOptions<"stream">): Promise>; + getWithMetadata(key: Array, type: "text"): Promise>>; + getWithMetadata(key: Array, type: "json"): Promise>>; + getWithMetadata(key: Array, options?: Partial>): Promise>>; + getWithMetadata(key: Array, options?: KVNamespaceGetOptions<"text">): Promise>>; + getWithMetadata(key: Array, options?: KVNamespaceGetOptions<"json">): Promise>>; + delete(key: Key): Promise; +} +interface KVNamespaceListOptions { + limit?: number; + prefix?: (string | null); + cursor?: (string | null); +} +interface KVNamespaceGetOptions { + type: Type; + cacheTtl?: number; +} +interface KVNamespacePutOptions { + expiration?: number; + expirationTtl?: number; + metadata?: (any | null); +} +interface KVNamespaceGetWithMetadataResult { + value: Value | null; + metadata: Metadata | null; + cacheStatus: string | null; +} +type QueueContentType = "text" | "bytes" | "json" | "v8"; +interface Queue { + metrics(): Promise; + send(message: Body, options?: QueueSendOptions): Promise; + sendBatch(messages: Iterable>, options?: QueueSendBatchOptions): Promise; +} +interface QueueSendMetrics { + backlogCount: number; + backlogBytes: number; + oldestMessageTimestamp?: Date; +} +interface QueueSendMetadata { + metrics: QueueSendMetrics; +} +interface QueueSendResponse { + metadata: QueueSendMetadata; +} +interface QueueSendBatchMetrics { + backlogCount: number; + backlogBytes: number; + oldestMessageTimestamp?: Date; +} +interface QueueSendBatchMetadata { + metrics: QueueSendBatchMetrics; +} +interface QueueSendBatchResponse { + metadata: QueueSendBatchMetadata; +} +interface QueueSendOptions { + contentType?: QueueContentType; + delaySeconds?: number; +} +interface QueueSendBatchOptions { + delaySeconds?: number; +} +interface MessageSendRequest { + body: Body; + contentType?: QueueContentType; + delaySeconds?: number; +} +interface QueueMetrics { + backlogCount: number; + backlogBytes: number; + oldestMessageTimestamp?: Date; +} +interface MessageBatchMetrics { + backlogCount: number; + backlogBytes: number; + oldestMessageTimestamp?: Date; +} +interface MessageBatchMetadata { + metrics: MessageBatchMetrics; +} +interface QueueRetryOptions { + delaySeconds?: number; +} +interface Message { + readonly id: string; + readonly timestamp: Date; + readonly body: Body; + readonly attempts: number; + retry(options?: QueueRetryOptions): void; + ack(): void; +} +interface QueueEvent extends ExtendableEvent { + readonly messages: readonly Message[]; + readonly queue: string; + readonly metadata: MessageBatchMetadata; + retryAll(options?: QueueRetryOptions): void; + ackAll(): void; +} +interface MessageBatch { + readonly messages: readonly Message[]; + readonly queue: string; + readonly metadata: MessageBatchMetadata; + retryAll(options?: QueueRetryOptions): void; + ackAll(): void; +} +interface R2Error extends Error { + readonly name: string; + readonly code: number; + readonly message: string; + readonly action: string; + readonly stack: any; +} +interface R2ListOptions { + limit?: number; + prefix?: string; + cursor?: string; + delimiter?: string; + startAfter?: string; + include?: ("httpMetadata" | "customMetadata")[]; +} +interface R2Bucket { + head(key: string): Promise; + get(key: string, options: R2GetOptions & { + onlyIf: R2Conditional | Headers; + }): Promise; + get(key: string, options?: R2GetOptions): Promise; + put(key: string, value: ReadableStream | ArrayBuffer | ArrayBufferView | string | null | Blob, options?: R2PutOptions & { + onlyIf: R2Conditional | Headers; + }): Promise; + put(key: string, value: ReadableStream | ArrayBuffer | ArrayBufferView | string | null | Blob, options?: R2PutOptions): Promise; + createMultipartUpload(key: string, options?: R2MultipartOptions): Promise; + resumeMultipartUpload(key: string, uploadId: string): R2MultipartUpload; + delete(keys: string | string[]): Promise; + list(options?: R2ListOptions): Promise; +} +interface R2MultipartUpload { + readonly key: string; + readonly uploadId: string; + uploadPart(partNumber: number, value: ReadableStream | (ArrayBuffer | ArrayBufferView) | string | Blob, options?: R2UploadPartOptions): Promise; + abort(): Promise; + complete(uploadedParts: R2UploadedPart[]): Promise; +} +interface R2UploadedPart { + partNumber: number; + etag: string; +} +declare abstract class R2Object { + readonly key: string; + readonly version: string; + readonly size: number; + readonly etag: string; + readonly httpEtag: string; + readonly checksums: R2Checksums; + readonly uploaded: Date; + readonly httpMetadata?: R2HTTPMetadata; + readonly customMetadata?: Record; + readonly range?: R2Range; + readonly storageClass: string; + readonly ssecKeyMd5?: string; + writeHttpMetadata(headers: Headers): void; +} +interface R2ObjectBody extends R2Object { + get body(): ReadableStream; + get bodyUsed(): boolean; + arrayBuffer(): Promise; + bytes(): Promise; + text(): Promise; + json(): Promise; + blob(): Promise; +} +type R2Range = { + offset: number; + length?: number; +} | { + offset?: number; + length: number; +} | { + suffix: number; +}; +interface R2Conditional { + etagMatches?: string; + etagDoesNotMatch?: string; + uploadedBefore?: Date; + uploadedAfter?: Date; + secondsGranularity?: boolean; +} +interface R2GetOptions { + onlyIf?: (R2Conditional | Headers); + range?: (R2Range | Headers); + ssecKey?: (ArrayBuffer | string); +} +interface R2PutOptions { + onlyIf?: (R2Conditional | Headers); + httpMetadata?: (R2HTTPMetadata | Headers); + customMetadata?: Record; + md5?: ((ArrayBuffer | ArrayBufferView) | string); + sha1?: ((ArrayBuffer | ArrayBufferView) | string); + sha256?: ((ArrayBuffer | ArrayBufferView) | string); + sha384?: ((ArrayBuffer | ArrayBufferView) | string); + sha512?: ((ArrayBuffer | ArrayBufferView) | string); + storageClass?: string; + ssecKey?: (ArrayBuffer | string); +} +interface R2MultipartOptions { + httpMetadata?: (R2HTTPMetadata | Headers); + customMetadata?: Record; + storageClass?: string; + ssecKey?: (ArrayBuffer | string); +} +interface R2Checksums { + readonly md5?: ArrayBuffer; + readonly sha1?: ArrayBuffer; + readonly sha256?: ArrayBuffer; + readonly sha384?: ArrayBuffer; + readonly sha512?: ArrayBuffer; + toJSON(): R2StringChecksums; +} +interface R2StringChecksums { + md5?: string; + sha1?: string; + sha256?: string; + sha384?: string; + sha512?: string; +} +interface R2HTTPMetadata { + contentType?: string; + contentLanguage?: string; + contentDisposition?: string; + contentEncoding?: string; + cacheControl?: string; + cacheExpiry?: Date; +} +type R2Objects = { + objects: R2Object[]; + delimitedPrefixes: string[]; +} & ({ + truncated: true; + cursor: string; +} | { + truncated: false; +}); +interface R2UploadPartOptions { + ssecKey?: (ArrayBuffer | string); +} +declare abstract class ScheduledEvent extends ExtendableEvent { + readonly scheduledTime: number; + readonly cron: string; + noRetry(): void; +} +interface ScheduledController { + readonly scheduledTime: number; + readonly cron: string; + noRetry(): void; +} +interface QueuingStrategy { + highWaterMark?: (number | bigint); + size?: (chunk: T) => number | bigint; +} +interface UnderlyingSink { + type?: string; + start?: (controller: WritableStreamDefaultController) => void | Promise; + write?: (chunk: W, controller: WritableStreamDefaultController) => void | Promise; + abort?: (reason: any) => void | Promise; + close?: () => void | Promise; +} +interface UnderlyingByteSource { + type: "bytes"; + autoAllocateChunkSize?: number; + start?: (controller: ReadableByteStreamController) => void | Promise; + pull?: (controller: ReadableByteStreamController) => void | Promise; + cancel?: (reason: any) => void | Promise; +} +interface UnderlyingSource { + type?: "" | undefined; + start?: (controller: ReadableStreamDefaultController) => void | Promise; + pull?: (controller: ReadableStreamDefaultController) => void | Promise; + cancel?: (reason: any) => void | Promise; + expectedLength?: (number | bigint); +} +interface Transformer { + readableType?: string; + writableType?: string; + start?: (controller: TransformStreamDefaultController) => void | Promise; + transform?: (chunk: I, controller: TransformStreamDefaultController) => void | Promise; + flush?: (controller: TransformStreamDefaultController) => void | Promise; + cancel?: (reason: any) => void | Promise; + expectedLength?: number; +} +interface StreamPipeOptions { + preventAbort?: boolean; + preventCancel?: boolean; + /** + * Pipes this readable stream to a given writable stream destination. The way in which the piping process behaves under various error conditions can be customized with a number of passed options. It returns a promise that fulfills when the piping process completes successfully, or rejects if any errors were encountered. + * + * Piping a stream will lock it for the duration of the pipe, preventing any other consumer from acquiring a reader. + * + * Errors and closures of the source and destination streams propagate as follows: + * + * An error in this source readable stream will abort destination, unless preventAbort is truthy. The returned promise will be rejected with the source's error, or with any error that occurs during aborting the destination. + * + * An error in destination will cancel this source readable stream, unless preventCancel is truthy. The returned promise will be rejected with the destination's error, or with any error that occurs during canceling the source. + * + * When this source readable stream closes, destination will be closed, unless preventClose is truthy. The returned promise will be fulfilled once this process completes, unless an error is encountered while closing the destination, in which case it will be rejected with that error. + * + * If destination starts out closed or closing, this source readable stream will be canceled, unless preventCancel is true. The returned promise will be rejected with an error indicating piping to a closed stream failed, or with any error that occurs during canceling the source. + * + * The signal option can be set to an AbortSignal to allow aborting an ongoing pipe operation via the corresponding AbortController. In this case, this source readable stream will be canceled, and destination aborted, unless the respective options preventCancel or preventAbort are set. + */ + preventClose?: boolean; + signal?: AbortSignal; +} +type ReadableStreamReadResult = { + done: false; + value: R; +} | { + done: true; + value?: undefined; +}; +/** + * The `ReadableStream` interface of the Streams API represents a readable stream of byte data. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStream) + */ +interface ReadableStream { + /** + * The **`locked`** read-only property of the ReadableStream interface returns whether or not the readable stream is locked to a reader. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStream/locked) + */ + get locked(): boolean; + /** + * The **`cancel()`** method of the ReadableStream interface returns a Promise that resolves when the stream is canceled. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStream/cancel) + */ + cancel(reason?: any): Promise; + /** + * The **`getReader()`** method of the ReadableStream interface creates a reader and locks the stream to it. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStream/getReader) + */ + getReader(): ReadableStreamDefaultReader; + /** + * The **`getReader()`** method of the ReadableStream interface creates a reader and locks the stream to it. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStream/getReader) + */ + getReader(options: ReadableStreamGetReaderOptions): ReadableStreamBYOBReader; + /** + * The **`pipeThrough()`** method of the ReadableStream interface provides a chainable way of piping the current stream through a transform stream or any other writable/readable pair. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStream/pipeThrough) + */ + pipeThrough(transform: ReadableWritablePair, options?: StreamPipeOptions): ReadableStream; + /** + * The **`pipeTo()`** method of the ReadableStream interface pipes the current `ReadableStream` to a given WritableStream and returns a Promise that fulfills when the piping process completes successfully, or rejects if any errors were encountered. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStream/pipeTo) + */ + pipeTo(destination: WritableStream, options?: StreamPipeOptions): Promise; + /** + * The **`tee()`** method of the two-element array containing the two resulting branches as new ReadableStream instances. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStream/tee) + */ + tee(): [ + ReadableStream, + ReadableStream + ]; + values(options?: ReadableStreamValuesOptions): AsyncIterableIterator; + [Symbol.asyncIterator](options?: ReadableStreamValuesOptions): AsyncIterableIterator; +} +/** + * The `ReadableStream` interface of the Streams API represents a readable stream of byte data. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStream) + */ +declare const ReadableStream: { + prototype: ReadableStream; + new (underlyingSource: UnderlyingByteSource, strategy?: QueuingStrategy): ReadableStream; + new (underlyingSource?: UnderlyingSource, strategy?: QueuingStrategy): ReadableStream; +}; +/** + * The **`ReadableStreamDefaultReader`** interface of the Streams API represents a default reader that can be used to read stream data supplied from a network (such as a fetch request). + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamDefaultReader) + */ +declare class ReadableStreamDefaultReader { + constructor(stream: ReadableStream); + get closed(): Promise; + cancel(reason?: any): Promise; + /** + * The **`read()`** method of the ReadableStreamDefaultReader interface returns a Promise providing access to the next chunk in the stream's internal queue. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamDefaultReader/read) + */ + read(): Promise>; + /** + * The **`releaseLock()`** method of the ReadableStreamDefaultReader interface releases the reader's lock on the stream. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamDefaultReader/releaseLock) + */ + releaseLock(): void; +} +/** + * The `ReadableStreamBYOBReader` interface of the Streams API defines a reader for a ReadableStream that supports zero-copy reading from an underlying byte source. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamBYOBReader) + */ +declare class ReadableStreamBYOBReader { + constructor(stream: ReadableStream); + get closed(): Promise; + cancel(reason?: any): Promise; + /** + * The **`read()`** method of the ReadableStreamBYOBReader interface is used to read data into a view on a user-supplied buffer from an associated readable byte stream. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamBYOBReader/read) + */ + read(view: T): Promise>; + /** + * The **`releaseLock()`** method of the ReadableStreamBYOBReader interface releases the reader's lock on the stream. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamBYOBReader/releaseLock) + */ + releaseLock(): void; + readAtLeast(minElements: number, view: T): Promise>; +} +interface ReadableStreamBYOBReaderReadableStreamBYOBReaderReadOptions { + min?: number; +} +interface ReadableStreamGetReaderOptions { + /** + * Creates a ReadableStreamBYOBReader and locks the stream to the new reader. + * + * This call behaves the same way as the no-argument variant, except that it only works on readable byte streams, i.e. streams which were constructed specifically with the ability to handle "bring your own buffer" reading. The returned BYOB reader provides the ability to directly read individual chunks from the stream via its read() method, into developer-supplied buffers, allowing more precise control over allocation. + */ + mode: "byob"; +} +/** + * The **`ReadableStreamBYOBRequest`** interface of the Streams API represents a 'pull request' for data from an underlying source that will made as a zero-copy transfer to a consumer (bypassing the stream's internal queues). + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamBYOBRequest) + */ +declare abstract class ReadableStreamBYOBRequest { + /** + * The **`view`** getter property of the ReadableStreamBYOBRequest interface returns the current view. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamBYOBRequest/view) + */ + get view(): Uint8Array | null; + /** + * The **`respond()`** method of the ReadableStreamBYOBRequest interface is used to signal to the associated readable byte stream that the specified number of bytes were written into the ReadableStreamBYOBRequest.view. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamBYOBRequest/respond) + */ + respond(bytesWritten: number): void; + /** + * The **`respondWithNewView()`** method of the ReadableStreamBYOBRequest interface specifies a new view that the consumer of the associated readable byte stream should write to instead of ReadableStreamBYOBRequest.view. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamBYOBRequest/respondWithNewView) + */ + respondWithNewView(view: ArrayBuffer | ArrayBufferView): void; + get atLeast(): number | null; +} +/** + * The **`ReadableStreamDefaultController`** interface of the Streams API represents a controller allowing control of a ReadableStream's state and internal queue. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamDefaultController) + */ +declare abstract class ReadableStreamDefaultController { + /** + * The **`desiredSize`** read-only property of the required to fill the stream's internal queue. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamDefaultController/desiredSize) + */ + get desiredSize(): number | null; + /** + * The **`close()`** method of the ReadableStreamDefaultController interface closes the associated stream. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamDefaultController/close) + */ + close(): void; + /** + * The **`enqueue()`** method of the ```js-nolint enqueue(chunk) ``` - `chunk` - : The chunk to enqueue. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamDefaultController/enqueue) + */ + enqueue(chunk?: R): void; + /** + * The **`error()`** method of the with the associated stream to error. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamDefaultController/error) + */ + error(reason: any): void; +} +/** + * The **`ReadableByteStreamController`** interface of the Streams API represents a controller for a readable byte stream. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableByteStreamController) + */ +declare abstract class ReadableByteStreamController { + /** + * The **`byobRequest`** read-only property of the ReadableByteStreamController interface returns the current BYOB request, or `null` if there are no pending requests. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableByteStreamController/byobRequest) + */ + get byobRequest(): ReadableStreamBYOBRequest | null; + /** + * The **`desiredSize`** read-only property of the ReadableByteStreamController interface returns the number of bytes required to fill the stream's internal queue to its 'desired size'. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableByteStreamController/desiredSize) + */ + get desiredSize(): number | null; + /** + * The **`close()`** method of the ReadableByteStreamController interface closes the associated stream. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableByteStreamController/close) + */ + close(): void; + /** + * The **`enqueue()`** method of the ReadableByteStreamController interface enqueues a given chunk on the associated readable byte stream (the chunk is copied into the stream's internal queues). + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableByteStreamController/enqueue) + */ + enqueue(chunk: ArrayBuffer | ArrayBufferView): void; + /** + * The **`error()`** method of the ReadableByteStreamController interface causes any future interactions with the associated stream to error with the specified reason. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableByteStreamController/error) + */ + error(reason: any): void; +} +/** + * The **`WritableStreamDefaultController`** interface of the Streams API represents a controller allowing control of a WritableStream's state. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStreamDefaultController) + */ +declare abstract class WritableStreamDefaultController { + /** + * The read-only **`signal`** property of the WritableStreamDefaultController interface returns the AbortSignal associated with the controller. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStreamDefaultController/signal) + */ + get signal(): AbortSignal; + /** + * The **`error()`** method of the with the associated stream to error. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStreamDefaultController/error) + */ + error(reason?: any): void; +} +/** + * The **`TransformStreamDefaultController`** interface of the Streams API provides methods to manipulate the associated ReadableStream and WritableStream. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/TransformStreamDefaultController) + */ +declare abstract class TransformStreamDefaultController { + /** + * The **`desiredSize`** read-only property of the TransformStreamDefaultController interface returns the desired size to fill the queue of the associated ReadableStream. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/TransformStreamDefaultController/desiredSize) + */ + get desiredSize(): number | null; + /** + * The **`enqueue()`** method of the TransformStreamDefaultController interface enqueues the given chunk in the readable side of the stream. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/TransformStreamDefaultController/enqueue) + */ + enqueue(chunk?: O): void; + /** + * The **`error()`** method of the TransformStreamDefaultController interface errors both sides of the stream. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/TransformStreamDefaultController/error) + */ + error(reason: any): void; + /** + * The **`terminate()`** method of the TransformStreamDefaultController interface closes the readable side and errors the writable side of the stream. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/TransformStreamDefaultController/terminate) + */ + terminate(): void; +} +interface ReadableWritablePair { + readable: ReadableStream; + /** + * Provides a convenient, chainable way of piping this readable stream through a transform stream (or any other { writable, readable } pair). It simply pipes the stream into the writable side of the supplied pair, and returns the readable side for further use. + * + * Piping a stream will lock it for the duration of the pipe, preventing any other consumer from acquiring a reader. + */ + writable: WritableStream; +} +/** + * The **`WritableStream`** interface of the Streams API provides a standard abstraction for writing streaming data to a destination, known as a sink. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStream) + */ +declare class WritableStream { + constructor(underlyingSink?: UnderlyingSink, queuingStrategy?: QueuingStrategy); + /** + * The **`locked`** read-only property of the WritableStream interface returns a boolean indicating whether the `WritableStream` is locked to a writer. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStream/locked) + */ + get locked(): boolean; + /** + * The **`abort()`** method of the WritableStream interface aborts the stream, signaling that the producer can no longer successfully write to the stream and it is to be immediately moved to an error state, with any queued writes discarded. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStream/abort) + */ + abort(reason?: any): Promise; + /** + * The **`close()`** method of the WritableStream interface closes the associated stream. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStream/close) + */ + close(): Promise; + /** + * The **`getWriter()`** method of the WritableStream interface returns a new instance of WritableStreamDefaultWriter and locks the stream to that instance. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStream/getWriter) + */ + getWriter(): WritableStreamDefaultWriter; +} +/** + * The **`WritableStreamDefaultWriter`** interface of the Streams API is the object returned by WritableStream.getWriter() and once created locks the writer to the `WritableStream` ensuring that no other streams can write to the underlying sink. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStreamDefaultWriter) + */ +declare class WritableStreamDefaultWriter { + constructor(stream: WritableStream); + /** + * The **`closed`** read-only property of the the stream errors or the writer's lock is released. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStreamDefaultWriter/closed) + */ + get closed(): Promise; + /** + * The **`ready`** read-only property of the that resolves when the desired size of the stream's internal queue transitions from non-positive to positive, signaling that it is no longer applying backpressure. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStreamDefaultWriter/ready) + */ + get ready(): Promise; + /** + * The **`desiredSize`** read-only property of the to fill the stream's internal queue. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStreamDefaultWriter/desiredSize) + */ + get desiredSize(): number | null; + /** + * The **`abort()`** method of the the producer can no longer successfully write to the stream and it is to be immediately moved to an error state, with any queued writes discarded. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStreamDefaultWriter/abort) + */ + abort(reason?: any): Promise; + /** + * The **`close()`** method of the stream. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStreamDefaultWriter/close) + */ + close(): Promise; + /** + * The **`write()`** method of the operation. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStreamDefaultWriter/write) + */ + write(chunk?: W): Promise; + /** + * The **`releaseLock()`** method of the corresponding stream. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStreamDefaultWriter/releaseLock) + */ + releaseLock(): void; +} +/** + * The **`TransformStream`** interface of the Streams API represents a concrete implementation of the pipe chain _transform stream_ concept. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/TransformStream) + */ +declare class TransformStream { + constructor(transformer?: Transformer, writableStrategy?: QueuingStrategy, readableStrategy?: QueuingStrategy); + /** + * The **`readable`** read-only property of the TransformStream interface returns the ReadableStream instance controlled by this `TransformStream`. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/TransformStream/readable) + */ + get readable(): ReadableStream; + /** + * The **`writable`** read-only property of the TransformStream interface returns the WritableStream instance controlled by this `TransformStream`. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/TransformStream/writable) + */ + get writable(): WritableStream; +} +declare class FixedLengthStream extends IdentityTransformStream { + constructor(expectedLength: number | bigint, queuingStrategy?: IdentityTransformStreamQueuingStrategy); +} +declare class IdentityTransformStream extends TransformStream { + constructor(queuingStrategy?: IdentityTransformStreamQueuingStrategy); +} +interface IdentityTransformStreamQueuingStrategy { + highWaterMark?: (number | bigint); +} +interface ReadableStreamValuesOptions { + preventCancel?: boolean; +} +/** + * The **`CompressionStream`** interface of the Compression Streams API is an API for compressing a stream of data. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/CompressionStream) + */ +declare class CompressionStream extends TransformStream { + constructor(format: "gzip" | "deflate" | "deflate-raw"); +} +/** + * The **`DecompressionStream`** interface of the Compression Streams API is an API for decompressing a stream of data. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/DecompressionStream) + */ +declare class DecompressionStream extends TransformStream { + constructor(format: "gzip" | "deflate" | "deflate-raw"); +} +/** + * The **`TextEncoderStream`** interface of the Encoding API converts a stream of strings into bytes in the UTF-8 encoding. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/TextEncoderStream) + */ +declare class TextEncoderStream extends TransformStream { + constructor(); + get encoding(): string; +} +/** + * The **`TextDecoderStream`** interface of the Encoding API converts a stream of text in a binary encoding, such as UTF-8 etc., to a stream of strings. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/TextDecoderStream) + */ +declare class TextDecoderStream extends TransformStream { + constructor(label?: string, options?: TextDecoderStreamTextDecoderStreamInit); + get encoding(): string; + get fatal(): boolean; + get ignoreBOM(): boolean; +} +interface TextDecoderStreamTextDecoderStreamInit { + fatal?: boolean; + ignoreBOM?: boolean; +} +/** + * The **`ByteLengthQueuingStrategy`** interface of the Streams API provides a built-in byte length queuing strategy that can be used when constructing streams. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ByteLengthQueuingStrategy) + */ +declare class ByteLengthQueuingStrategy implements QueuingStrategy { + constructor(init: QueuingStrategyInit); + /** + * The read-only **`ByteLengthQueuingStrategy.highWaterMark`** property returns the total number of bytes that can be contained in the internal queue before backpressure is applied. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ByteLengthQueuingStrategy/highWaterMark) + */ + get highWaterMark(): number; + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/ByteLengthQueuingStrategy/size) */ + get size(): (chunk?: any) => number; +} +/** + * The **`CountQueuingStrategy`** interface of the Streams API provides a built-in chunk counting queuing strategy that can be used when constructing streams. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/CountQueuingStrategy) + */ +declare class CountQueuingStrategy implements QueuingStrategy { + constructor(init: QueuingStrategyInit); + /** + * The read-only **`CountQueuingStrategy.highWaterMark`** property returns the total number of chunks that can be contained in the internal queue before backpressure is applied. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/CountQueuingStrategy/highWaterMark) + */ + get highWaterMark(): number; + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/CountQueuingStrategy/size) */ + get size(): (chunk?: any) => number; +} +interface QueuingStrategyInit { + /** + * Creates a new ByteLengthQueuingStrategy with the provided high water mark. + * + * Note that the provided high water mark will not be validated ahead of time. Instead, if it is negative, NaN, or not a number, the resulting ByteLengthQueuingStrategy will cause the corresponding stream constructor to throw. + */ + highWaterMark: number; +} +interface TracePreviewInfo { + id: string; + slug: string; + name: string; +} +interface ScriptVersion { + id?: string; + tag?: string; + message?: string; +} +declare abstract class TailEvent extends ExtendableEvent { + readonly events: TraceItem[]; + readonly traces: TraceItem[]; +} +interface TraceItem { + readonly event: (TraceItemFetchEventInfo | TraceItemJsRpcEventInfo | TraceItemConnectEventInfo | TraceItemScheduledEventInfo | TraceItemAlarmEventInfo | TraceItemQueueEventInfo | TraceItemEmailEventInfo | TraceItemTailEventInfo | TraceItemCustomEventInfo | TraceItemHibernatableWebSocketEventInfo) | null; + readonly eventTimestamp: number | null; + readonly logs: TraceLog[]; + readonly exceptions: TraceException[]; + readonly diagnosticsChannelEvents: TraceDiagnosticChannelEvent[]; + readonly scriptName: string | null; + readonly entrypoint?: string; + readonly scriptVersion?: ScriptVersion; + readonly dispatchNamespace?: string; + readonly scriptTags?: string[]; + readonly tailAttributes?: Record; + readonly preview?: TracePreviewInfo; + readonly durableObjectId?: string; + readonly outcome: string; + readonly executionModel: string; + readonly truncated: boolean; + readonly cpuTime: number; + readonly wallTime: number; +} +interface TraceItemAlarmEventInfo { + readonly scheduledTime: Date; +} +interface TraceItemConnectEventInfo { +} +interface TraceItemCustomEventInfo { +} +interface TraceItemScheduledEventInfo { + readonly scheduledTime: number; + readonly cron: string; +} +interface TraceItemQueueEventInfo { + readonly queue: string; + readonly batchSize: number; +} +interface TraceItemEmailEventInfo { + readonly mailFrom: string; + readonly rcptTo: string; + readonly rawSize: number; +} +interface TraceItemTailEventInfo { + readonly consumedEvents: TraceItemTailEventInfoTailItem[]; +} +interface TraceItemTailEventInfoTailItem { + readonly scriptName: string | null; +} +interface TraceItemFetchEventInfo { + readonly response?: TraceItemFetchEventInfoResponse; + readonly request: TraceItemFetchEventInfoRequest; +} +interface TraceItemFetchEventInfoRequest { + readonly cf?: any; + readonly headers: Record; + readonly method: string; + readonly url: string; + getUnredacted(): TraceItemFetchEventInfoRequest; +} +interface TraceItemFetchEventInfoResponse { + readonly status: number; +} +interface TraceItemJsRpcEventInfo { + readonly rpcMethod: string; +} +interface TraceItemHibernatableWebSocketEventInfo { + readonly getWebSocketEvent: TraceItemHibernatableWebSocketEventInfoMessage | TraceItemHibernatableWebSocketEventInfoClose | TraceItemHibernatableWebSocketEventInfoError; +} +interface TraceItemHibernatableWebSocketEventInfoMessage { + readonly webSocketEventType: string; +} +interface TraceItemHibernatableWebSocketEventInfoClose { + readonly webSocketEventType: string; + readonly code: number; + readonly wasClean: boolean; +} +interface TraceItemHibernatableWebSocketEventInfoError { + readonly webSocketEventType: string; +} +interface TraceLog { + readonly timestamp: number; + readonly level: string; + readonly message: any; +} +interface TraceException { + readonly timestamp: number; + readonly message: string; + readonly name: string; + readonly stack?: string; +} +interface TraceDiagnosticChannelEvent { + readonly timestamp: number; + readonly channel: string; + readonly message: any; +} +interface TraceMetrics { + readonly cpuTime: number; + readonly wallTime: number; +} +interface UnsafeTraceMetrics { + fromTrace(item: TraceItem): TraceMetrics; +} +/** + * The **`URL`** interface is used to parse, construct, normalize, and encode URL. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL) + */ +declare class URL { + constructor(url: string | URL, base?: string | URL); + /** + * The **`origin`** read-only property of the URL interface returns a string containing the Unicode serialization of the origin of the represented URL. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/origin) + */ + get origin(): string; + /** + * The **`href`** property of the URL interface is a string containing the whole URL. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/href) + */ + get href(): string; + /** + * The **`href`** property of the URL interface is a string containing the whole URL. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/href) + */ + set href(value: string); + /** + * The **`protocol`** property of the URL interface is a string containing the protocol or scheme of the URL, including the final `':'`. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/protocol) + */ + get protocol(): string; + /** + * The **`protocol`** property of the URL interface is a string containing the protocol or scheme of the URL, including the final `':'`. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/protocol) + */ + set protocol(value: string); + /** + * The **`username`** property of the URL interface is a string containing the username component of the URL. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/username) + */ + get username(): string; + /** + * The **`username`** property of the URL interface is a string containing the username component of the URL. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/username) + */ + set username(value: string); + /** + * The **`password`** property of the URL interface is a string containing the password component of the URL. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/password) + */ + get password(): string; + /** + * The **`password`** property of the URL interface is a string containing the password component of the URL. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/password) + */ + set password(value: string); + /** + * The **`host`** property of the URL interface is a string containing the host, which is the URL.hostname, and then, if the port of the URL is nonempty, a `':'`, followed by the URL.port of the URL. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/host) + */ + get host(): string; + /** + * The **`host`** property of the URL interface is a string containing the host, which is the URL.hostname, and then, if the port of the URL is nonempty, a `':'`, followed by the URL.port of the URL. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/host) + */ + set host(value: string); + /** + * The **`hostname`** property of the URL interface is a string containing either the domain name or IP address of the URL. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/hostname) + */ + get hostname(): string; + /** + * The **`hostname`** property of the URL interface is a string containing either the domain name or IP address of the URL. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/hostname) + */ + set hostname(value: string); + /** + * The **`port`** property of the URL interface is a string containing the port number of the URL. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/port) + */ + get port(): string; + /** + * The **`port`** property of the URL interface is a string containing the port number of the URL. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/port) + */ + set port(value: string); + /** + * The **`pathname`** property of the URL interface represents a location in a hierarchical structure. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/pathname) + */ + get pathname(): string; + /** + * The **`pathname`** property of the URL interface represents a location in a hierarchical structure. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/pathname) + */ + set pathname(value: string); + /** + * The **`search`** property of the URL interface is a search string, also called a _query string_, that is a string containing a `'?'` followed by the parameters of the URL. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/search) + */ + get search(): string; + /** + * The **`search`** property of the URL interface is a search string, also called a _query string_, that is a string containing a `'?'` followed by the parameters of the URL. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/search) + */ + set search(value: string); + /** + * The **`hash`** property of the URL interface is a string containing a `'#'` followed by the fragment identifier of the URL. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/hash) + */ + get hash(): string; + /** + * The **`hash`** property of the URL interface is a string containing a `'#'` followed by the fragment identifier of the URL. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/hash) + */ + set hash(value: string); + /** + * The **`searchParams`** read-only property of the access to the [MISSING: httpmethod('GET')] decoded query arguments contained in the URL. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/searchParams) + */ + get searchParams(): URLSearchParams; + /** + * The **`toJSON()`** method of the URL interface returns a string containing a serialized version of the URL, although in practice it seems to have the same effect as ```js-nolint toJSON() ``` None. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/toJSON) + */ + toJSON(): string; + /*function toString() { [native code] }*/ + toString(): string; + /** + * The **`URL.canParse()`** static method of the URL interface returns a boolean indicating whether or not an absolute URL, or a relative URL combined with a base URL, are parsable and valid. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/canParse_static) + */ + static canParse(url: string, base?: string): boolean; + /** + * The **`URL.parse()`** static method of the URL interface returns a newly created URL object representing the URL defined by the parameters. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/parse_static) + */ + static parse(url: string, base?: string): URL | null; + /** + * The **`createObjectURL()`** static method of the URL interface creates a string containing a URL representing the object given in the parameter. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/createObjectURL_static) + */ + static createObjectURL(object: File | Blob): string; + /** + * The **`revokeObjectURL()`** static method of the URL interface releases an existing object URL which was previously created by calling Call this method when you've finished using an object URL to let the browser know not to keep the reference to the file any longer. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/revokeObjectURL_static) + */ + static revokeObjectURL(object_url: string): void; +} +/** + * The **`URLSearchParams`** interface defines utility methods to work with the query string of a URL. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URLSearchParams) + */ +declare class URLSearchParams { + constructor(init?: (Iterable> | Record | string)); + /** + * The **`size`** read-only property of the URLSearchParams interface indicates the total number of search parameter entries. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URLSearchParams/size) + */ + get size(): number; + /** + * The **`append()`** method of the URLSearchParams interface appends a specified key/value pair as a new search parameter. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URLSearchParams/append) + */ + append(name: string, value: string): void; + /** + * The **`delete()`** method of the URLSearchParams interface deletes specified parameters and their associated value(s) from the list of all search parameters. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URLSearchParams/delete) + */ + delete(name: string, value?: string): void; + /** + * The **`get()`** method of the URLSearchParams interface returns the first value associated to the given search parameter. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URLSearchParams/get) + */ + get(name: string): string | null; + /** + * The **`getAll()`** method of the URLSearchParams interface returns all the values associated with a given search parameter as an array. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URLSearchParams/getAll) + */ + getAll(name: string): string[]; + /** + * The **`has()`** method of the URLSearchParams interface returns a boolean value that indicates whether the specified parameter is in the search parameters. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URLSearchParams/has) + */ + has(name: string, value?: string): boolean; + /** + * The **`set()`** method of the URLSearchParams interface sets the value associated with a given search parameter to the given value. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URLSearchParams/set) + */ + set(name: string, value: string): void; + /** + * The **`URLSearchParams.sort()`** method sorts all key/value pairs contained in this object in place and returns `undefined`. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URLSearchParams/sort) + */ + sort(): void; + /* Returns an array of key, value pairs for every entry in the search params. */ + entries(): IterableIterator<[ + key: string, + value: string + ]>; + /* Returns a list of keys in the search params. */ + keys(): IterableIterator; + /* Returns a list of values in the search params. */ + values(): IterableIterator; + forEach(callback: (this: This, value: string, key: string, parent: URLSearchParams) => void, thisArg?: This): void; + /*function toString() { [native code] }*/ + toString(): string; + [Symbol.iterator](): IterableIterator<[ + key: string, + value: string + ]>; +} +declare class URLPattern { + constructor(input?: (string | URLPatternInit), baseURL?: (string | URLPatternOptions), patternOptions?: URLPatternOptions); + get protocol(): string; + get username(): string; + get password(): string; + get hostname(): string; + get port(): string; + get pathname(): string; + get search(): string; + get hash(): string; + get hasRegExpGroups(): boolean; + test(input?: (string | URLPatternInit), baseURL?: string): boolean; + exec(input?: (string | URLPatternInit), baseURL?: string): URLPatternResult | null; +} +interface URLPatternInit { + protocol?: string; + username?: string; + password?: string; + hostname?: string; + port?: string; + pathname?: string; + search?: string; + hash?: string; + baseURL?: string; +} +interface URLPatternComponentResult { + input: string; + groups: Record; +} +interface URLPatternResult { + inputs: (string | URLPatternInit)[]; + protocol: URLPatternComponentResult; + username: URLPatternComponentResult; + password: URLPatternComponentResult; + hostname: URLPatternComponentResult; + port: URLPatternComponentResult; + pathname: URLPatternComponentResult; + search: URLPatternComponentResult; + hash: URLPatternComponentResult; +} +interface URLPatternOptions { + ignoreCase?: boolean; +} +/** + * A `CloseEvent` is sent to clients using WebSockets when the connection is closed. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/CloseEvent) + */ +declare class CloseEvent extends Event { + constructor(type: string, initializer?: CloseEventInit); + /** + * The **`code`** read-only property of the CloseEvent interface returns a WebSocket connection close code indicating the reason the connection was closed. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/CloseEvent/code) + */ + readonly code: number; + /** + * The **`reason`** read-only property of the CloseEvent interface returns the WebSocket connection close reason the server gave for closing the connection; that is, a concise human-readable prose explanation for the closure. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/CloseEvent/reason) + */ + readonly reason: string; + /** + * The **`wasClean`** read-only property of the CloseEvent interface returns `true` if the connection closed cleanly. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/CloseEvent/wasClean) + */ + readonly wasClean: boolean; +} +interface CloseEventInit { + code?: number; + reason?: string; + wasClean?: boolean; +} +type WebSocketEventMap = { + close: CloseEvent; + message: MessageEvent; + open: Event; + error: ErrorEvent; +}; +/** + * The `WebSocket` object provides the API for creating and managing a WebSocket connection to a server, as well as for sending and receiving data on the connection. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WebSocket) + */ +declare var WebSocket: { + prototype: WebSocket; + new (url: string, protocols?: (string[] | string)): WebSocket; + readonly READY_STATE_CONNECTING: number; + readonly CONNECTING: number; + readonly READY_STATE_OPEN: number; + readonly OPEN: number; + readonly READY_STATE_CLOSING: number; + readonly CLOSING: number; + readonly READY_STATE_CLOSED: number; + readonly CLOSED: number; +}; +/** + * The `WebSocket` object provides the API for creating and managing a WebSocket connection to a server, as well as for sending and receiving data on the connection. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WebSocket) + */ +interface WebSocket extends EventTarget { + accept(options?: WebSocketAcceptOptions): void; + /** + * The **`WebSocket.send()`** method enqueues the specified data to be transmitted to the server over the WebSocket connection, increasing the value of `bufferedAmount` by the number of bytes needed to contain the data. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WebSocket/send) + */ + send(message: (ArrayBuffer | ArrayBufferView) | string): void; + /** + * The **`WebSocket.close()`** method closes the already `CLOSED`, this method does nothing. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WebSocket/close) + */ + close(code?: number, reason?: string): void; + serializeAttachment(attachment: any): void; + deserializeAttachment(): any | null; + /** + * The **`WebSocket.readyState`** read-only property returns the current state of the WebSocket connection. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WebSocket/readyState) + */ + readyState: number; + /** + * The **`WebSocket.url`** read-only property returns the absolute URL of the WebSocket as resolved by the constructor. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WebSocket/url) + */ + url: string | null; + /** + * The **`WebSocket.protocol`** read-only property returns the name of the sub-protocol the server selected; this will be one of the strings specified in the `protocols` parameter when creating the WebSocket object, or the empty string if no connection is established. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WebSocket/protocol) + */ + protocol: string | null; + /** + * The **`WebSocket.extensions`** read-only property returns the extensions selected by the server. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WebSocket/extensions) + */ + extensions: string | null; + /** + * The **`WebSocket.binaryType`** property controls the type of binary data being received over the WebSocket connection. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WebSocket/binaryType) + */ + binaryType: "blob" | "arraybuffer"; +} +interface WebSocketAcceptOptions { + /** + * When set to `true`, receiving a server-initiated WebSocket Close frame will not + * automatically send a reciprocal Close frame, leaving the connection in a half-open + * state. This is useful for proxying scenarios where you need to coordinate closing + * both sides independently. Defaults to `false` when the + * `no_web_socket_half_open_by_default` compatibility flag is enabled. + */ + allowHalfOpen?: boolean; +} +declare const WebSocketPair: { + new (): { + 0: WebSocket; + 1: WebSocket; + }; +}; +interface SqlStorage { + exec>(query: string, ...bindings: any[]): SqlStorageCursor; + get databaseSize(): number; + Cursor: typeof SqlStorageCursor; + Statement: typeof SqlStorageStatement; +} +declare abstract class SqlStorageStatement { +} +type SqlStorageValue = ArrayBuffer | string | number | null; +declare abstract class SqlStorageCursor> { + next(): { + done?: false; + value: T; + } | { + done: true; + value?: never; + }; + toArray(): T[]; + one(): T; + raw(): IterableIterator; + columnNames: string[]; + get rowsRead(): number; + get rowsWritten(): number; + [Symbol.iterator](): IterableIterator; +} +interface Socket { + get readable(): ReadableStream; + get writable(): WritableStream; + get closed(): Promise; + get opened(): Promise; + get upgraded(): boolean; + get secureTransport(): "on" | "off" | "starttls"; + close(): Promise; + startTls(options?: TlsOptions): Socket; +} +interface SocketOptions { + secureTransport?: string; + allowHalfOpen: boolean; + highWaterMark?: (number | bigint); +} +interface SocketAddress { + hostname: string; + port: number; +} +interface TlsOptions { + expectedServerHostname?: string; +} +interface SocketInfo { + remoteAddress?: string; + localAddress?: string; +} +/** + * The **`EventSource`** interface is web content's interface to server-sent events. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventSource) + */ +declare class EventSource extends EventTarget { + constructor(url: string, init?: EventSourceEventSourceInit); + /** + * The **`close()`** method of the EventSource interface closes the connection, if one is made, and sets the ```js-nolint close() ``` None. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventSource/close) + */ + close(): void; + /** + * The **`url`** read-only property of the URL of the source. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventSource/url) + */ + get url(): string; + /** + * The **`withCredentials`** read-only property of the the `EventSource` object was instantiated with CORS credentials set. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventSource/withCredentials) + */ + get withCredentials(): boolean; + /** + * The **`readyState`** read-only property of the connection. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventSource/readyState) + */ + get readyState(): number; + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventSource/open_event) */ + get onopen(): any | null; + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventSource/open_event) */ + set onopen(value: any | null); + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventSource/message_event) */ + get onmessage(): any | null; + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventSource/message_event) */ + set onmessage(value: any | null); + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventSource/error_event) */ + get onerror(): any | null; + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventSource/error_event) */ + set onerror(value: any | null); + static readonly CONNECTING: number; + static readonly OPEN: number; + static readonly CLOSED: number; + static from(stream: ReadableStream): EventSource; +} +interface EventSourceEventSourceInit { + withCredentials?: boolean; + fetcher?: Fetcher; +} +interface Container { + get running(): boolean; + start(options?: ContainerStartupOptions): void; + monitor(): Promise; + destroy(error?: any): Promise; + signal(signo: number): void; + getTcpPort(port: number): Fetcher; + setInactivityTimeout(durationMs: number | bigint): Promise; + interceptOutboundHttp(addr: string, binding: Fetcher): Promise; + interceptAllOutboundHttp(binding: Fetcher): Promise; + snapshotDirectory(options: ContainerDirectorySnapshotOptions): Promise; + snapshotContainer(options: ContainerSnapshotOptions): Promise; + interceptOutboundHttps(addr: string, binding: Fetcher): Promise; +} +interface ContainerDirectorySnapshot { + id: string; + size: number; + dir: string; + name?: string; +} +interface ContainerDirectorySnapshotOptions { + dir: string; + name?: string; +} +interface ContainerDirectorySnapshotRestoreParams { + snapshot: ContainerDirectorySnapshot; + mountPoint?: string; +} +interface ContainerSnapshot { + id: string; + size: number; + name?: string; +} +interface ContainerSnapshotOptions { + name?: string; +} +interface ContainerStartupOptions { + entrypoint?: string[]; + enableInternet: boolean; + env?: Record; + labels?: Record; + directorySnapshots?: ContainerDirectorySnapshotRestoreParams[]; + containerSnapshot?: ContainerSnapshot; +} +/** + * The **`MessagePort`** interface of the Channel Messaging API represents one of the two ports of a MessageChannel, allowing messages to be sent from one port and listening out for them arriving at the other. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/MessagePort) + */ +declare abstract class MessagePort extends EventTarget { + /** + * The **`postMessage()`** method of the transfers ownership of objects to other browsing contexts. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/MessagePort/postMessage) + */ + postMessage(data?: any, options?: (any[] | MessagePortPostMessageOptions)): void; + /** + * The **`close()`** method of the MessagePort interface disconnects the port, so it is no longer active. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/MessagePort/close) + */ + close(): void; + /** + * The **`start()`** method of the MessagePort interface starts the sending of messages queued on the port. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/MessagePort/start) + */ + start(): void; + get onmessage(): any | null; + set onmessage(value: any | null); +} +/** + * The **`MessageChannel`** interface of the Channel Messaging API allows us to create a new message channel and send data through it via its two MessagePort properties. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/MessageChannel) + */ +declare class MessageChannel { + constructor(); + /** + * The **`port1`** read-only property of the the port attached to the context that originated the channel. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/MessageChannel/port1) + */ + readonly port1: MessagePort; + /** + * The **`port2`** read-only property of the the port attached to the context at the other end of the channel, which the message is initially sent to. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/MessageChannel/port2) + */ + readonly port2: MessagePort; +} +interface MessagePortPostMessageOptions { + transfer?: any[]; +} +type LoopbackForExport Rpc.EntrypointBranded) | ExportedHandler | undefined = undefined> = T extends new (...args: any[]) => Rpc.WorkerEntrypointBranded ? LoopbackServiceStub> : T extends new (...args: any[]) => Rpc.DurableObjectBranded ? LoopbackDurableObjectClass> : T extends ExportedHandler ? LoopbackServiceStub : undefined; +type LoopbackServiceStub = Fetcher & (T extends CloudflareWorkersModule.WorkerEntrypoint ? (opts: { + props?: Props; +}) => Fetcher : (opts: { + props?: any; +}) => Fetcher); +type LoopbackDurableObjectClass = DurableObjectClass & (T extends CloudflareWorkersModule.DurableObject ? (opts: { + props?: Props; +}) => DurableObjectClass : (opts: { + props?: any; +}) => DurableObjectClass); +interface LoopbackDurableObjectNamespace extends DurableObjectNamespace { +} +interface LoopbackColoLocalActorNamespace extends ColoLocalActorNamespace { +} +interface SyncKvStorage { + get(key: string): T | undefined; + list(options?: SyncKvListOptions): Iterable<[ + string, + T + ]>; + put(key: string, value: T): void; + delete(key: string): boolean; +} +interface SyncKvListOptions { + start?: string; + startAfter?: string; + end?: string; + prefix?: string; + reverse?: boolean; + limit?: number; +} +interface WorkerStub { + getEntrypoint(name?: string, options?: WorkerStubEntrypointOptions): Fetcher; + getDurableObjectClass(name?: string, options?: WorkerStubEntrypointOptions): DurableObjectClass; +} +interface WorkerStubEntrypointOptions { + props?: any; + limits?: workerdResourceLimits; +} +interface WorkerLoader { + get(name: string | null, getCode: () => WorkerLoaderWorkerCode | Promise): WorkerStub; + load(code: WorkerLoaderWorkerCode): WorkerStub; +} +interface WorkerLoaderModule { + js?: string; + cjs?: string; + text?: string; + data?: ArrayBuffer; + json?: any; + py?: string; + wasm?: ArrayBuffer; +} +interface WorkerLoaderWorkerCode { + compatibilityDate: string; + compatibilityFlags?: string[]; + allowExperimental?: boolean; + limits?: workerdResourceLimits; + mainModule: string; + modules: Record; + env?: any; + globalOutbound?: (Fetcher | null); + tails?: Fetcher[]; + streamingTails?: Fetcher[]; +} +interface workerdResourceLimits { + cpuMs?: number; + subRequests?: number; +} +/** +* The Workers runtime supports a subset of the Performance API, used to measure timing and performance, +* as well as timing of subrequests and other operations. +* +* [Cloudflare Docs Reference](https://developers.cloudflare.com/workers/runtime-apis/performance/) +*/ +declare abstract class Performance { + /* [Cloudflare Docs Reference](https://developers.cloudflare.com/workers/runtime-apis/performance/#performancetimeorigin) */ + get timeOrigin(): number; + /* [Cloudflare Docs Reference](https://developers.cloudflare.com/workers/runtime-apis/performance/#performancenow) */ + now(): number; + /** + * The **`toJSON()`** method of the Performance interface is a Serialization; it returns a JSON representation of the Performance object. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Performance/toJSON) + */ + toJSON(): object; +} +interface Tracing { + enterSpan(name: string, callback: (span: Span, ...args: A) => T, ...args: A): T; + Span: typeof Span; +} +declare abstract class Span { + get isTraced(): boolean; + setAttribute(key: string, value?: (boolean | number | string)): void; +} +// ============ AI Search Error Interfaces ============ +interface AiSearchInternalError extends Error { +} +interface AiSearchNotFoundError extends Error { +} +// ============ AI Search Common Types ============ +/** A single message in a conversation-style search or chat request. */ +type AiSearchMessage = { + role: 'system' | 'developer' | 'user' | 'assistant' | 'tool'; + content: string | null; +}; +/** + * Common shape for `ai_search_options` used by both single-instance and multi-instance requests. + * Contains retrieval, query rewrite, reranking, and cache sub-options. + */ +type AiSearchOptions = { + retrieval?: { + /** Which retrieval backend to use. Defaults to the instance's configured index_method. */ + retrieval_type?: 'vector' | 'keyword' | 'hybrid'; + /** Fusion method for combining vector + keyword results. */ + fusion_method?: 'max' | 'rrf'; + /** How keyword terms are combined: "and" = all terms must match, "or" = any term matches. */ + keyword_match_mode?: 'and' | 'or'; + /** Minimum similarity score (0-1) for a result to be included. Default 0.4. */ + match_threshold?: number; + /** Maximum number of results to return (1-50). Default 10. */ + max_num_results?: number; + /** Vectorize metadata filters applied to the search. */ + filters?: VectorizeVectorMetadataFilter; + /** Number of surrounding chunks to include for context (0-3). Default 0. */ + context_expansion?: number; + /** If true, return only item metadata without chunk text. */ + metadata_only?: boolean; + /** If true (default), return empty results on retrieval failure instead of throwing. */ + return_on_failure?: boolean; + /** Boost results by metadata field values. Max 3 entries. */ + boost_by?: Array<{ + field: string; + direction?: 'asc' | 'desc' | 'exists' | 'not_exists'; + }>; + [key: string]: unknown; + }; + query_rewrite?: { + enabled?: boolean; + model?: string; + rewrite_prompt?: string; + [key: string]: unknown; + }; + reranking?: { + enabled?: boolean; + model?: string; + /** Match threshold (0-1, default 0.4) */ + match_threshold?: number; + [key: string]: unknown; + }; + cache?: { + enabled?: boolean; + cache_threshold?: 'super_strict_match' | 'close_enough' | 'flexible_friend' | 'anything_goes'; + }; + [key: string]: unknown; +}; +// ============ AI Search Request Types ============ +/** + * Request body for single-instance search. + * Exactly one of `query` or `messages` must be provided. + */ +type AiSearchSearchRequest = { + /** Simple query string. */ + query: string; + messages?: never; + ai_search_options?: AiSearchOptions; +} | { + query?: never; + /** Conversation-style input. At least one user message with non-empty content is required. */ + messages: AiSearchMessage[]; + ai_search_options?: AiSearchOptions; +}; +type AiSearchChatCompletionsRequest = { + messages: AiSearchMessage[]; + model?: string; + stream?: boolean; + ai_search_options?: AiSearchOptions; + [key: string]: unknown; +}; +// ============ AI Search Multi-Instance Types (Namespace-Scoped) ============ +/** `ai_search_options` shape for multi-instance requests — requires `instance_ids`. */ +type AiSearchMultiSearchOptions = AiSearchOptions & { + /** Instance IDs to search across (1-10). */ + instance_ids: string[]; +}; +/** + * Request for searching across multiple instances within a namespace. + * `ai_search_options` is required and must include `instance_ids`. + * Exactly one of `query` or `messages` must be provided. + */ +type AiSearchMultiSearchRequest = { + /** Simple query string. */ + query: string; + messages?: never; + ai_search_options: AiSearchMultiSearchOptions; +} | { + query?: never; + /** Conversation-style input. */ + messages: AiSearchMessage[]; + ai_search_options: AiSearchMultiSearchOptions; +}; +/** A search result chunk tagged with the instance it originated from. */ +type AiSearchMultiSearchChunk = AiSearchSearchResponse['chunks'][number] & { + instance_id: string; +}; +/** Describes a per-instance error during a multi-instance operation. */ +type AiSearchMultiSearchError = { + instance_id: string; + message: string; +}; +/** Response from a multi-instance search, with chunks tagged by instance and optional partial-failure errors. */ +type AiSearchMultiSearchResponse = { + search_query: string; + chunks: AiSearchMultiSearchChunk[]; + errors?: AiSearchMultiSearchError[]; +}; +/** Request for chat completions across multiple instances within a namespace. `ai_search_options` is required and must include `instance_ids`. */ +type AiSearchMultiChatCompletionsRequest = Omit & { + ai_search_options: AiSearchMultiSearchOptions; +}; +/** Response from multi-instance chat completions, with chunks tagged by instance and optional partial-failure errors. */ +type AiSearchMultiChatCompletionsResponse = Omit & { + chunks: AiSearchMultiSearchChunk[]; + errors?: AiSearchMultiSearchError[]; +}; +// ============ AI Search Response Types ============ +type AiSearchSearchResponse = { + search_query: string; + chunks: Array<{ + id: string; + type: string; + /** Match score (0-1) */ + score: number; + text: string; + item: { + timestamp?: number; + key: string; + metadata?: Record; + }; + scoring_details?: { + /** Keyword match score (0-1) */ + keyword_score?: number; + /** Vector similarity score (0-1) */ + vector_score?: number; + /** Keyword rank position */ + keyword_rank?: number; + /** Vector rank position */ + vector_rank?: number; + /** Reranking model score */ + reranking_score?: number; + /** Fusion method used to combine results */ + fusion_method?: 'rrf' | 'max'; + [key: string]: unknown; + }; + }>; +}; +type AiSearchChatCompletionsResponse = { + id?: string; + object?: string; + model?: string; + choices: Array<{ + index?: number; + message: { + role: 'system' | 'developer' | 'user' | 'assistant' | 'tool'; + content: string | null; + [key: string]: unknown; + }; + [key: string]: unknown; + }>; + chunks: AiSearchSearchResponse['chunks']; + [key: string]: unknown; +}; +type AiSearchStatsResponse = { + queued?: number; + running?: number; + completed?: number; + error?: number; + skipped?: number; + outdated?: number; + last_activity?: string; + /** Storage engine statistics. */ + engine?: { + vectorize?: { + vectorsCount: number; + dimensions: number; + }; + r2?: { + payloadSizeBytes: number; + metadataSizeBytes: number; + objectCount: number; + }; + }; +}; +// ============ AI Search Instance Info Types ============ +type AiSearchInstanceInfo = { + id: string; + type?: 'r2' | 'web-crawler' | string; + source?: string; + source_params?: unknown; + paused?: boolean; + status?: string; + namespace?: string; + created_at?: string; + modified_at?: string; + token_id?: string; + ai_gateway_id?: string; + rewrite_query?: boolean; + reranking?: boolean; + embedding_model?: string; + ai_search_model?: string; + rewrite_model?: string; + reranking_model?: string; + /** @deprecated Use index_method instead. */ + hybrid_search_enabled?: boolean; + /** Controls which storage backends are active. */ + index_method?: { + vector?: boolean; + keyword?: boolean; + }; + /** Fusion method for combining vector and keyword results. */ + fusion_method?: 'max' | 'rrf'; + indexing_options?: { + keyword_tokenizer?: 'porter' | 'trigram'; + } | null; + retrieval_options?: { + keyword_match_mode?: 'and' | 'or'; + boost_by?: Array<{ + field: string; + direction?: 'asc' | 'desc' | 'exists' | 'not_exists'; + }>; + } | null; + chunk?: boolean; + chunk_size?: number; + chunk_overlap?: number; + score_threshold?: number; + max_num_results?: number; + cache?: boolean; + cache_threshold?: 'super_strict_match' | 'close_enough' | 'flexible_friend' | 'anything_goes'; + custom_metadata?: Array<{ + field_name: string; + data_type: 'text' | 'number' | 'boolean' | 'datetime'; + }>; + /** Sync interval in seconds. */ + sync_interval?: 3600 | 7200 | 14400 | 21600 | 43200 | 86400; + metadata?: Record; + [key: string]: unknown; +}; +/** Pagination, search, and ordering parameters for listing instances within a namespace. */ +type AiSearchListInstancesParams = { + page?: number; + per_page?: number; + /** Search instances by ID. */ + search?: string; + /** Field to sort by. */ + order_by?: 'created_at'; + /** Sort direction. */ + order_by_direction?: 'asc' | 'desc'; +}; +type AiSearchListResponse = { + result: AiSearchInstanceInfo[]; + result_info?: { + count: number; + page: number; + per_page: number; + total_count: number; + }; +}; +// ============ AI Search Config Types ============ +type AiSearchConfig = { + /** Instance ID (1-32 chars, pattern: ^[a-z0-9_]+(?:-[a-z0-9_]+)*$) */ + id: string; + /** Instance type. Omit to create with built-in storage. */ + type?: 'r2' | 'web-crawler' | string; + /** Source URL (required for web-crawler type). */ + source?: string; + source_params?: unknown; + /** Token ID (UUID format) */ + token_id?: string; + ai_gateway_id?: string; + /** Enable query rewriting (default false) */ + rewrite_query?: boolean; + /** Enable reranking (default false) */ + reranking?: boolean; + embedding_model?: string; + ai_search_model?: string; + rewrite_model?: string; + reranking_model?: string; + /** @deprecated Use index_method instead. */ + hybrid_search_enabled?: boolean; + /** Controls which storage backends are used during indexing. Defaults to vector-only. */ + index_method?: { + vector?: boolean; + keyword?: boolean; + }; + /** Fusion method for combining vector and keyword results. "rrf" = reciprocal rank fusion (default), "max" = maximum score. */ + fusion_method?: 'max' | 'rrf'; + indexing_options?: { + keyword_tokenizer?: 'porter' | 'trigram'; + } | null; + retrieval_options?: { + keyword_match_mode?: 'and' | 'or'; + boost_by?: Array<{ + field: string; + direction?: 'asc' | 'desc' | 'exists' | 'not_exists'; + }>; + } | null; + chunk?: boolean; + chunk_size?: number; + chunk_overlap?: number; + /** Minimum similarity score (0-1) for a result to be included. */ + score_threshold?: number; + max_num_results?: number; + cache?: boolean; + /** Similarity threshold for cache hits. Stricter = fewer cache hits but higher relevance. */ + cache_threshold?: 'super_strict_match' | 'close_enough' | 'flexible_friend' | 'anything_goes'; + custom_metadata?: Array<{ + field_name: string; + data_type: 'text' | 'number' | 'boolean' | 'datetime'; + }>; + namespace?: string; + /** Sync interval in seconds. 3600=1h, 7200=2h, 14400=4h, 21600=6h, 43200=12h, 86400=24h. */ + sync_interval?: 3600 | 7200 | 14400 | 21600 | 43200 | 86400; + metadata?: Record; + [key: string]: unknown; +}; +// ============ AI Search Item Types ============ +type AiSearchItemInfo = { + id: string; + key: string; + status: 'completed' | 'error' | 'skipped' | 'queued' | 'running' | 'outdated'; + next_action?: 'INDEX' | 'DELETE' | null; + error?: string; + checksum?: string; + namespace?: string; + chunks_count?: number | null; + file_size?: number | null; + source_id?: string | null; + last_seen_at?: string; + created_at?: string; + metadata?: Record; + [key: string]: unknown; +}; +type AiSearchItemContentResult = { + body: ReadableStream; + contentType: string; + filename: string; + size: number; +}; +type AiSearchUploadItemOptions = { + metadata?: Record; +}; +type AiSearchListItemsParams = { + page?: number; + per_page?: number; + /** Search items by key name. */ + search?: string; + /** Sort order for results. */ + sort_by?: 'status' | 'modified_at'; + /** Filter items by processing status. */ + status?: 'queued' | 'running' | 'completed' | 'error' | 'skipped' | 'outdated'; + /** Filter items by source (e.g. "builtin" or "web-crawler:https://example.com"). */ + source?: string; + /** JSON-encoded Vectorize filter for metadata filtering. */ + metadata_filter?: string; +}; +type AiSearchListItemsResponse = { + result: AiSearchItemInfo[]; + result_info?: { + count: number; + page: number; + per_page: number; + total_count: number; + }; +}; +// ============ AI Search Item Logs Types ============ +type AiSearchItemLogsParams = { + /** Maximum number of log entries to return (1-100, default 50). */ + limit?: number; + /** Opaque cursor for pagination. Pass the `cursor` value from a previous response. */ + cursor?: string; +}; +type AiSearchItemLog = { + timestamp: string; + action: string; + message: string; + fileKey?: string; + chunkCount?: number; + processingTimeMs?: number; + errorType?: string; +}; +/** Paginated response for item processing logs (cursor-based). */ +type AiSearchItemLogsResponse = { + result: AiSearchItemLog[]; + result_info: { + count: number; + per_page: number; + cursor: string | null; + truncated: boolean; + }; +}; +// ============ AI Search Item Chunks Types ============ +type AiSearchItemChunksParams = { + /** Maximum number of chunks to return (1-100, default 20). */ + limit?: number; + /** Offset into the chunks list (default 0). */ + offset?: number; +}; +/** A single indexed chunk belonging to an item, including its text content and byte range. */ +type AiSearchItemChunk = { + id: string; + text: string; + start_byte: number; + end_byte: number; + item?: { + timestamp?: number; + key: string; + metadata?: Record; + }; +}; +/** Paginated response for item chunks (offset-based). */ +type AiSearchItemChunksResponse = { + result: AiSearchItemChunk[]; + result_info: { + count: number; + total: number; + limit: number; + offset: number; + }; +}; +// ============ AI Search Job Types ============ +type AiSearchJobInfo = { + id: string; + source: 'user' | 'schedule'; + description?: string; + last_seen_at?: string; + started_at?: string; + ended_at?: string; + end_reason?: string; +}; +type AiSearchJobLog = { + id: number; + message: string; + message_type: number; + created_at: number; +}; +type AiSearchCreateJobParams = { + description?: string; +}; +type AiSearchListJobsParams = { + page?: number; + per_page?: number; +}; +type AiSearchListJobsResponse = { + result: AiSearchJobInfo[]; + result_info?: { + count: number; + page: number; + per_page: number; + total_count: number; + }; +}; +type AiSearchJobLogsParams = { + page?: number; + per_page?: number; +}; +type AiSearchJobLogsResponse = { + result: AiSearchJobLog[]; + result_info?: { + count: number; + page: number; + per_page: number; + total_count: number; + }; +}; +// ============ AI Search Sub-Service Classes ============ +/** + * Single item service for an AI Search instance. + * Provides info, download, sync, logs, and chunks operations on a specific item. + */ +declare abstract class AiSearchItem { + /** Get metadata about this item. */ + info(): Promise; + /** + * Download the item's content. + * @returns Object with body stream, content type, filename, and size. + */ + download(): Promise; + /** + * Trigger re-indexing of this item. + * @returns The updated item info. + */ + sync(): Promise; + /** + * Retrieve processing logs for this item (cursor-based pagination). + * @param params Optional pagination parameters (limit, cursor). + * @returns Paginated log entries for this item. + */ + logs(params?: AiSearchItemLogsParams): Promise; + /** + * List indexed chunks for this item (offset-based pagination). + * @param params Optional pagination parameters (limit, offset). + * @returns Paginated chunk entries for this item. + */ + chunks(params?: AiSearchItemChunksParams): Promise; +} +/** + * Items collection service for an AI Search instance. + * Provides list, upload, and access to individual items. + */ +declare abstract class AiSearchItems { + /** List items in this instance. */ + list(params?: AiSearchListItemsParams): Promise; + /** + * Upload a file as an item. Behaves as an upsert: if an item with the same + * filename already exists, it is overwritten and re-indexed. + * @param name Filename for the uploaded item. + * @param content File content as a ReadableStream, Blob, or string. + * @param options Optional metadata to attach to the item. + * @returns The created item info. + */ + upload(name: string, content: ReadableStream | Blob | string, options?: AiSearchUploadItemOptions): Promise; + /** + * Upload a file and poll until processing completes. + * Behaves as an upsert: if an item with the same filename already exists, + * it is overwritten and re-indexed. + * @param name Filename for the uploaded item. + * @param content File content as a ReadableStream, Blob, or string. + * @param options Optional metadata and polling configuration. + * @returns The item info after processing completes (or timeout). + */ + uploadAndPoll(name: string, content: ReadableStream | Blob | string, options?: AiSearchUploadItemOptions & { + /** Polling interval in milliseconds (default 1000). */ + pollIntervalMs?: number; + /** Maximum time to wait in milliseconds (default 30000). */ + timeoutMs?: number; + }): Promise; + /** + * Get an item by ID. + * @param itemId The item identifier. + * @returns Item service for info, download, sync, logs, and chunks operations. + */ + get(itemId: string): AiSearchItem; + /** + * Delete an item from the instance. + * @param itemId The item identifier. + */ + delete(itemId: string): Promise; +} +/** + * Single job service for an AI Search instance. + * Provides info, logs, and cancel operations for a specific job. + */ +declare abstract class AiSearchJob { + /** Get metadata about this job. */ + info(): Promise; + /** Get logs for this job. */ + logs(params?: AiSearchJobLogsParams): Promise; + /** + * Cancel a running job. + * @returns The updated job info. + * @throws AiSearchNotFoundError if the job does not exist. + */ + cancel(): Promise; +} +/** + * Jobs collection service for an AI Search instance. + * Provides list, create, and access to individual jobs. + */ +declare abstract class AiSearchJobs { + /** List jobs for this instance. */ + list(params?: AiSearchListJobsParams): Promise; + /** + * Create a new indexing job. + * @param params Optional job parameters. + * @returns The created job info. + */ + create(params?: AiSearchCreateJobParams): Promise; + /** + * Get a job by ID. + * @param jobId The job identifier. + * @returns Job service for info, logs, and cancel operations. + */ + get(jobId: string): AiSearchJob; +} +// ============ AI Search Binding Classes ============ +/** + * Instance-level AI Search service. + * + * Used as: + * - The return type of `AiSearchNamespace.get(name)` (namespace binding) + * - The type of `env.BLOG_SEARCH` (single instance binding via `ai_search`) + * + * Provides search, chat, update, stats, items, and jobs operations. + * + * @example + * ```ts + * // Via namespace binding + * const instance = env.AI_SEARCH.get("blog"); + * const results = await instance.search({ + * query: "How does caching work?", + * }); + * + * // Via single instance binding + * const results = await env.BLOG_SEARCH.search({ + * messages: [{ role: "user", content: "How does caching work?" }], + * }); + * ``` + */ +declare abstract class AiSearchInstance { + /** + * Search the AI Search instance for relevant chunks. + * @param params Search request with query or messages and optional AI search options. + * @returns Search response with matching chunks and search query. + */ + search(params: AiSearchSearchRequest): Promise; + /** + * Generate chat completions with AI Search context (streaming). + * @param params Chat completions request with stream: true. + * @returns ReadableStream of server-sent events. + */ + chatCompletions(params: AiSearchChatCompletionsRequest & { + stream: true; + }): Promise; + /** + * Generate chat completions with AI Search context. + * @param params Chat completions request. + * @returns Chat completion response with choices and RAG chunks. + */ + chatCompletions(params: AiSearchChatCompletionsRequest): Promise; + /** + * Update the instance configuration. + * @param config Partial configuration to update. + * @returns Updated instance info. + */ + update(config: Partial): Promise; + /** Get metadata about this instance. */ + info(): Promise; + /** + * Get instance statistics (item count, indexing status, etc.). + * @returns Statistics with counts per status, last activity time, and engine details. + */ + stats(): Promise; + /** Items collection — list, upload, and manage items in this instance. */ + get items(): AiSearchItems; + /** Jobs collection — list, create, and inspect indexing jobs. */ + get jobs(): AiSearchJobs; +} +/** + * Namespace-level AI Search service. + * + * Used as the type of `env.AI_SEARCH` (namespace binding via `ai_search_namespaces`). + * Scoped to a single namespace. Provides dynamic instance access, creation, deletion, + * and multi-instance search/chat operations. + * + * @example + * ```ts + * // Access an instance within the namespace + * const blog = env.AI_SEARCH.get("blog"); + * const results = await blog.search({ query: "How does caching work?" }); + * + * // List all instances in the namespace + * const instances = await env.AI_SEARCH.list(); + * + * // Create a new instance with built-in storage + * const tenant = await env.AI_SEARCH.create({ id: "tenant-123" }); + * + * // Upload items into the instance + * await tenant.items.upload("doc.pdf", fileContent); + * + * // Search across multiple instances + * const multi = await env.AI_SEARCH.search({ + * query: "caching", + * ai_search_options: { instance_ids: ["blog", "docs"] }, + * }); + * + * // Delete an instance + * await env.AI_SEARCH.delete("tenant-123"); + * ``` + */ +declare abstract class AiSearchNamespace { + /** + * Get an instance by name within the bound namespace. + * @param name Instance name. + * @returns Instance service for search, chat, update, stats, items, and jobs. + */ + get(name: string): AiSearchInstance; + /** + * List instances in the bound namespace. + * @param params Optional pagination, search, and ordering parameters. + * @returns Array of instance metadata with pagination info. + */ + list(params?: AiSearchListInstancesParams): Promise; + /** + * Create a new instance within the bound namespace. + * @param config Instance configuration. Only `id` is required — omit `type` and `source` to create with built-in storage. + * @returns Instance service for the newly created instance. + * + * @example + * ```ts + * // Create with built-in storage (upload items manually) + * const instance = await env.AI_SEARCH.create({ id: "my-search" }); + * + * // Create with web crawler source + * const instance = await env.AI_SEARCH.create({ + * id: "docs-search", + * type: "web-crawler", + * source: "https://developers.cloudflare.com", + * }); + * ``` + */ + create(config: AiSearchConfig): Promise; + /** + * Delete an instance from the bound namespace. + * @param name Instance name to delete. + */ + delete(name: string): Promise; + /** + * Search across multiple instances within the bound namespace. + * Fans out to the specified instance_ids and merges results. + * @param params Search request with required `ai_search_options.instance_ids`. + * @returns Search response with chunks tagged by instance_id and optional partial-failure errors. + */ + search(params: AiSearchMultiSearchRequest): Promise; + /** + * Generate chat completions across multiple instances within the bound namespace (streaming). + * Fans out to the specified instance_ids, merges context, and generates a response. + * @param params Chat completions request with stream: true and required `ai_search_options.instance_ids`. + * @returns ReadableStream of server-sent events. + */ + chatCompletions(params: AiSearchMultiChatCompletionsRequest & { + stream: true; + }): Promise; + /** + * Generate chat completions across multiple instances within the bound namespace. + * Fans out to the specified instance_ids, merges context, and generates a response. + * @param params Chat completions request with required `ai_search_options.instance_ids`. + * @returns Chat completion response with choices, chunks tagged by instance_id, and optional partial-failure errors. + */ + chatCompletions(params: AiSearchMultiChatCompletionsRequest): Promise; +} +type AiImageClassificationInput = { + image: number[]; +}; +type AiImageClassificationOutput = { + score?: number; + label?: string; +}[]; +declare abstract class BaseAiImageClassification { + inputs: AiImageClassificationInput; + postProcessedOutputs: AiImageClassificationOutput; +} +type AiImageToTextInput = { + image: number[]; + prompt?: string; + max_tokens?: number; + temperature?: number; + top_p?: number; + top_k?: number; + seed?: number; + repetition_penalty?: number; + frequency_penalty?: number; + presence_penalty?: number; + raw?: boolean; + messages?: RoleScopedChatInput[]; +}; +type AiImageToTextOutput = { + description: string; +}; +declare abstract class BaseAiImageToText { + inputs: AiImageToTextInput; + postProcessedOutputs: AiImageToTextOutput; +} +type AiImageTextToTextInput = { + image: string; + prompt?: string; + max_tokens?: number; + temperature?: number; + ignore_eos?: boolean; + top_p?: number; + top_k?: number; + seed?: number; + repetition_penalty?: number; + frequency_penalty?: number; + presence_penalty?: number; + raw?: boolean; + messages?: RoleScopedChatInput[]; +}; +type AiImageTextToTextOutput = { + description: string; +}; +declare abstract class BaseAiImageTextToText { + inputs: AiImageTextToTextInput; + postProcessedOutputs: AiImageTextToTextOutput; +} +type AiMultimodalEmbeddingsInput = { + image: string; + text: string[]; +}; +type AiIMultimodalEmbeddingsOutput = { + data: number[][]; + shape: number[]; +}; +declare abstract class BaseAiMultimodalEmbeddings { + inputs: AiImageTextToTextInput; + postProcessedOutputs: AiImageTextToTextOutput; +} +type AiObjectDetectionInput = { + image: number[]; +}; +type AiObjectDetectionOutput = { + score?: number; + label?: string; +}[]; +declare abstract class BaseAiObjectDetection { + inputs: AiObjectDetectionInput; + postProcessedOutputs: AiObjectDetectionOutput; +} +type AiSentenceSimilarityInput = { + source: string; + sentences: string[]; +}; +type AiSentenceSimilarityOutput = number[]; +declare abstract class BaseAiSentenceSimilarity { + inputs: AiSentenceSimilarityInput; + postProcessedOutputs: AiSentenceSimilarityOutput; +} +type AiAutomaticSpeechRecognitionInput = { + audio: number[]; +}; +type AiAutomaticSpeechRecognitionOutput = { + text?: string; + words?: { + word: string; + start: number; + end: number; + }[]; + vtt?: string; +}; +declare abstract class BaseAiAutomaticSpeechRecognition { + inputs: AiAutomaticSpeechRecognitionInput; + postProcessedOutputs: AiAutomaticSpeechRecognitionOutput; +} +type AiSummarizationInput = { + input_text: string; + max_length?: number; +}; +type AiSummarizationOutput = { + summary: string; +}; +declare abstract class BaseAiSummarization { + inputs: AiSummarizationInput; + postProcessedOutputs: AiSummarizationOutput; +} +type AiTextClassificationInput = { + text: string; +}; +type AiTextClassificationOutput = { + score?: number; + label?: string; +}[]; +declare abstract class BaseAiTextClassification { + inputs: AiTextClassificationInput; + postProcessedOutputs: AiTextClassificationOutput; +} +type AiTextEmbeddingsInput = { + text: string | string[]; +}; +type AiTextEmbeddingsOutput = { + shape: number[]; + data: number[][]; +}; +declare abstract class BaseAiTextEmbeddings { + inputs: AiTextEmbeddingsInput; + postProcessedOutputs: AiTextEmbeddingsOutput; +} +type RoleScopedChatInput = { + role: "user" | "assistant" | "system" | "tool" | (string & NonNullable); + content: string; + name?: string; +}; +type AiTextGenerationToolLegacyInput = { + name: string; + description: string; + parameters?: { + type: "object" | (string & NonNullable); + properties: { + [key: string]: { + type: string; + description?: string; + }; + }; + required: string[]; + }; +}; +type AiTextGenerationToolInput = { + type: "function" | (string & NonNullable); + function: { + name: string; + description: string; + parameters?: { + type: "object" | (string & NonNullable); + properties: { + [key: string]: { + type: string; + description?: string; + }; + }; + required: string[]; + }; + }; +}; +type AiTextGenerationFunctionsInput = { + name: string; + code: string; +}; +type AiTextGenerationResponseFormat = { + type: string; + json_schema?: any; +}; +type AiTextGenerationInput = { + prompt?: string; + raw?: boolean; + stream?: boolean; + max_tokens?: number; + temperature?: number; + top_p?: number; + top_k?: number; + seed?: number; + repetition_penalty?: number; + frequency_penalty?: number; + presence_penalty?: number; + messages?: RoleScopedChatInput[]; + response_format?: AiTextGenerationResponseFormat; + tools?: AiTextGenerationToolInput[] | AiTextGenerationToolLegacyInput[] | (object & NonNullable); + functions?: AiTextGenerationFunctionsInput[]; +}; +type AiTextGenerationToolLegacyOutput = { + name: string; + arguments: unknown; +}; +type AiTextGenerationToolOutput = { + id: string; + type: "function"; + function: { + name: string; + arguments: string; + }; +}; +type UsageTags = { + prompt_tokens: number; + completion_tokens: number; + total_tokens: number; +}; +type AiTextGenerationOutput = { + response?: string; + tool_calls?: AiTextGenerationToolLegacyOutput[] & AiTextGenerationToolOutput[]; + usage?: UsageTags; +}; +declare abstract class BaseAiTextGeneration { + inputs: AiTextGenerationInput; + postProcessedOutputs: AiTextGenerationOutput; +} +type AiTextToSpeechInput = { + prompt: string; + lang?: string; +}; +type AiTextToSpeechOutput = Uint8Array | { + audio: string; +}; +declare abstract class BaseAiTextToSpeech { + inputs: AiTextToSpeechInput; + postProcessedOutputs: AiTextToSpeechOutput; +} +type AiTextToImageInput = { + prompt: string; + negative_prompt?: string; + height?: number; + width?: number; + image?: number[]; + image_b64?: string; + mask?: number[]; + num_steps?: number; + strength?: number; + guidance?: number; + seed?: number; +}; +type AiTextToImageOutput = ReadableStream; +declare abstract class BaseAiTextToImage { + inputs: AiTextToImageInput; + postProcessedOutputs: AiTextToImageOutput; +} +type AiTranslationInput = { + text: string; + target_lang: string; + source_lang?: string; +}; +type AiTranslationOutput = { + translated_text?: string; +}; +declare abstract class BaseAiTranslation { + inputs: AiTranslationInput; + postProcessedOutputs: AiTranslationOutput; +} +/** + * Workers AI support for OpenAI's Chat Completions API + */ +type ChatCompletionContentPartText = { + type: "text"; + text: string; +}; +type ChatCompletionContentPartImage = { + type: "image_url"; + image_url: { + url: string; + detail?: "auto" | "low" | "high"; + }; +}; +type ChatCompletionContentPartInputAudio = { + type: "input_audio"; + input_audio: { + /** Base64 encoded audio data. */ + data: string; + format: "wav" | "mp3"; + }; +}; +type ChatCompletionContentPartFile = { + type: "file"; + file: { + /** Base64 encoded file data. */ + file_data?: string; + /** The ID of an uploaded file. */ + file_id?: string; + filename?: string; + }; +}; +type ChatCompletionContentPartRefusal = { + type: "refusal"; + refusal: string; +}; +type ChatCompletionContentPart = ChatCompletionContentPartText | ChatCompletionContentPartImage | ChatCompletionContentPartInputAudio | ChatCompletionContentPartFile; +type FunctionDefinition = { + name: string; + description?: string; + parameters?: Record; + strict?: boolean | null; +}; +type ChatCompletionFunctionTool = { + type: "function"; + function: FunctionDefinition; +}; +type ChatCompletionCustomToolGrammarFormat = { + type: "grammar"; + grammar: { + definition: string; + syntax: "lark" | "regex"; + }; +}; +type ChatCompletionCustomToolTextFormat = { + type: "text"; +}; +type ChatCompletionCustomToolFormat = ChatCompletionCustomToolTextFormat | ChatCompletionCustomToolGrammarFormat; +type ChatCompletionCustomTool = { + type: "custom"; + custom: { + name: string; + description?: string; + format?: ChatCompletionCustomToolFormat; + }; +}; +type ChatCompletionTool = ChatCompletionFunctionTool | ChatCompletionCustomTool; +type ChatCompletionMessageFunctionToolCall = { + id: string; + type: "function"; + function: { + name: string; + /** JSON-encoded arguments string. */ + arguments: string; + }; +}; +type ChatCompletionMessageCustomToolCall = { + id: string; + type: "custom"; + custom: { + name: string; + input: string; + }; +}; +type ChatCompletionMessageToolCall = ChatCompletionMessageFunctionToolCall | ChatCompletionMessageCustomToolCall; +type ChatCompletionToolChoiceFunction = { + type: "function"; + function: { + name: string; + }; +}; +type ChatCompletionToolChoiceCustom = { + type: "custom"; + custom: { + name: string; + }; +}; +type ChatCompletionToolChoiceAllowedTools = { + type: "allowed_tools"; + allowed_tools: { + mode: "auto" | "required"; + tools: Array>; + }; +}; +type ChatCompletionToolChoiceOption = "none" | "auto" | "required" | ChatCompletionToolChoiceFunction | ChatCompletionToolChoiceCustom | ChatCompletionToolChoiceAllowedTools; +type DeveloperMessage = { + role: "developer"; + content: string | Array<{ + type: "text"; + text: string; + }>; + name?: string; +}; +type SystemMessage = { + role: "system"; + content: string | Array<{ + type: "text"; + text: string; + }>; + name?: string; +}; +/** + * Permissive merged content part used inside UserMessage arrays. + * + * Cabidela has a limitation where anyOf/oneOf with enum-based discrimination + * inside nested array items does not correctly match different branches for + * different array elements, so the schema uses a single merged object. + */ +type UserMessageContentPart = { + type: "text" | "image_url" | "input_audio" | "file"; + text?: string; + image_url?: { + url?: string; + detail?: "auto" | "low" | "high"; + }; + input_audio?: { + data?: string; + format?: "wav" | "mp3"; + }; + file?: { + file_data?: string; + file_id?: string; + filename?: string; + }; +}; +type UserMessage = { + role: "user"; + content: string | Array; + name?: string; +}; +type AssistantMessageContentPart = { + type: "text" | "refusal"; + text?: string; + refusal?: string; +}; +type AssistantMessage = { + role: "assistant"; + content?: string | null | Array; + refusal?: string | null; + name?: string; + audio?: { + id: string; + }; + tool_calls?: Array; + function_call?: { + name: string; + arguments: string; + }; +}; +type ToolMessage = { + role: "tool"; + content: string | Array<{ + type: "text"; + text: string; + }>; + tool_call_id: string; +}; +type FunctionMessage = { + role: "function"; + content: string; + name: string; +}; +type ChatCompletionMessageParam = DeveloperMessage | SystemMessage | UserMessage | AssistantMessage | ToolMessage | FunctionMessage; +type ChatCompletionsResponseFormatText = { + type: "text"; +}; +type ChatCompletionsResponseFormatJSONObject = { + type: "json_object"; +}; +type ResponseFormatJSONSchema = { + type: "json_schema"; + json_schema: { + name: string; + description?: string; + schema?: Record; + strict?: boolean | null; + }; +}; +type ResponseFormat = ChatCompletionsResponseFormatText | ChatCompletionsResponseFormatJSONObject | ResponseFormatJSONSchema; +type ChatCompletionsStreamOptions = { + include_usage?: boolean; + include_obfuscation?: boolean; +}; +type PredictionContent = { + type: "content"; + content: string | Array<{ + type: "text"; + text: string; + }>; +}; +type AudioParams = { + voice: string | { + id: string; + }; + format: "wav" | "aac" | "mp3" | "flac" | "opus" | "pcm16"; +}; +type WebSearchUserLocation = { + type: "approximate"; + approximate: { + city?: string; + country?: string; + region?: string; + timezone?: string; + }; +}; +type WebSearchOptions = { + search_context_size?: "low" | "medium" | "high"; + user_location?: WebSearchUserLocation; +}; +type ChatTemplateKwargs = { + /** Whether to enable reasoning, enabled by default. */ + enable_thinking?: boolean; + /** If false, preserves reasoning context between turns. */ + clear_thinking?: boolean; +}; +/** Shared optional properties used by both Prompt and Messages input branches. */ +type ChatCompletionsCommonOptions = { + model?: string; + audio?: AudioParams; + frequency_penalty?: number | null; + logit_bias?: Record | null; + logprobs?: boolean | null; + top_logprobs?: number | null; + max_tokens?: number | null; + max_completion_tokens?: number | null; + metadata?: Record | null; + modalities?: Array<"text" | "audio"> | null; + n?: number | null; + parallel_tool_calls?: boolean; + prediction?: PredictionContent; + presence_penalty?: number | null; + reasoning_effort?: "low" | "medium" | "high" | null; + chat_template_kwargs?: ChatTemplateKwargs; + response_format?: ResponseFormat; + seed?: number | null; + service_tier?: "auto" | "default" | "flex" | "scale" | "priority" | null; + stop?: string | Array | null; + store?: boolean | null; + stream?: boolean | null; + stream_options?: ChatCompletionsStreamOptions; + temperature?: number | null; + tool_choice?: ChatCompletionToolChoiceOption; + tools?: Array; + top_p?: number | null; + user?: string; + web_search_options?: WebSearchOptions; + function_call?: "none" | "auto" | { + name: string; + }; + functions?: Array; +}; +type PromptTokensDetails = { + cached_tokens?: number; + audio_tokens?: number; +}; +type CompletionTokensDetails = { + reasoning_tokens?: number; + audio_tokens?: number; + accepted_prediction_tokens?: number; + rejected_prediction_tokens?: number; +}; +type CompletionUsage = { + prompt_tokens: number; + completion_tokens: number; + total_tokens: number; + prompt_tokens_details?: PromptTokensDetails; + completion_tokens_details?: CompletionTokensDetails; +}; +type ChatCompletionTopLogprob = { + token: string; + logprob: number; + bytes: Array | null; +}; +type ChatCompletionTokenLogprob = { + token: string; + logprob: number; + bytes: Array | null; + top_logprobs: Array; +}; +type ChatCompletionAudio = { + id: string; + /** Base64 encoded audio bytes. */ + data: string; + expires_at: number; + transcript: string; +}; +type ChatCompletionUrlCitation = { + type: "url_citation"; + url_citation: { + url: string; + title: string; + start_index: number; + end_index: number; + }; +}; +type ChatCompletionResponseMessage = { + role: "assistant"; + content: string | null; + refusal: string | null; + annotations?: Array; + audio?: ChatCompletionAudio; + tool_calls?: Array; + function_call?: { + name: string; + arguments: string; + } | null; +}; +type ChatCompletionLogprobs = { + content: Array | null; + refusal?: Array | null; +}; +type ChatCompletionChoice = { + index: number; + message: ChatCompletionResponseMessage; + finish_reason: "stop" | "length" | "tool_calls" | "content_filter" | "function_call"; + logprobs: ChatCompletionLogprobs | null; +}; +type ChatCompletionsPromptInput = { + prompt: string; +} & ChatCompletionsCommonOptions; +type ChatCompletionsMessagesInput = { + messages: Array; +} & ChatCompletionsCommonOptions; +type ChatCompletionsOutput = { + id: string; + object: string; + created: number; + model: string; + choices: Array; + usage?: CompletionUsage; + system_fingerprint?: string | null; + service_tier?: "auto" | "default" | "flex" | "scale" | "priority" | null; +}; +/** + * Workers AI support for OpenAI's Responses API + * Reference: https://github.com/openai/openai-node/blob/master/src/resources/responses/responses.ts + * + * It's a stripped down version from its source. + * It currently supports basic function calling, json mode and accepts images as input. + * + * It does not include types for WebSearch, CodeInterpreter, FileInputs, MCP, CustomTools. + * We plan to add those incrementally as model + platform capabilities evolve. + */ +type ResponsesInput = { + background?: boolean | null; + conversation?: string | ResponseConversationParam | null; + include?: Array | null; + input?: string | ResponseInput; + instructions?: string | null; + max_output_tokens?: number | null; + parallel_tool_calls?: boolean | null; + previous_response_id?: string | null; + prompt_cache_key?: string; + reasoning?: Reasoning | null; + safety_identifier?: string; + service_tier?: "auto" | "default" | "flex" | "scale" | "priority" | null; + stream?: boolean | null; + stream_options?: StreamOptions | null; + temperature?: number | null; + text?: ResponseTextConfig; + tool_choice?: ToolChoiceOptions | ToolChoiceFunction; + tools?: Array; + top_p?: number | null; + truncation?: "auto" | "disabled" | null; +}; +type ResponsesOutput = { + id?: string; + created_at?: number; + output_text?: string; + error?: ResponseError | null; + incomplete_details?: ResponseIncompleteDetails | null; + instructions?: string | Array | null; + object?: "response"; + output?: Array; + parallel_tool_calls?: boolean; + temperature?: number | null; + tool_choice?: ToolChoiceOptions | ToolChoiceFunction; + tools?: Array; + top_p?: number | null; + max_output_tokens?: number | null; + previous_response_id?: string | null; + prompt?: ResponsePrompt | null; + reasoning?: Reasoning | null; + safety_identifier?: string; + service_tier?: "auto" | "default" | "flex" | "scale" | "priority" | null; + status?: ResponseStatus; + text?: ResponseTextConfig; + truncation?: "auto" | "disabled" | null; + usage?: ResponseUsage; +}; +type EasyInputMessage = { + content: string | ResponseInputMessageContentList; + role: "user" | "assistant" | "system" | "developer"; + type?: "message"; +}; +type ResponsesFunctionTool = { + name: string; + parameters: { + [key: string]: unknown; + } | null; + strict: boolean | null; + type: "function"; + description?: string | null; +}; +type ResponseIncompleteDetails = { + reason?: "max_output_tokens" | "content_filter"; +}; +type ResponsePrompt = { + id: string; + variables?: { + [key: string]: string | ResponseInputText | ResponseInputImage; + } | null; + version?: string | null; +}; +type Reasoning = { + effort?: ReasoningEffort | null; + generate_summary?: "auto" | "concise" | "detailed" | null; + summary?: "auto" | "concise" | "detailed" | null; +}; +type ResponseContent = ResponseInputText | ResponseInputImage | ResponseOutputText | ResponseOutputRefusal | ResponseContentReasoningText; +type ResponseContentReasoningText = { + text: string; + type: "reasoning_text"; +}; +type ResponseConversationParam = { + id: string; +}; +type ResponseCreatedEvent = { + response: Response; + sequence_number: number; + type: "response.created"; +}; +type ResponseCustomToolCallOutput = { + call_id: string; + output: string | Array; + type: "custom_tool_call_output"; + id?: string; +}; +type ResponseError = { + code: "server_error" | "rate_limit_exceeded" | "invalid_prompt" | "vector_store_timeout" | "invalid_image" | "invalid_image_format" | "invalid_base64_image" | "invalid_image_url" | "image_too_large" | "image_too_small" | "image_parse_error" | "image_content_policy_violation" | "invalid_image_mode" | "image_file_too_large" | "unsupported_image_media_type" | "empty_image_file" | "failed_to_download_image" | "image_file_not_found"; + message: string; +}; +type ResponseErrorEvent = { + code: string | null; + message: string; + param: string | null; + sequence_number: number; + type: "error"; +}; +type ResponseFailedEvent = { + response: Response; + sequence_number: number; + type: "response.failed"; +}; +type ResponseFormatText = { + type: "text"; +}; +type ResponseFormatJSONObject = { + type: "json_object"; +}; +type ResponseFormatTextConfig = ResponseFormatText | ResponseFormatTextJSONSchemaConfig | ResponseFormatJSONObject; +type ResponseFormatTextJSONSchemaConfig = { + name: string; + schema: { + [key: string]: unknown; + }; + type: "json_schema"; + description?: string; + strict?: boolean | null; +}; +type ResponseFunctionCallArgumentsDeltaEvent = { + delta: string; + item_id: string; + output_index: number; + sequence_number: number; + type: "response.function_call_arguments.delta"; +}; +type ResponseFunctionCallArgumentsDoneEvent = { + arguments: string; + item_id: string; + name: string; + output_index: number; + sequence_number: number; + type: "response.function_call_arguments.done"; +}; +type ResponseFunctionCallOutputItem = ResponseInputTextContent | ResponseInputImageContent; +type ResponseFunctionCallOutputItemList = Array; +type ResponseFunctionToolCall = { + arguments: string; + call_id: string; + name: string; + type: "function_call"; + id?: string; + status?: "in_progress" | "completed" | "incomplete"; +}; +interface ResponseFunctionToolCallItem extends ResponseFunctionToolCall { + id: string; +} +type ResponseFunctionToolCallOutputItem = { + id: string; + call_id: string; + output: string | Array; + type: "function_call_output"; + status?: "in_progress" | "completed" | "incomplete"; +}; +type ResponseIncludable = "message.input_image.image_url" | "message.output_text.logprobs"; +type ResponseIncompleteEvent = { + response: Response; + sequence_number: number; + type: "response.incomplete"; +}; +type ResponseInput = Array; +type ResponseInputContent = ResponseInputText | ResponseInputImage; +type ResponseInputImage = { + detail: "low" | "high" | "auto"; + type: "input_image"; + /** + * Base64 encoded image + */ + image_url?: string | null; +}; +type ResponseInputImageContent = { + type: "input_image"; + detail?: "low" | "high" | "auto" | null; + /** + * Base64 encoded image + */ + image_url?: string | null; +}; +type ResponseInputItem = EasyInputMessage | ResponseInputItemMessage | ResponseOutputMessage | ResponseFunctionToolCall | ResponseInputItemFunctionCallOutput | ResponseReasoningItem; +type ResponseInputItemFunctionCallOutput = { + call_id: string; + output: string | ResponseFunctionCallOutputItemList; + type: "function_call_output"; + id?: string | null; + status?: "in_progress" | "completed" | "incomplete" | null; +}; +type ResponseInputItemMessage = { + content: ResponseInputMessageContentList; + role: "user" | "system" | "developer"; + status?: "in_progress" | "completed" | "incomplete"; + type?: "message"; +}; +type ResponseInputMessageContentList = Array; +type ResponseInputMessageItem = { + id: string; + content: ResponseInputMessageContentList; + role: "user" | "system" | "developer"; + status?: "in_progress" | "completed" | "incomplete"; + type?: "message"; +}; +type ResponseInputText = { + text: string; + type: "input_text"; +}; +type ResponseInputTextContent = { + text: string; + type: "input_text"; +}; +type ResponseItem = ResponseInputMessageItem | ResponseOutputMessage | ResponseFunctionToolCallItem | ResponseFunctionToolCallOutputItem; +type ResponseOutputItem = ResponseOutputMessage | ResponseFunctionToolCall | ResponseReasoningItem; +type ResponseOutputItemAddedEvent = { + item: ResponseOutputItem; + output_index: number; + sequence_number: number; + type: "response.output_item.added"; +}; +type ResponseOutputItemDoneEvent = { + item: ResponseOutputItem; + output_index: number; + sequence_number: number; + type: "response.output_item.done"; +}; +type ResponseOutputMessage = { + id: string; + content: Array; + role: "assistant"; + status: "in_progress" | "completed" | "incomplete"; + type: "message"; +}; +type ResponseOutputRefusal = { + refusal: string; + type: "refusal"; +}; +type ResponseOutputText = { + text: string; + type: "output_text"; + logprobs?: Array; +}; +type ResponseReasoningItem = { + id: string; + summary: Array; + type: "reasoning"; + content?: Array; + encrypted_content?: string | null; + status?: "in_progress" | "completed" | "incomplete"; +}; +type ResponseReasoningSummaryItem = { + text: string; + type: "summary_text"; +}; +type ResponseReasoningContentItem = { + text: string; + type: "reasoning_text"; +}; +type ResponseReasoningTextDeltaEvent = { + content_index: number; + delta: string; + item_id: string; + output_index: number; + sequence_number: number; + type: "response.reasoning_text.delta"; +}; +type ResponseReasoningTextDoneEvent = { + content_index: number; + item_id: string; + output_index: number; + sequence_number: number; + text: string; + type: "response.reasoning_text.done"; +}; +type ResponseRefusalDeltaEvent = { + content_index: number; + delta: string; + item_id: string; + output_index: number; + sequence_number: number; + type: "response.refusal.delta"; +}; +type ResponseRefusalDoneEvent = { + content_index: number; + item_id: string; + output_index: number; + refusal: string; + sequence_number: number; + type: "response.refusal.done"; +}; +type ResponseStatus = "completed" | "failed" | "in_progress" | "cancelled" | "queued" | "incomplete"; +type ResponseStreamEvent = ResponseCompletedEvent | ResponseCreatedEvent | ResponseErrorEvent | ResponseFunctionCallArgumentsDeltaEvent | ResponseFunctionCallArgumentsDoneEvent | ResponseFailedEvent | ResponseIncompleteEvent | ResponseOutputItemAddedEvent | ResponseOutputItemDoneEvent | ResponseReasoningTextDeltaEvent | ResponseReasoningTextDoneEvent | ResponseRefusalDeltaEvent | ResponseRefusalDoneEvent | ResponseTextDeltaEvent | ResponseTextDoneEvent; +type ResponseCompletedEvent = { + response: Response; + sequence_number: number; + type: "response.completed"; +}; +type ResponseTextConfig = { + format?: ResponseFormatTextConfig; + verbosity?: "low" | "medium" | "high" | null; +}; +type ResponseTextDeltaEvent = { + content_index: number; + delta: string; + item_id: string; + logprobs: Array; + output_index: number; + sequence_number: number; + type: "response.output_text.delta"; +}; +type ResponseTextDoneEvent = { + content_index: number; + item_id: string; + logprobs: Array; + output_index: number; + sequence_number: number; + text: string; + type: "response.output_text.done"; +}; +type Logprob = { + token: string; + logprob: number; + top_logprobs?: Array; +}; +type TopLogprob = { + token?: string; + logprob?: number; +}; +type ResponseUsage = { + input_tokens: number; + output_tokens: number; + total_tokens: number; +}; +type Tool = ResponsesFunctionTool; +type ToolChoiceFunction = { + name: string; + type: "function"; +}; +type ToolChoiceOptions = "none"; +type ReasoningEffort = "minimal" | "low" | "medium" | "high" | null; +type StreamOptions = { + include_obfuscation?: boolean; +}; +/** Marks keys from T that aren't in U as optional never */ +type Without = { + [P in Exclude]?: never; +}; +/** Either T or U, but not both (mutually exclusive) */ +type XOR = (T & Without) | (U & Without); +type Ai_Cf_Baai_Bge_Base_En_V1_5_Input = { + text: string | string[]; + /** + * The pooling method used in the embedding process. `cls` pooling will generate more accurate embeddings on larger inputs - however, embeddings created with cls pooling are not compatible with embeddings generated with mean pooling. The default pooling method is `mean` in order for this to not be a breaking change, but we highly suggest using the new `cls` pooling for better accuracy. + */ + pooling?: "mean" | "cls"; +} | { + /** + * Batch of the embeddings requests to run using async-queue + */ + requests: { + text: string | string[]; + /** + * The pooling method used in the embedding process. `cls` pooling will generate more accurate embeddings on larger inputs - however, embeddings created with cls pooling are not compatible with embeddings generated with mean pooling. The default pooling method is `mean` in order for this to not be a breaking change, but we highly suggest using the new `cls` pooling for better accuracy. + */ + pooling?: "mean" | "cls"; + }[]; +}; +type Ai_Cf_Baai_Bge_Base_En_V1_5_Output = { + shape?: number[]; + /** + * Embeddings of the requested text values + */ + data?: number[][]; + /** + * The pooling method used in the embedding process. + */ + pooling?: "mean" | "cls"; +} | Ai_Cf_Baai_Bge_Base_En_V1_5_AsyncResponse; +interface Ai_Cf_Baai_Bge_Base_En_V1_5_AsyncResponse { + /** + * The async request id that can be used to obtain the results. + */ + request_id?: string; +} +declare abstract class Base_Ai_Cf_Baai_Bge_Base_En_V1_5 { + inputs: Ai_Cf_Baai_Bge_Base_En_V1_5_Input; + postProcessedOutputs: Ai_Cf_Baai_Bge_Base_En_V1_5_Output; +} +type Ai_Cf_Openai_Whisper_Input = string | { + /** + * An array of integers that represent the audio data constrained to 8-bit unsigned integer values + */ + audio: number[]; +}; +interface Ai_Cf_Openai_Whisper_Output { + /** + * The transcription + */ + text: string; + word_count?: number; + words?: { + word?: string; + /** + * The second this word begins in the recording + */ + start?: number; + /** + * The ending second when the word completes + */ + end?: number; + }[]; + vtt?: string; +} +declare abstract class Base_Ai_Cf_Openai_Whisper { + inputs: Ai_Cf_Openai_Whisper_Input; + postProcessedOutputs: Ai_Cf_Openai_Whisper_Output; +} +type Ai_Cf_Meta_M2M100_1_2B_Input = { + /** + * The text to be translated + */ + text: string; + /** + * The language code of the source text (e.g., 'en' for English). Defaults to 'en' if not specified + */ + source_lang?: string; + /** + * The language code to translate the text into (e.g., 'es' for Spanish) + */ + target_lang: string; +} | { + /** + * Batch of the embeddings requests to run using async-queue + */ + requests: { + /** + * The text to be translated + */ + text: string; + /** + * The language code of the source text (e.g., 'en' for English). Defaults to 'en' if not specified + */ + source_lang?: string; + /** + * The language code to translate the text into (e.g., 'es' for Spanish) + */ + target_lang: string; + }[]; +}; +type Ai_Cf_Meta_M2M100_1_2B_Output = { + /** + * The translated text in the target language + */ + translated_text?: string; +} | Ai_Cf_Meta_M2M100_1_2B_AsyncResponse; +interface Ai_Cf_Meta_M2M100_1_2B_AsyncResponse { + /** + * The async request id that can be used to obtain the results. + */ + request_id?: string; +} +declare abstract class Base_Ai_Cf_Meta_M2M100_1_2B { + inputs: Ai_Cf_Meta_M2M100_1_2B_Input; + postProcessedOutputs: Ai_Cf_Meta_M2M100_1_2B_Output; +} +type Ai_Cf_Baai_Bge_Small_En_V1_5_Input = { + text: string | string[]; + /** + * The pooling method used in the embedding process. `cls` pooling will generate more accurate embeddings on larger inputs - however, embeddings created with cls pooling are not compatible with embeddings generated with mean pooling. The default pooling method is `mean` in order for this to not be a breaking change, but we highly suggest using the new `cls` pooling for better accuracy. + */ + pooling?: "mean" | "cls"; +} | { + /** + * Batch of the embeddings requests to run using async-queue + */ + requests: { + text: string | string[]; + /** + * The pooling method used in the embedding process. `cls` pooling will generate more accurate embeddings on larger inputs - however, embeddings created with cls pooling are not compatible with embeddings generated with mean pooling. The default pooling method is `mean` in order for this to not be a breaking change, but we highly suggest using the new `cls` pooling for better accuracy. + */ + pooling?: "mean" | "cls"; + }[]; +}; +type Ai_Cf_Baai_Bge_Small_En_V1_5_Output = { + shape?: number[]; + /** + * Embeddings of the requested text values + */ + data?: number[][]; + /** + * The pooling method used in the embedding process. + */ + pooling?: "mean" | "cls"; +} | Ai_Cf_Baai_Bge_Small_En_V1_5_AsyncResponse; +interface Ai_Cf_Baai_Bge_Small_En_V1_5_AsyncResponse { + /** + * The async request id that can be used to obtain the results. + */ + request_id?: string; +} +declare abstract class Base_Ai_Cf_Baai_Bge_Small_En_V1_5 { + inputs: Ai_Cf_Baai_Bge_Small_En_V1_5_Input; + postProcessedOutputs: Ai_Cf_Baai_Bge_Small_En_V1_5_Output; +} +type Ai_Cf_Baai_Bge_Large_En_V1_5_Input = { + text: string | string[]; + /** + * The pooling method used in the embedding process. `cls` pooling will generate more accurate embeddings on larger inputs - however, embeddings created with cls pooling are not compatible with embeddings generated with mean pooling. The default pooling method is `mean` in order for this to not be a breaking change, but we highly suggest using the new `cls` pooling for better accuracy. + */ + pooling?: "mean" | "cls"; +} | { + /** + * Batch of the embeddings requests to run using async-queue + */ + requests: { + text: string | string[]; + /** + * The pooling method used in the embedding process. `cls` pooling will generate more accurate embeddings on larger inputs - however, embeddings created with cls pooling are not compatible with embeddings generated with mean pooling. The default pooling method is `mean` in order for this to not be a breaking change, but we highly suggest using the new `cls` pooling for better accuracy. + */ + pooling?: "mean" | "cls"; + }[]; +}; +type Ai_Cf_Baai_Bge_Large_En_V1_5_Output = { + shape?: number[]; + /** + * Embeddings of the requested text values + */ + data?: number[][]; + /** + * The pooling method used in the embedding process. + */ + pooling?: "mean" | "cls"; +} | Ai_Cf_Baai_Bge_Large_En_V1_5_AsyncResponse; +interface Ai_Cf_Baai_Bge_Large_En_V1_5_AsyncResponse { + /** + * The async request id that can be used to obtain the results. + */ + request_id?: string; +} +declare abstract class Base_Ai_Cf_Baai_Bge_Large_En_V1_5 { + inputs: Ai_Cf_Baai_Bge_Large_En_V1_5_Input; + postProcessedOutputs: Ai_Cf_Baai_Bge_Large_En_V1_5_Output; +} +type Ai_Cf_Unum_Uform_Gen2_Qwen_500M_Input = string | { + /** + * The input text prompt for the model to generate a response. + */ + prompt?: string; + /** + * If true, a chat template is not applied and you must adhere to the specific model's expected formatting. + */ + raw?: boolean; + /** + * Controls the creativity of the AI's responses by adjusting how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses. + */ + top_p?: number; + /** + * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises. + */ + top_k?: number; + /** + * Random seed for reproducibility of the generation. + */ + seed?: number; + /** + * Penalty for repeated tokens; higher values discourage repetition. + */ + repetition_penalty?: number; + /** + * Decreases the likelihood of the model repeating the same lines verbatim. + */ + frequency_penalty?: number; + /** + * Increases the likelihood of the model introducing new topics. + */ + presence_penalty?: number; + image: number[] | (string & NonNullable); + /** + * The maximum number of tokens to generate in the response. + */ + max_tokens?: number; +}; +interface Ai_Cf_Unum_Uform_Gen2_Qwen_500M_Output { + description?: string; +} +declare abstract class Base_Ai_Cf_Unum_Uform_Gen2_Qwen_500M { + inputs: Ai_Cf_Unum_Uform_Gen2_Qwen_500M_Input; + postProcessedOutputs: Ai_Cf_Unum_Uform_Gen2_Qwen_500M_Output; +} +type Ai_Cf_Openai_Whisper_Tiny_En_Input = string | { + /** + * An array of integers that represent the audio data constrained to 8-bit unsigned integer values + */ + audio: number[]; +}; +interface Ai_Cf_Openai_Whisper_Tiny_En_Output { + /** + * The transcription + */ + text: string; + word_count?: number; + words?: { + word?: string; + /** + * The second this word begins in the recording + */ + start?: number; + /** + * The ending second when the word completes + */ + end?: number; + }[]; + vtt?: string; +} +declare abstract class Base_Ai_Cf_Openai_Whisper_Tiny_En { + inputs: Ai_Cf_Openai_Whisper_Tiny_En_Input; + postProcessedOutputs: Ai_Cf_Openai_Whisper_Tiny_En_Output; +} +interface Ai_Cf_Openai_Whisper_Large_V3_Turbo_Input { + audio: string | { + body?: object; + contentType?: string; + }; + /** + * Supported tasks are 'translate' or 'transcribe'. + */ + task?: string; + /** + * The language of the audio being transcribed or translated. + */ + language?: string; + /** + * Preprocess the audio with a voice activity detection model. + */ + vad_filter?: boolean; + /** + * A text prompt to help provide context to the model on the contents of the audio. + */ + initial_prompt?: string; + /** + * The prefix appended to the beginning of the output of the transcription and can guide the transcription result. + */ + prefix?: string; + /** + * The number of beams to use in beam search decoding. Higher values may improve accuracy at the cost of speed. + */ + beam_size?: number; + /** + * Whether to condition on previous text during transcription. Setting to false may help prevent hallucination loops. + */ + condition_on_previous_text?: boolean; + /** + * Threshold for detecting no-speech segments. Segments with no-speech probability above this value are skipped. + */ + no_speech_threshold?: number; + /** + * Threshold for filtering out segments with high compression ratio, which often indicate repetitive or hallucinated text. + */ + compression_ratio_threshold?: number; + /** + * Threshold for filtering out segments with low average log probability, indicating low confidence. + */ + log_prob_threshold?: number; + /** + * Optional threshold (in seconds) to skip silent periods that may cause hallucinations. + */ + hallucination_silence_threshold?: number; +} +interface Ai_Cf_Openai_Whisper_Large_V3_Turbo_Output { + transcription_info?: { + /** + * The language of the audio being transcribed or translated. + */ + language?: string; + /** + * The confidence level or probability of the detected language being accurate, represented as a decimal between 0 and 1. + */ + language_probability?: number; + /** + * The total duration of the original audio file, in seconds. + */ + duration?: number; + /** + * The duration of the audio after applying Voice Activity Detection (VAD) to remove silent or irrelevant sections, in seconds. + */ + duration_after_vad?: number; + }; + /** + * The complete transcription of the audio. + */ + text: string; + /** + * The total number of words in the transcription. + */ + word_count?: number; + segments?: { + /** + * The starting time of the segment within the audio, in seconds. + */ + start?: number; + /** + * The ending time of the segment within the audio, in seconds. + */ + end?: number; + /** + * The transcription of the segment. + */ + text?: string; + /** + * The temperature used in the decoding process, controlling randomness in predictions. Lower values result in more deterministic outputs. + */ + temperature?: number; + /** + * The average log probability of the predictions for the words in this segment, indicating overall confidence. + */ + avg_logprob?: number; + /** + * The compression ratio of the input to the output, measuring how much the text was compressed during the transcription process. + */ + compression_ratio?: number; + /** + * The probability that the segment contains no speech, represented as a decimal between 0 and 1. + */ + no_speech_prob?: number; + words?: { + /** + * The individual word transcribed from the audio. + */ + word?: string; + /** + * The starting time of the word within the audio, in seconds. + */ + start?: number; + /** + * The ending time of the word within the audio, in seconds. + */ + end?: number; + }[]; + }[]; + /** + * The transcription in WebVTT format, which includes timing and text information for use in subtitles. + */ + vtt?: string; +} +declare abstract class Base_Ai_Cf_Openai_Whisper_Large_V3_Turbo { + inputs: Ai_Cf_Openai_Whisper_Large_V3_Turbo_Input; + postProcessedOutputs: Ai_Cf_Openai_Whisper_Large_V3_Turbo_Output; +} +type Ai_Cf_Baai_Bge_M3_Input = Ai_Cf_Baai_Bge_M3_Input_QueryAnd_Contexts | Ai_Cf_Baai_Bge_M3_Input_Embedding | { + /** + * Batch of the embeddings requests to run using async-queue + */ + requests: (Ai_Cf_Baai_Bge_M3_Input_QueryAnd_Contexts_1 | Ai_Cf_Baai_Bge_M3_Input_Embedding_1)[]; +}; +interface Ai_Cf_Baai_Bge_M3_Input_QueryAnd_Contexts { + /** + * A query you wish to perform against the provided contexts. If no query is provided the model with respond with embeddings for contexts + */ + query?: string; + /** + * List of provided contexts. Note that the index in this array is important, as the response will refer to it. + */ + contexts: { + /** + * One of the provided context content + */ + text?: string; + }[]; + /** + * When provided with too long context should the model error out or truncate the context to fit? + */ + truncate_inputs?: boolean; +} +interface Ai_Cf_Baai_Bge_M3_Input_Embedding { + text: string | string[]; + /** + * When provided with too long context should the model error out or truncate the context to fit? + */ + truncate_inputs?: boolean; +} +interface Ai_Cf_Baai_Bge_M3_Input_QueryAnd_Contexts_1 { + /** + * A query you wish to perform against the provided contexts. If no query is provided the model with respond with embeddings for contexts + */ + query?: string; + /** + * List of provided contexts. Note that the index in this array is important, as the response will refer to it. + */ + contexts: { + /** + * One of the provided context content + */ + text?: string; + }[]; + /** + * When provided with too long context should the model error out or truncate the context to fit? + */ + truncate_inputs?: boolean; +} +interface Ai_Cf_Baai_Bge_M3_Input_Embedding_1 { + text: string | string[]; + /** + * When provided with too long context should the model error out or truncate the context to fit? + */ + truncate_inputs?: boolean; +} +type Ai_Cf_Baai_Bge_M3_Output = Ai_Cf_Baai_Bge_M3_Output_Query | Ai_Cf_Baai_Bge_M3_Output_EmbeddingFor_Contexts | Ai_Cf_Baai_Bge_M3_Output_Embedding | Ai_Cf_Baai_Bge_M3_AsyncResponse; +interface Ai_Cf_Baai_Bge_M3_Output_Query { + response?: { + /** + * Index of the context in the request + */ + id?: number; + /** + * Score of the context under the index. + */ + score?: number; + }[]; +} +interface Ai_Cf_Baai_Bge_M3_Output_EmbeddingFor_Contexts { + response?: number[][]; + shape?: number[]; + /** + * The pooling method used in the embedding process. + */ + pooling?: "mean" | "cls"; +} +interface Ai_Cf_Baai_Bge_M3_Output_Embedding { + shape?: number[]; + /** + * Embeddings of the requested text values + */ + data?: number[][]; + /** + * The pooling method used in the embedding process. + */ + pooling?: "mean" | "cls"; +} +interface Ai_Cf_Baai_Bge_M3_AsyncResponse { + /** + * The async request id that can be used to obtain the results. + */ + request_id?: string; +} +declare abstract class Base_Ai_Cf_Baai_Bge_M3 { + inputs: Ai_Cf_Baai_Bge_M3_Input; + postProcessedOutputs: Ai_Cf_Baai_Bge_M3_Output; +} +interface Ai_Cf_Black_Forest_Labs_Flux_1_Schnell_Input { + /** + * A text description of the image you want to generate. + */ + prompt: string; + /** + * The number of diffusion steps; higher values can improve quality but take longer. + */ + steps?: number; +} +interface Ai_Cf_Black_Forest_Labs_Flux_1_Schnell_Output { + /** + * The generated image in Base64 format. + */ + image?: string; +} +declare abstract class Base_Ai_Cf_Black_Forest_Labs_Flux_1_Schnell { + inputs: Ai_Cf_Black_Forest_Labs_Flux_1_Schnell_Input; + postProcessedOutputs: Ai_Cf_Black_Forest_Labs_Flux_1_Schnell_Output; +} +type Ai_Cf_Meta_Llama_3_2_11B_Vision_Instruct_Input = Ai_Cf_Meta_Llama_3_2_11B_Vision_Instruct_Prompt | Ai_Cf_Meta_Llama_3_2_11B_Vision_Instruct_Messages; +interface Ai_Cf_Meta_Llama_3_2_11B_Vision_Instruct_Prompt { + /** + * The input text prompt for the model to generate a response. + */ + prompt: string; + image?: number[] | (string & NonNullable); + /** + * If true, a chat template is not applied and you must adhere to the specific model's expected formatting. + */ + raw?: boolean; + /** + * If true, the response will be streamed back incrementally using SSE, Server Sent Events. + */ + stream?: boolean; + /** + * The maximum number of tokens to generate in the response. + */ + max_tokens?: number; + /** + * Controls the randomness of the output; higher values produce more random results. + */ + temperature?: number; + /** + * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses. + */ + top_p?: number; + /** + * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises. + */ + top_k?: number; + /** + * Random seed for reproducibility of the generation. + */ + seed?: number; + /** + * Penalty for repeated tokens; higher values discourage repetition. + */ + repetition_penalty?: number; + /** + * Decreases the likelihood of the model repeating the same lines verbatim. + */ + frequency_penalty?: number; + /** + * Increases the likelihood of the model introducing new topics. + */ + presence_penalty?: number; + /** + * Name of the LoRA (Low-Rank Adaptation) model to fine-tune the base model. + */ + lora?: string; +} +interface Ai_Cf_Meta_Llama_3_2_11B_Vision_Instruct_Messages { + /** + * An array of message objects representing the conversation history. + */ + messages: { + /** + * The role of the message sender (e.g., 'user', 'assistant', 'system', 'tool'). + */ + role?: string; + /** + * The tool call id. If you don't know what to put here you can fall back to 000000001 + */ + tool_call_id?: string; + content?: string | { + /** + * Type of the content provided + */ + type?: string; + text?: string; + image_url?: { + /** + * image uri with data (e.g. data:image/jpeg;base64,/9j/...). HTTP URL will not be accepted + */ + url?: string; + }; + }[] | { + /** + * Type of the content provided + */ + type?: string; + text?: string; + image_url?: { + /** + * image uri with data (e.g. data:image/jpeg;base64,/9j/...). HTTP URL will not be accepted + */ + url?: string; + }; + }; + }[]; + image?: number[] | (string & NonNullable); + functions?: { + name: string; + code: string; + }[]; + /** + * A list of tools available for the assistant to use. + */ + tools?: ({ + /** + * The name of the tool. More descriptive the better. + */ + name: string; + /** + * A brief description of what the tool does. + */ + description: string; + /** + * Schema defining the parameters accepted by the tool. + */ + parameters: { + /** + * The type of the parameters object (usually 'object'). + */ + type: string; + /** + * List of required parameter names. + */ + required?: string[]; + /** + * Definitions of each parameter. + */ + properties: { + [k: string]: { + /** + * The data type of the parameter. + */ + type: string; + /** + * A description of the expected parameter. + */ + description: string; + }; + }; + }; + } | { + /** + * Specifies the type of tool (e.g., 'function'). + */ + type: string; + /** + * Details of the function tool. + */ + function: { + /** + * The name of the function. + */ + name: string; + /** + * A brief description of what the function does. + */ + description: string; + /** + * Schema defining the parameters accepted by the function. + */ + parameters: { + /** + * The type of the parameters object (usually 'object'). + */ + type: string; + /** + * List of required parameter names. + */ + required?: string[]; + /** + * Definitions of each parameter. + */ + properties: { + [k: string]: { + /** + * The data type of the parameter. + */ + type: string; + /** + * A description of the expected parameter. + */ + description: string; + }; + }; + }; + }; + })[]; + /** + * If true, the response will be streamed back incrementally. + */ + stream?: boolean; + /** + * The maximum number of tokens to generate in the response. + */ + max_tokens?: number; + /** + * Controls the randomness of the output; higher values produce more random results. + */ + temperature?: number; + /** + * Controls the creativity of the AI's responses by adjusting how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses. + */ + top_p?: number; + /** + * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises. + */ + top_k?: number; + /** + * Random seed for reproducibility of the generation. + */ + seed?: number; + /** + * Penalty for repeated tokens; higher values discourage repetition. + */ + repetition_penalty?: number; + /** + * Decreases the likelihood of the model repeating the same lines verbatim. + */ + frequency_penalty?: number; + /** + * Increases the likelihood of the model introducing new topics. + */ + presence_penalty?: number; +} +type Ai_Cf_Meta_Llama_3_2_11B_Vision_Instruct_Output = { + /** + * The generated text response from the model + */ + response?: string; + /** + * An array of tool calls requests made during the response generation + */ + tool_calls?: { + /** + * The arguments passed to be passed to the tool call request + */ + arguments?: object; + /** + * The name of the tool to be called + */ + name?: string; + }[]; +}; +declare abstract class Base_Ai_Cf_Meta_Llama_3_2_11B_Vision_Instruct { + inputs: Ai_Cf_Meta_Llama_3_2_11B_Vision_Instruct_Input; + postProcessedOutputs: Ai_Cf_Meta_Llama_3_2_11B_Vision_Instruct_Output; +} +type Ai_Cf_Meta_Llama_3_3_70B_Instruct_Fp8_Fast_Input = Ai_Cf_Meta_Llama_3_3_70B_Instruct_Fp8_Fast_Prompt | Ai_Cf_Meta_Llama_3_3_70B_Instruct_Fp8_Fast_Messages | Ai_Cf_Meta_Llama_3_3_70B_Instruct_Fp8_Fast_Async_Batch; +interface Ai_Cf_Meta_Llama_3_3_70B_Instruct_Fp8_Fast_Prompt { + /** + * The input text prompt for the model to generate a response. + */ + prompt: string; + /** + * Name of the LoRA (Low-Rank Adaptation) model to fine-tune the base model. + */ + lora?: string; + response_format?: Ai_Cf_Meta_Llama_3_3_70B_Instruct_Fp8_Fast_JSON_Mode; + /** + * If true, a chat template is not applied and you must adhere to the specific model's expected formatting. + */ + raw?: boolean; + /** + * If true, the response will be streamed back incrementally using SSE, Server Sent Events. + */ + stream?: boolean; + /** + * The maximum number of tokens to generate in the response. + */ + max_tokens?: number; + /** + * Controls the randomness of the output; higher values produce more random results. + */ + temperature?: number; + /** + * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses. + */ + top_p?: number; + /** + * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises. + */ + top_k?: number; + /** + * Random seed for reproducibility of the generation. + */ + seed?: number; + /** + * Penalty for repeated tokens; higher values discourage repetition. + */ + repetition_penalty?: number; + /** + * Decreases the likelihood of the model repeating the same lines verbatim. + */ + frequency_penalty?: number; + /** + * Increases the likelihood of the model introducing new topics. + */ + presence_penalty?: number; +} +interface Ai_Cf_Meta_Llama_3_3_70B_Instruct_Fp8_Fast_JSON_Mode { + type?: "json_object" | "json_schema"; + json_schema?: unknown; +} +interface Ai_Cf_Meta_Llama_3_3_70B_Instruct_Fp8_Fast_Messages { + /** + * An array of message objects representing the conversation history. + */ + messages: { + /** + * The role of the message sender (e.g., 'user', 'assistant', 'system', 'tool'). + */ + role: string; + content: string | { + /** + * Type of the content (text) + */ + type?: string; + /** + * Text content + */ + text?: string; + }[]; + }[]; + functions?: { + name: string; + code: string; + }[]; + /** + * A list of tools available for the assistant to use. + */ + tools?: ({ + /** + * The name of the tool. More descriptive the better. + */ + name: string; + /** + * A brief description of what the tool does. + */ + description: string; + /** + * Schema defining the parameters accepted by the tool. + */ + parameters: { + /** + * The type of the parameters object (usually 'object'). + */ + type: string; + /** + * List of required parameter names. + */ + required?: string[]; + /** + * Definitions of each parameter. + */ + properties: { + [k: string]: { + /** + * The data type of the parameter. + */ + type: string; + /** + * A description of the expected parameter. + */ + description: string; + }; + }; + }; + } | { + /** + * Specifies the type of tool (e.g., 'function'). + */ + type: string; + /** + * Details of the function tool. + */ + function: { + /** + * The name of the function. + */ + name: string; + /** + * A brief description of what the function does. + */ + description: string; + /** + * Schema defining the parameters accepted by the function. + */ + parameters: { + /** + * The type of the parameters object (usually 'object'). + */ + type: string; + /** + * List of required parameter names. + */ + required?: string[]; + /** + * Definitions of each parameter. + */ + properties: { + [k: string]: { + /** + * The data type of the parameter. + */ + type: string; + /** + * A description of the expected parameter. + */ + description: string; + }; + }; + }; + }; + })[]; + response_format?: Ai_Cf_Meta_Llama_3_3_70B_Instruct_Fp8_Fast_JSON_Mode_1; + /** + * If true, a chat template is not applied and you must adhere to the specific model's expected formatting. + */ + raw?: boolean; + /** + * If true, the response will be streamed back incrementally using SSE, Server Sent Events. + */ + stream?: boolean; + /** + * The maximum number of tokens to generate in the response. + */ + max_tokens?: number; + /** + * Controls the randomness of the output; higher values produce more random results. + */ + temperature?: number; + /** + * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses. + */ + top_p?: number; + /** + * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises. + */ + top_k?: number; + /** + * Random seed for reproducibility of the generation. + */ + seed?: number; + /** + * Penalty for repeated tokens; higher values discourage repetition. + */ + repetition_penalty?: number; + /** + * Decreases the likelihood of the model repeating the same lines verbatim. + */ + frequency_penalty?: number; + /** + * Increases the likelihood of the model introducing new topics. + */ + presence_penalty?: number; +} +interface Ai_Cf_Meta_Llama_3_3_70B_Instruct_Fp8_Fast_JSON_Mode_1 { + type?: "json_object" | "json_schema"; + json_schema?: unknown; +} +interface Ai_Cf_Meta_Llama_3_3_70B_Instruct_Fp8_Fast_Async_Batch { + requests?: { + /** + * User-supplied reference. This field will be present in the response as well it can be used to reference the request and response. It's NOT validated to be unique. + */ + external_reference?: string; + /** + * Prompt for the text generation model + */ + prompt?: string; + /** + * If true, the response will be streamed back incrementally using SSE, Server Sent Events. + */ + stream?: boolean; + /** + * The maximum number of tokens to generate in the response. + */ + max_tokens?: number; + /** + * Controls the randomness of the output; higher values produce more random results. + */ + temperature?: number; + /** + * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses. + */ + top_p?: number; + /** + * Random seed for reproducibility of the generation. + */ + seed?: number; + /** + * Penalty for repeated tokens; higher values discourage repetition. + */ + repetition_penalty?: number; + /** + * Decreases the likelihood of the model repeating the same lines verbatim. + */ + frequency_penalty?: number; + /** + * Increases the likelihood of the model introducing new topics. + */ + presence_penalty?: number; + response_format?: Ai_Cf_Meta_Llama_3_3_70B_Instruct_Fp8_Fast_JSON_Mode_2; + }[]; +} +interface Ai_Cf_Meta_Llama_3_3_70B_Instruct_Fp8_Fast_JSON_Mode_2 { + type?: "json_object" | "json_schema"; + json_schema?: unknown; +} +type Ai_Cf_Meta_Llama_3_3_70B_Instruct_Fp8_Fast_Output = { + /** + * The generated text response from the model + */ + response: string; + /** + * Usage statistics for the inference request + */ + usage?: { + /** + * Total number of tokens in input + */ + prompt_tokens?: number; + /** + * Total number of tokens in output + */ + completion_tokens?: number; + /** + * Total number of input and output tokens + */ + total_tokens?: number; + }; + /** + * An array of tool calls requests made during the response generation + */ + tool_calls?: { + /** + * The arguments passed to be passed to the tool call request + */ + arguments?: object; + /** + * The name of the tool to be called + */ + name?: string; + }[]; +} | string | Ai_Cf_Meta_Llama_3_3_70B_Instruct_Fp8_Fast_AsyncResponse; +interface Ai_Cf_Meta_Llama_3_3_70B_Instruct_Fp8_Fast_AsyncResponse { + /** + * The async request id that can be used to obtain the results. + */ + request_id?: string; +} +declare abstract class Base_Ai_Cf_Meta_Llama_3_3_70B_Instruct_Fp8_Fast { + inputs: Ai_Cf_Meta_Llama_3_3_70B_Instruct_Fp8_Fast_Input; + postProcessedOutputs: Ai_Cf_Meta_Llama_3_3_70B_Instruct_Fp8_Fast_Output; +} +interface Ai_Cf_Meta_Llama_Guard_3_8B_Input { + /** + * An array of message objects representing the conversation history. + */ + messages: { + /** + * The role of the message sender must alternate between 'user' and 'assistant'. + */ + role: "user" | "assistant"; + /** + * The content of the message as a string. + */ + content: string; + }[]; + /** + * The maximum number of tokens to generate in the response. + */ + max_tokens?: number; + /** + * Controls the randomness of the output; higher values produce more random results. + */ + temperature?: number; + /** + * Dictate the output format of the generated response. + */ + response_format?: { + /** + * Set to json_object to process and output generated text as JSON. + */ + type?: string; + }; +} +interface Ai_Cf_Meta_Llama_Guard_3_8B_Output { + response?: string | { + /** + * Whether the conversation is safe or not. + */ + safe?: boolean; + /** + * A list of what hazard categories predicted for the conversation, if the conversation is deemed unsafe. + */ + categories?: string[]; + }; + /** + * Usage statistics for the inference request + */ + usage?: { + /** + * Total number of tokens in input + */ + prompt_tokens?: number; + /** + * Total number of tokens in output + */ + completion_tokens?: number; + /** + * Total number of input and output tokens + */ + total_tokens?: number; + }; +} +declare abstract class Base_Ai_Cf_Meta_Llama_Guard_3_8B { + inputs: Ai_Cf_Meta_Llama_Guard_3_8B_Input; + postProcessedOutputs: Ai_Cf_Meta_Llama_Guard_3_8B_Output; +} +interface Ai_Cf_Baai_Bge_Reranker_Base_Input { + /** + * A query you wish to perform against the provided contexts. + */ + /** + * Number of returned results starting with the best score. + */ + top_k?: number; + /** + * List of provided contexts. Note that the index in this array is important, as the response will refer to it. + */ + contexts: { + /** + * One of the provided context content + */ + text?: string; + }[]; +} +interface Ai_Cf_Baai_Bge_Reranker_Base_Output { + response?: { + /** + * Index of the context in the request + */ + id?: number; + /** + * Score of the context under the index. + */ + score?: number; + }[]; +} +declare abstract class Base_Ai_Cf_Baai_Bge_Reranker_Base { + inputs: Ai_Cf_Baai_Bge_Reranker_Base_Input; + postProcessedOutputs: Ai_Cf_Baai_Bge_Reranker_Base_Output; +} +type Ai_Cf_Qwen_Qwen2_5_Coder_32B_Instruct_Input = Ai_Cf_Qwen_Qwen2_5_Coder_32B_Instruct_Prompt | Ai_Cf_Qwen_Qwen2_5_Coder_32B_Instruct_Messages; +interface Ai_Cf_Qwen_Qwen2_5_Coder_32B_Instruct_Prompt { + /** + * The input text prompt for the model to generate a response. + */ + prompt: string; + /** + * Name of the LoRA (Low-Rank Adaptation) model to fine-tune the base model. + */ + lora?: string; + response_format?: Ai_Cf_Qwen_Qwen2_5_Coder_32B_Instruct_JSON_Mode; + /** + * If true, a chat template is not applied and you must adhere to the specific model's expected formatting. + */ + raw?: boolean; + /** + * If true, the response will be streamed back incrementally using SSE, Server Sent Events. + */ + stream?: boolean; + /** + * The maximum number of tokens to generate in the response. + */ + max_tokens?: number; + /** + * Controls the randomness of the output; higher values produce more random results. + */ + temperature?: number; + /** + * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses. + */ + top_p?: number; + /** + * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises. + */ + top_k?: number; + /** + * Random seed for reproducibility of the generation. + */ + seed?: number; + /** + * Penalty for repeated tokens; higher values discourage repetition. + */ + repetition_penalty?: number; + /** + * Decreases the likelihood of the model repeating the same lines verbatim. + */ + frequency_penalty?: number; + /** + * Increases the likelihood of the model introducing new topics. + */ + presence_penalty?: number; +} +interface Ai_Cf_Qwen_Qwen2_5_Coder_32B_Instruct_JSON_Mode { + type?: "json_object" | "json_schema"; + json_schema?: unknown; +} +interface Ai_Cf_Qwen_Qwen2_5_Coder_32B_Instruct_Messages { + /** + * An array of message objects representing the conversation history. + */ + messages: { + /** + * The role of the message sender (e.g., 'user', 'assistant', 'system', 'tool'). + */ + role: string; + /** + * The content of the message as a string. + */ + content: string; + }[]; + functions?: { + name: string; + code: string; + }[]; + /** + * A list of tools available for the assistant to use. + */ + tools?: ({ + /** + * The name of the tool. More descriptive the better. + */ + name: string; + /** + * A brief description of what the tool does. + */ + description: string; + /** + * Schema defining the parameters accepted by the tool. + */ + parameters: { + /** + * The type of the parameters object (usually 'object'). + */ + type: string; + /** + * List of required parameter names. + */ + required?: string[]; + /** + * Definitions of each parameter. + */ + properties: { + [k: string]: { + /** + * The data type of the parameter. + */ + type: string; + /** + * A description of the expected parameter. + */ + description: string; + }; + }; + }; + } | { + /** + * Specifies the type of tool (e.g., 'function'). + */ + type: string; + /** + * Details of the function tool. + */ + function: { + /** + * The name of the function. + */ + name: string; + /** + * A brief description of what the function does. + */ + description: string; + /** + * Schema defining the parameters accepted by the function. + */ + parameters: { + /** + * The type of the parameters object (usually 'object'). + */ + type: string; + /** + * List of required parameter names. + */ + required?: string[]; + /** + * Definitions of each parameter. + */ + properties: { + [k: string]: { + /** + * The data type of the parameter. + */ + type: string; + /** + * A description of the expected parameter. + */ + description: string; + }; + }; + }; + }; + })[]; + response_format?: Ai_Cf_Qwen_Qwen2_5_Coder_32B_Instruct_JSON_Mode_1; + /** + * If true, a chat template is not applied and you must adhere to the specific model's expected formatting. + */ + raw?: boolean; + /** + * If true, the response will be streamed back incrementally using SSE, Server Sent Events. + */ + stream?: boolean; + /** + * The maximum number of tokens to generate in the response. + */ + max_tokens?: number; + /** + * Controls the randomness of the output; higher values produce more random results. + */ + temperature?: number; + /** + * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses. + */ + top_p?: number; + /** + * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises. + */ + top_k?: number; + /** + * Random seed for reproducibility of the generation. + */ + seed?: number; + /** + * Penalty for repeated tokens; higher values discourage repetition. + */ + repetition_penalty?: number; + /** + * Decreases the likelihood of the model repeating the same lines verbatim. + */ + frequency_penalty?: number; + /** + * Increases the likelihood of the model introducing new topics. + */ + presence_penalty?: number; +} +interface Ai_Cf_Qwen_Qwen2_5_Coder_32B_Instruct_JSON_Mode_1 { + type?: "json_object" | "json_schema"; + json_schema?: unknown; +} +type Ai_Cf_Qwen_Qwen2_5_Coder_32B_Instruct_Output = { + /** + * The generated text response from the model + */ + response: string; + /** + * Usage statistics for the inference request + */ + usage?: { + /** + * Total number of tokens in input + */ + prompt_tokens?: number; + /** + * Total number of tokens in output + */ + completion_tokens?: number; + /** + * Total number of input and output tokens + */ + total_tokens?: number; + }; + /** + * An array of tool calls requests made during the response generation + */ + tool_calls?: { + /** + * The arguments passed to be passed to the tool call request + */ + arguments?: object; + /** + * The name of the tool to be called + */ + name?: string; + }[]; +}; +declare abstract class Base_Ai_Cf_Qwen_Qwen2_5_Coder_32B_Instruct { + inputs: Ai_Cf_Qwen_Qwen2_5_Coder_32B_Instruct_Input; + postProcessedOutputs: Ai_Cf_Qwen_Qwen2_5_Coder_32B_Instruct_Output; +} +type Ai_Cf_Qwen_Qwq_32B_Input = Ai_Cf_Qwen_Qwq_32B_Prompt | Ai_Cf_Qwen_Qwq_32B_Messages; +interface Ai_Cf_Qwen_Qwq_32B_Prompt { + /** + * The input text prompt for the model to generate a response. + */ + prompt: string; + /** + * JSON schema that should be fulfilled for the response. + */ + guided_json?: object; + /** + * If true, a chat template is not applied and you must adhere to the specific model's expected formatting. + */ + raw?: boolean; + /** + * If true, the response will be streamed back incrementally using SSE, Server Sent Events. + */ + stream?: boolean; + /** + * The maximum number of tokens to generate in the response. + */ + max_tokens?: number; + /** + * Controls the randomness of the output; higher values produce more random results. + */ + temperature?: number; + /** + * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses. + */ + top_p?: number; + /** + * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises. + */ + top_k?: number; + /** + * Random seed for reproducibility of the generation. + */ + seed?: number; + /** + * Penalty for repeated tokens; higher values discourage repetition. + */ + repetition_penalty?: number; + /** + * Decreases the likelihood of the model repeating the same lines verbatim. + */ + frequency_penalty?: number; + /** + * Increases the likelihood of the model introducing new topics. + */ + presence_penalty?: number; +} +interface Ai_Cf_Qwen_Qwq_32B_Messages { + /** + * An array of message objects representing the conversation history. + */ + messages: { + /** + * The role of the message sender (e.g., 'user', 'assistant', 'system', 'tool'). + */ + role?: string; + /** + * The tool call id. If you don't know what to put here you can fall back to 000000001 + */ + tool_call_id?: string; + content?: string | { + /** + * Type of the content provided + */ + type?: string; + text?: string; + image_url?: { + /** + * image uri with data (e.g. data:image/jpeg;base64,/9j/...). HTTP URL will not be accepted + */ + url?: string; + }; + }[] | { + /** + * Type of the content provided + */ + type?: string; + text?: string; + image_url?: { + /** + * image uri with data (e.g. data:image/jpeg;base64,/9j/...). HTTP URL will not be accepted + */ + url?: string; + }; + }; + }[]; + functions?: { + name: string; + code: string; + }[]; + /** + * A list of tools available for the assistant to use. + */ + tools?: ({ + /** + * The name of the tool. More descriptive the better. + */ + name: string; + /** + * A brief description of what the tool does. + */ + description: string; + /** + * Schema defining the parameters accepted by the tool. + */ + parameters: { + /** + * The type of the parameters object (usually 'object'). + */ + type: string; + /** + * List of required parameter names. + */ + required?: string[]; + /** + * Definitions of each parameter. + */ + properties: { + [k: string]: { + /** + * The data type of the parameter. + */ + type: string; + /** + * A description of the expected parameter. + */ + description: string; + }; + }; + }; + } | { + /** + * Specifies the type of tool (e.g., 'function'). + */ + type: string; + /** + * Details of the function tool. + */ + function: { + /** + * The name of the function. + */ + name: string; + /** + * A brief description of what the function does. + */ + description: string; + /** + * Schema defining the parameters accepted by the function. + */ + parameters: { + /** + * The type of the parameters object (usually 'object'). + */ + type: string; + /** + * List of required parameter names. + */ + required?: string[]; + /** + * Definitions of each parameter. + */ + properties: { + [k: string]: { + /** + * The data type of the parameter. + */ + type: string; + /** + * A description of the expected parameter. + */ + description: string; + }; + }; + }; + }; + })[]; + /** + * JSON schema that should be fufilled for the response. + */ + guided_json?: object; + /** + * If true, a chat template is not applied and you must adhere to the specific model's expected formatting. + */ + raw?: boolean; + /** + * If true, the response will be streamed back incrementally using SSE, Server Sent Events. + */ + stream?: boolean; + /** + * The maximum number of tokens to generate in the response. + */ + max_tokens?: number; + /** + * Controls the randomness of the output; higher values produce more random results. + */ + temperature?: number; + /** + * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses. + */ + top_p?: number; + /** + * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises. + */ + top_k?: number; + /** + * Random seed for reproducibility of the generation. + */ + seed?: number; + /** + * Penalty for repeated tokens; higher values discourage repetition. + */ + repetition_penalty?: number; + /** + * Decreases the likelihood of the model repeating the same lines verbatim. + */ + frequency_penalty?: number; + /** + * Increases the likelihood of the model introducing new topics. + */ + presence_penalty?: number; +} +type Ai_Cf_Qwen_Qwq_32B_Output = { + /** + * The generated text response from the model + */ + response: string; + /** + * Usage statistics for the inference request + */ + usage?: { + /** + * Total number of tokens in input + */ + prompt_tokens?: number; + /** + * Total number of tokens in output + */ + completion_tokens?: number; + /** + * Total number of input and output tokens + */ + total_tokens?: number; + }; + /** + * An array of tool calls requests made during the response generation + */ + tool_calls?: { + /** + * The arguments passed to be passed to the tool call request + */ + arguments?: object; + /** + * The name of the tool to be called + */ + name?: string; + }[]; +}; +declare abstract class Base_Ai_Cf_Qwen_Qwq_32B { + inputs: Ai_Cf_Qwen_Qwq_32B_Input; + postProcessedOutputs: Ai_Cf_Qwen_Qwq_32B_Output; +} +type Ai_Cf_Mistralai_Mistral_Small_3_1_24B_Instruct_Input = Ai_Cf_Mistralai_Mistral_Small_3_1_24B_Instruct_Prompt | Ai_Cf_Mistralai_Mistral_Small_3_1_24B_Instruct_Messages; +interface Ai_Cf_Mistralai_Mistral_Small_3_1_24B_Instruct_Prompt { + /** + * The input text prompt for the model to generate a response. + */ + prompt: string; + /** + * JSON schema that should be fulfilled for the response. + */ + guided_json?: object; + /** + * If true, a chat template is not applied and you must adhere to the specific model's expected formatting. + */ + raw?: boolean; + /** + * If true, the response will be streamed back incrementally using SSE, Server Sent Events. + */ + stream?: boolean; + /** + * The maximum number of tokens to generate in the response. + */ + max_tokens?: number; + /** + * Controls the randomness of the output; higher values produce more random results. + */ + temperature?: number; + /** + * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses. + */ + top_p?: number; + /** + * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises. + */ + top_k?: number; + /** + * Random seed for reproducibility of the generation. + */ + seed?: number; + /** + * Penalty for repeated tokens; higher values discourage repetition. + */ + repetition_penalty?: number; + /** + * Decreases the likelihood of the model repeating the same lines verbatim. + */ + frequency_penalty?: number; + /** + * Increases the likelihood of the model introducing new topics. + */ + presence_penalty?: number; +} +interface Ai_Cf_Mistralai_Mistral_Small_3_1_24B_Instruct_Messages { + /** + * An array of message objects representing the conversation history. + */ + messages: { + /** + * The role of the message sender (e.g., 'user', 'assistant', 'system', 'tool'). + */ + role?: string; + /** + * The tool call id. Must be supplied for tool calls for Mistral-3. If you don't know what to put here you can fall back to 000000001 + */ + tool_call_id?: string; + content?: string | { + /** + * Type of the content provided + */ + type?: string; + text?: string; + image_url?: { + /** + * image uri with data (e.g. data:image/jpeg;base64,/9j/...). HTTP URL will not be accepted + */ + url?: string; + }; + }[] | { + /** + * Type of the content provided + */ + type?: string; + text?: string; + image_url?: { + /** + * image uri with data (e.g. data:image/jpeg;base64,/9j/...). HTTP URL will not be accepted + */ + url?: string; + }; + }; + }[]; + functions?: { + name: string; + code: string; + }[]; + /** + * A list of tools available for the assistant to use. + */ + tools?: ({ + /** + * The name of the tool. More descriptive the better. + */ + name: string; + /** + * A brief description of what the tool does. + */ + description: string; + /** + * Schema defining the parameters accepted by the tool. + */ + parameters: { + /** + * The type of the parameters object (usually 'object'). + */ + type: string; + /** + * List of required parameter names. + */ + required?: string[]; + /** + * Definitions of each parameter. + */ + properties: { + [k: string]: { + /** + * The data type of the parameter. + */ + type: string; + /** + * A description of the expected parameter. + */ + description: string; + }; + }; + }; + } | { + /** + * Specifies the type of tool (e.g., 'function'). + */ + type: string; + /** + * Details of the function tool. + */ + function: { + /** + * The name of the function. + */ + name: string; + /** + * A brief description of what the function does. + */ + description: string; + /** + * Schema defining the parameters accepted by the function. + */ + parameters: { + /** + * The type of the parameters object (usually 'object'). + */ + type: string; + /** + * List of required parameter names. + */ + required?: string[]; + /** + * Definitions of each parameter. + */ + properties: { + [k: string]: { + /** + * The data type of the parameter. + */ + type: string; + /** + * A description of the expected parameter. + */ + description: string; + }; + }; + }; + }; + })[]; + /** + * JSON schema that should be fufilled for the response. + */ + guided_json?: object; + /** + * If true, a chat template is not applied and you must adhere to the specific model's expected formatting. + */ + raw?: boolean; + /** + * If true, the response will be streamed back incrementally using SSE, Server Sent Events. + */ + stream?: boolean; + /** + * The maximum number of tokens to generate in the response. + */ + max_tokens?: number; + /** + * Controls the randomness of the output; higher values produce more random results. + */ + temperature?: number; + /** + * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses. + */ + top_p?: number; + /** + * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises. + */ + top_k?: number; + /** + * Random seed for reproducibility of the generation. + */ + seed?: number; + /** + * Penalty for repeated tokens; higher values discourage repetition. + */ + repetition_penalty?: number; + /** + * Decreases the likelihood of the model repeating the same lines verbatim. + */ + frequency_penalty?: number; + /** + * Increases the likelihood of the model introducing new topics. + */ + presence_penalty?: number; +} +type Ai_Cf_Mistralai_Mistral_Small_3_1_24B_Instruct_Output = { + /** + * The generated text response from the model + */ + response: string; + /** + * Usage statistics for the inference request + */ + usage?: { + /** + * Total number of tokens in input + */ + prompt_tokens?: number; + /** + * Total number of tokens in output + */ + completion_tokens?: number; + /** + * Total number of input and output tokens + */ + total_tokens?: number; + }; + /** + * An array of tool calls requests made during the response generation + */ + tool_calls?: { + /** + * The arguments passed to be passed to the tool call request + */ + arguments?: object; + /** + * The name of the tool to be called + */ + name?: string; + }[]; +}; +declare abstract class Base_Ai_Cf_Mistralai_Mistral_Small_3_1_24B_Instruct { + inputs: Ai_Cf_Mistralai_Mistral_Small_3_1_24B_Instruct_Input; + postProcessedOutputs: Ai_Cf_Mistralai_Mistral_Small_3_1_24B_Instruct_Output; +} +type Ai_Cf_Google_Gemma_3_12B_It_Input = Ai_Cf_Google_Gemma_3_12B_It_Prompt | Ai_Cf_Google_Gemma_3_12B_It_Messages; +interface Ai_Cf_Google_Gemma_3_12B_It_Prompt { + /** + * The input text prompt for the model to generate a response. + */ + prompt: string; + /** + * JSON schema that should be fufilled for the response. + */ + guided_json?: object; + /** + * If true, a chat template is not applied and you must adhere to the specific model's expected formatting. + */ + raw?: boolean; + /** + * If true, the response will be streamed back incrementally using SSE, Server Sent Events. + */ + stream?: boolean; + /** + * The maximum number of tokens to generate in the response. + */ + max_tokens?: number; + /** + * Controls the randomness of the output; higher values produce more random results. + */ + temperature?: number; + /** + * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses. + */ + top_p?: number; + /** + * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises. + */ + top_k?: number; + /** + * Random seed for reproducibility of the generation. + */ + seed?: number; + /** + * Penalty for repeated tokens; higher values discourage repetition. + */ + repetition_penalty?: number; + /** + * Decreases the likelihood of the model repeating the same lines verbatim. + */ + frequency_penalty?: number; + /** + * Increases the likelihood of the model introducing new topics. + */ + presence_penalty?: number; +} +interface Ai_Cf_Google_Gemma_3_12B_It_Messages { + /** + * An array of message objects representing the conversation history. + */ + messages: { + /** + * The role of the message sender (e.g., 'user', 'assistant', 'system', 'tool'). + */ + role?: string; + content?: string | { + /** + * Type of the content provided + */ + type?: string; + text?: string; + image_url?: { + /** + * image uri with data (e.g. data:image/jpeg;base64,/9j/...). HTTP URL will not be accepted + */ + url?: string; + }; + }[]; + }[]; + functions?: { + name: string; + code: string; + }[]; + /** + * A list of tools available for the assistant to use. + */ + tools?: ({ + /** + * The name of the tool. More descriptive the better. + */ + name: string; + /** + * A brief description of what the tool does. + */ + description: string; + /** + * Schema defining the parameters accepted by the tool. + */ + parameters: { + /** + * The type of the parameters object (usually 'object'). + */ + type: string; + /** + * List of required parameter names. + */ + required?: string[]; + /** + * Definitions of each parameter. + */ + properties: { + [k: string]: { + /** + * The data type of the parameter. + */ + type: string; + /** + * A description of the expected parameter. + */ + description: string; + }; + }; + }; + } | { + /** + * Specifies the type of tool (e.g., 'function'). + */ + type: string; + /** + * Details of the function tool. + */ + function: { + /** + * The name of the function. + */ + name: string; + /** + * A brief description of what the function does. + */ + description: string; + /** + * Schema defining the parameters accepted by the function. + */ + parameters: { + /** + * The type of the parameters object (usually 'object'). + */ + type: string; + /** + * List of required parameter names. + */ + required?: string[]; + /** + * Definitions of each parameter. + */ + properties: { + [k: string]: { + /** + * The data type of the parameter. + */ + type: string; + /** + * A description of the expected parameter. + */ + description: string; + }; + }; + }; + }; + })[]; + /** + * JSON schema that should be fufilled for the response. + */ + guided_json?: object; + /** + * If true, a chat template is not applied and you must adhere to the specific model's expected formatting. + */ + raw?: boolean; + /** + * If true, the response will be streamed back incrementally using SSE, Server Sent Events. + */ + stream?: boolean; + /** + * The maximum number of tokens to generate in the response. + */ + max_tokens?: number; + /** + * Controls the randomness of the output; higher values produce more random results. + */ + temperature?: number; + /** + * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses. + */ + top_p?: number; + /** + * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises. + */ + top_k?: number; + /** + * Random seed for reproducibility of the generation. + */ + seed?: number; + /** + * Penalty for repeated tokens; higher values discourage repetition. + */ + repetition_penalty?: number; + /** + * Decreases the likelihood of the model repeating the same lines verbatim. + */ + frequency_penalty?: number; + /** + * Increases the likelihood of the model introducing new topics. + */ + presence_penalty?: number; +} +type Ai_Cf_Google_Gemma_3_12B_It_Output = { + /** + * The generated text response from the model + */ + response: string; + /** + * Usage statistics for the inference request + */ + usage?: { + /** + * Total number of tokens in input + */ + prompt_tokens?: number; + /** + * Total number of tokens in output + */ + completion_tokens?: number; + /** + * Total number of input and output tokens + */ + total_tokens?: number; + }; + /** + * An array of tool calls requests made during the response generation + */ + tool_calls?: { + /** + * The arguments passed to be passed to the tool call request + */ + arguments?: object; + /** + * The name of the tool to be called + */ + name?: string; + }[]; +}; +declare abstract class Base_Ai_Cf_Google_Gemma_3_12B_It { + inputs: Ai_Cf_Google_Gemma_3_12B_It_Input; + postProcessedOutputs: Ai_Cf_Google_Gemma_3_12B_It_Output; +} +type Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct_Input = Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct_Prompt | Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct_Messages | Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct_Async_Batch; +interface Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct_Prompt { + /** + * The input text prompt for the model to generate a response. + */ + prompt: string; + /** + * JSON schema that should be fulfilled for the response. + */ + guided_json?: object; + response_format?: Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct_JSON_Mode; + /** + * If true, a chat template is not applied and you must adhere to the specific model's expected formatting. + */ + raw?: boolean; + /** + * If true, the response will be streamed back incrementally using SSE, Server Sent Events. + */ + stream?: boolean; + /** + * The maximum number of tokens to generate in the response. + */ + max_tokens?: number; + /** + * Controls the randomness of the output; higher values produce more random results. + */ + temperature?: number; + /** + * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses. + */ + top_p?: number; + /** + * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises. + */ + top_k?: number; + /** + * Random seed for reproducibility of the generation. + */ + seed?: number; + /** + * Penalty for repeated tokens; higher values discourage repetition. + */ + repetition_penalty?: number; + /** + * Decreases the likelihood of the model repeating the same lines verbatim. + */ + frequency_penalty?: number; + /** + * Increases the likelihood of the model introducing new topics. + */ + presence_penalty?: number; +} +interface Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct_JSON_Mode { + type?: "json_object" | "json_schema"; + json_schema?: unknown; +} +interface Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct_Messages { + /** + * An array of message objects representing the conversation history. + */ + messages: { + /** + * The role of the message sender (e.g., 'user', 'assistant', 'system', 'tool'). + */ + role?: string; + /** + * The tool call id. If you don't know what to put here you can fall back to 000000001 + */ + tool_call_id?: string; + content?: string | { + /** + * Type of the content provided + */ + type?: string; + text?: string; + image_url?: { + /** + * image uri with data (e.g. data:image/jpeg;base64,/9j/...). HTTP URL will not be accepted + */ + url?: string; + }; + }[] | { + /** + * Type of the content provided + */ + type?: string; + text?: string; + image_url?: { + /** + * image uri with data (e.g. data:image/jpeg;base64,/9j/...). HTTP URL will not be accepted + */ + url?: string; + }; + }; + }[]; + functions?: { + name: string; + code: string; + }[]; + /** + * A list of tools available for the assistant to use. + */ + tools?: ({ + /** + * The name of the tool. More descriptive the better. + */ + name: string; + /** + * A brief description of what the tool does. + */ + description: string; + /** + * Schema defining the parameters accepted by the tool. + */ + parameters: { + /** + * The type of the parameters object (usually 'object'). + */ + type: string; + /** + * List of required parameter names. + */ + required?: string[]; + /** + * Definitions of each parameter. + */ + properties: { + [k: string]: { + /** + * The data type of the parameter. + */ + type: string; + /** + * A description of the expected parameter. + */ + description: string; + }; + }; + }; + } | { + /** + * Specifies the type of tool (e.g., 'function'). + */ + type: string; + /** + * Details of the function tool. + */ + function: { + /** + * The name of the function. + */ + name: string; + /** + * A brief description of what the function does. + */ + description: string; + /** + * Schema defining the parameters accepted by the function. + */ + parameters: { + /** + * The type of the parameters object (usually 'object'). + */ + type: string; + /** + * List of required parameter names. + */ + required?: string[]; + /** + * Definitions of each parameter. + */ + properties: { + [k: string]: { + /** + * The data type of the parameter. + */ + type: string; + /** + * A description of the expected parameter. + */ + description: string; + }; + }; + }; + }; + })[]; + response_format?: Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct_JSON_Mode; + /** + * JSON schema that should be fufilled for the response. + */ + guided_json?: object; + /** + * If true, a chat template is not applied and you must adhere to the specific model's expected formatting. + */ + raw?: boolean; + /** + * If true, the response will be streamed back incrementally using SSE, Server Sent Events. + */ + stream?: boolean; + /** + * The maximum number of tokens to generate in the response. + */ + max_tokens?: number; + /** + * Controls the randomness of the output; higher values produce more random results. + */ + temperature?: number; + /** + * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses. + */ + top_p?: number; + /** + * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises. + */ + top_k?: number; + /** + * Random seed for reproducibility of the generation. + */ + seed?: number; + /** + * Penalty for repeated tokens; higher values discourage repetition. + */ + repetition_penalty?: number; + /** + * Decreases the likelihood of the model repeating the same lines verbatim. + */ + frequency_penalty?: number; + /** + * Increases the likelihood of the model introducing new topics. + */ + presence_penalty?: number; +} +interface Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct_Async_Batch { + requests: (Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct_Prompt_Inner | Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct_Messages_Inner)[]; +} +interface Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct_Prompt_Inner { + /** + * The input text prompt for the model to generate a response. + */ + prompt: string; + /** + * JSON schema that should be fulfilled for the response. + */ + guided_json?: object; + response_format?: Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct_JSON_Mode; + /** + * If true, a chat template is not applied and you must adhere to the specific model's expected formatting. + */ + raw?: boolean; + /** + * If true, the response will be streamed back incrementally using SSE, Server Sent Events. + */ + stream?: boolean; + /** + * The maximum number of tokens to generate in the response. + */ + max_tokens?: number; + /** + * Controls the randomness of the output; higher values produce more random results. + */ + temperature?: number; + /** + * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses. + */ + top_p?: number; + /** + * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises. + */ + top_k?: number; + /** + * Random seed for reproducibility of the generation. + */ + seed?: number; + /** + * Penalty for repeated tokens; higher values discourage repetition. + */ + repetition_penalty?: number; + /** + * Decreases the likelihood of the model repeating the same lines verbatim. + */ + frequency_penalty?: number; + /** + * Increases the likelihood of the model introducing new topics. + */ + presence_penalty?: number; +} +interface Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct_Messages_Inner { + /** + * An array of message objects representing the conversation history. + */ + messages: { + /** + * The role of the message sender (e.g., 'user', 'assistant', 'system', 'tool'). + */ + role?: string; + /** + * The tool call id. If you don't know what to put here you can fall back to 000000001 + */ + tool_call_id?: string; + content?: string | { + /** + * Type of the content provided + */ + type?: string; + text?: string; + image_url?: { + /** + * image uri with data (e.g. data:image/jpeg;base64,/9j/...). HTTP URL will not be accepted + */ + url?: string; + }; + }[] | { + /** + * Type of the content provided + */ + type?: string; + text?: string; + image_url?: { + /** + * image uri with data (e.g. data:image/jpeg;base64,/9j/...). HTTP URL will not be accepted + */ + url?: string; + }; + }; + }[]; + functions?: { + name: string; + code: string; + }[]; + /** + * A list of tools available for the assistant to use. + */ + tools?: ({ + /** + * The name of the tool. More descriptive the better. + */ + name: string; + /** + * A brief description of what the tool does. + */ + description: string; + /** + * Schema defining the parameters accepted by the tool. + */ + parameters: { + /** + * The type of the parameters object (usually 'object'). + */ + type: string; + /** + * List of required parameter names. + */ + required?: string[]; + /** + * Definitions of each parameter. + */ + properties: { + [k: string]: { + /** + * The data type of the parameter. + */ + type: string; + /** + * A description of the expected parameter. + */ + description: string; + }; + }; + }; + } | { + /** + * Specifies the type of tool (e.g., 'function'). + */ + type: string; + /** + * Details of the function tool. + */ + function: { + /** + * The name of the function. + */ + name: string; + /** + * A brief description of what the function does. + */ + description: string; + /** + * Schema defining the parameters accepted by the function. + */ + parameters: { + /** + * The type of the parameters object (usually 'object'). + */ + type: string; + /** + * List of required parameter names. + */ + required?: string[]; + /** + * Definitions of each parameter. + */ + properties: { + [k: string]: { + /** + * The data type of the parameter. + */ + type: string; + /** + * A description of the expected parameter. + */ + description: string; + }; + }; + }; + }; + })[]; + response_format?: Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct_JSON_Mode; + /** + * JSON schema that should be fufilled for the response. + */ + guided_json?: object; + /** + * If true, a chat template is not applied and you must adhere to the specific model's expected formatting. + */ + raw?: boolean; + /** + * If true, the response will be streamed back incrementally using SSE, Server Sent Events. + */ + stream?: boolean; + /** + * The maximum number of tokens to generate in the response. + */ + max_tokens?: number; + /** + * Controls the randomness of the output; higher values produce more random results. + */ + temperature?: number; + /** + * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses. + */ + top_p?: number; + /** + * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises. + */ + top_k?: number; + /** + * Random seed for reproducibility of the generation. + */ + seed?: number; + /** + * Penalty for repeated tokens; higher values discourage repetition. + */ + repetition_penalty?: number; + /** + * Decreases the likelihood of the model repeating the same lines verbatim. + */ + frequency_penalty?: number; + /** + * Increases the likelihood of the model introducing new topics. + */ + presence_penalty?: number; +} +type Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct_Output = { + /** + * The generated text response from the model + */ + response: string; + /** + * Usage statistics for the inference request + */ + usage?: { + /** + * Total number of tokens in input + */ + prompt_tokens?: number; + /** + * Total number of tokens in output + */ + completion_tokens?: number; + /** + * Total number of input and output tokens + */ + total_tokens?: number; + }; + /** + * An array of tool calls requests made during the response generation + */ + tool_calls?: { + /** + * The tool call id. + */ + id?: string; + /** + * Specifies the type of tool (e.g., 'function'). + */ + type?: string; + /** + * Details of the function tool. + */ + function?: { + /** + * The name of the tool to be called + */ + name?: string; + /** + * The arguments passed to be passed to the tool call request + */ + arguments?: object; + }; + }[]; +}; +declare abstract class Base_Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct { + inputs: Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct_Input; + postProcessedOutputs: Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct_Output; +} +type Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_Input = Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_Prompt | Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_Messages | Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_Async_Batch; +interface Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_Prompt { + /** + * The input text prompt for the model to generate a response. + */ + prompt: string; + /** + * Name of the LoRA (Low-Rank Adaptation) model to fine-tune the base model. + */ + lora?: string; + response_format?: Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_JSON_Mode; + /** + * If true, a chat template is not applied and you must adhere to the specific model's expected formatting. + */ + raw?: boolean; + /** + * If true, the response will be streamed back incrementally using SSE, Server Sent Events. + */ + stream?: boolean; + /** + * The maximum number of tokens to generate in the response. + */ + max_tokens?: number; + /** + * Controls the randomness of the output; higher values produce more random results. + */ + temperature?: number; + /** + * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses. + */ + top_p?: number; + /** + * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises. + */ + top_k?: number; + /** + * Random seed for reproducibility of the generation. + */ + seed?: number; + /** + * Penalty for repeated tokens; higher values discourage repetition. + */ + repetition_penalty?: number; + /** + * Decreases the likelihood of the model repeating the same lines verbatim. + */ + frequency_penalty?: number; + /** + * Increases the likelihood of the model introducing new topics. + */ + presence_penalty?: number; +} +interface Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_JSON_Mode { + type?: "json_object" | "json_schema"; + json_schema?: unknown; +} +interface Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_Messages { + /** + * An array of message objects representing the conversation history. + */ + messages: { + /** + * The role of the message sender (e.g., 'user', 'assistant', 'system', 'tool'). + */ + role: string; + content: string | { + /** + * Type of the content (text) + */ + type?: string; + /** + * Text content + */ + text?: string; + }[]; + }[]; + functions?: { + name: string; + code: string; + }[]; + /** + * A list of tools available for the assistant to use. + */ + tools?: ({ + /** + * The name of the tool. More descriptive the better. + */ + name: string; + /** + * A brief description of what the tool does. + */ + description: string; + /** + * Schema defining the parameters accepted by the tool. + */ + parameters: { + /** + * The type of the parameters object (usually 'object'). + */ + type: string; + /** + * List of required parameter names. + */ + required?: string[]; + /** + * Definitions of each parameter. + */ + properties: { + [k: string]: { + /** + * The data type of the parameter. + */ + type: string; + /** + * A description of the expected parameter. + */ + description: string; + }; + }; + }; + } | { + /** + * Specifies the type of tool (e.g., 'function'). + */ + type: string; + /** + * Details of the function tool. + */ + function: { + /** + * The name of the function. + */ + name: string; + /** + * A brief description of what the function does. + */ + description: string; + /** + * Schema defining the parameters accepted by the function. + */ + parameters: { + /** + * The type of the parameters object (usually 'object'). + */ + type: string; + /** + * List of required parameter names. + */ + required?: string[]; + /** + * Definitions of each parameter. + */ + properties: { + [k: string]: { + /** + * The data type of the parameter. + */ + type: string; + /** + * A description of the expected parameter. + */ + description: string; + }; + }; + }; + }; + })[]; + response_format?: Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_JSON_Mode_1; + /** + * If true, a chat template is not applied and you must adhere to the specific model's expected formatting. + */ + raw?: boolean; + /** + * If true, the response will be streamed back incrementally using SSE, Server Sent Events. + */ + stream?: boolean; + /** + * The maximum number of tokens to generate in the response. + */ + max_tokens?: number; + /** + * Controls the randomness of the output; higher values produce more random results. + */ + temperature?: number; + /** + * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses. + */ + top_p?: number; + /** + * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises. + */ + top_k?: number; + /** + * Random seed for reproducibility of the generation. + */ + seed?: number; + /** + * Penalty for repeated tokens; higher values discourage repetition. + */ + repetition_penalty?: number; + /** + * Decreases the likelihood of the model repeating the same lines verbatim. + */ + frequency_penalty?: number; + /** + * Increases the likelihood of the model introducing new topics. + */ + presence_penalty?: number; +} +interface Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_JSON_Mode_1 { + type?: "json_object" | "json_schema"; + json_schema?: unknown; +} +interface Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_Async_Batch { + requests: (Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_Prompt_1 | Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_Messages_1)[]; +} +interface Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_Prompt_1 { + /** + * The input text prompt for the model to generate a response. + */ + prompt: string; + /** + * Name of the LoRA (Low-Rank Adaptation) model to fine-tune the base model. + */ + lora?: string; + response_format?: Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_JSON_Mode_2; + /** + * If true, a chat template is not applied and you must adhere to the specific model's expected formatting. + */ + raw?: boolean; + /** + * If true, the response will be streamed back incrementally using SSE, Server Sent Events. + */ + stream?: boolean; + /** + * The maximum number of tokens to generate in the response. + */ + max_tokens?: number; + /** + * Controls the randomness of the output; higher values produce more random results. + */ + temperature?: number; + /** + * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses. + */ + top_p?: number; + /** + * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises. + */ + top_k?: number; + /** + * Random seed for reproducibility of the generation. + */ + seed?: number; + /** + * Penalty for repeated tokens; higher values discourage repetition. + */ + repetition_penalty?: number; + /** + * Decreases the likelihood of the model repeating the same lines verbatim. + */ + frequency_penalty?: number; + /** + * Increases the likelihood of the model introducing new topics. + */ + presence_penalty?: number; +} +interface Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_JSON_Mode_2 { + type?: "json_object" | "json_schema"; + json_schema?: unknown; +} +interface Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_Messages_1 { + /** + * An array of message objects representing the conversation history. + */ + messages: { + /** + * The role of the message sender (e.g., 'user', 'assistant', 'system', 'tool'). + */ + role: string; + content: string | { + /** + * Type of the content (text) + */ + type?: string; + /** + * Text content + */ + text?: string; + }[]; + }[]; + functions?: { + name: string; + code: string; + }[]; + /** + * A list of tools available for the assistant to use. + */ + tools?: ({ + /** + * The name of the tool. More descriptive the better. + */ + name: string; + /** + * A brief description of what the tool does. + */ + description: string; + /** + * Schema defining the parameters accepted by the tool. + */ + parameters: { + /** + * The type of the parameters object (usually 'object'). + */ + type: string; + /** + * List of required parameter names. + */ + required?: string[]; + /** + * Definitions of each parameter. + */ + properties: { + [k: string]: { + /** + * The data type of the parameter. + */ + type: string; + /** + * A description of the expected parameter. + */ + description: string; + }; + }; + }; + } | { + /** + * Specifies the type of tool (e.g., 'function'). + */ + type: string; + /** + * Details of the function tool. + */ + function: { + /** + * The name of the function. + */ + name: string; + /** + * A brief description of what the function does. + */ + description: string; + /** + * Schema defining the parameters accepted by the function. + */ + parameters: { + /** + * The type of the parameters object (usually 'object'). + */ + type: string; + /** + * List of required parameter names. + */ + required?: string[]; + /** + * Definitions of each parameter. + */ + properties: { + [k: string]: { + /** + * The data type of the parameter. + */ + type: string; + /** + * A description of the expected parameter. + */ + description: string; + }; + }; + }; + }; + })[]; + response_format?: Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_JSON_Mode_3; + /** + * If true, a chat template is not applied and you must adhere to the specific model's expected formatting. + */ + raw?: boolean; + /** + * If true, the response will be streamed back incrementally using SSE, Server Sent Events. + */ + stream?: boolean; + /** + * The maximum number of tokens to generate in the response. + */ + max_tokens?: number; + /** + * Controls the randomness of the output; higher values produce more random results. + */ + temperature?: number; + /** + * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses. + */ + top_p?: number; + /** + * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises. + */ + top_k?: number; + /** + * Random seed for reproducibility of the generation. + */ + seed?: number; + /** + * Penalty for repeated tokens; higher values discourage repetition. + */ + repetition_penalty?: number; + /** + * Decreases the likelihood of the model repeating the same lines verbatim. + */ + frequency_penalty?: number; + /** + * Increases the likelihood of the model introducing new topics. + */ + presence_penalty?: number; +} +interface Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_JSON_Mode_3 { + type?: "json_object" | "json_schema"; + json_schema?: unknown; +} +type Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_Output = Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_Chat_Completion_Response | Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_Text_Completion_Response | string | Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_AsyncResponse; +interface Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_Chat_Completion_Response { + /** + * Unique identifier for the completion + */ + id?: string; + /** + * Object type identifier + */ + object?: "chat.completion"; + /** + * Unix timestamp of when the completion was created + */ + created?: number; + /** + * Model used for the completion + */ + model?: string; + /** + * List of completion choices + */ + choices?: { + /** + * Index of the choice in the list + */ + index?: number; + /** + * The message generated by the model + */ + message?: { + /** + * Role of the message author + */ + role: string; + /** + * The content of the message + */ + content: string; + /** + * Internal reasoning content (if available) + */ + reasoning_content?: string; + /** + * Tool calls made by the assistant + */ + tool_calls?: { + /** + * Unique identifier for the tool call + */ + id: string; + /** + * Type of tool call + */ + type: "function"; + function: { + /** + * Name of the function to call + */ + name: string; + /** + * JSON string of arguments for the function + */ + arguments: string; + }; + }[]; + }; + /** + * Reason why the model stopped generating + */ + finish_reason?: string; + /** + * Stop reason (may be null) + */ + stop_reason?: string | null; + /** + * Log probabilities (if requested) + */ + logprobs?: {} | null; + }[]; + /** + * Usage statistics for the inference request + */ + usage?: { + /** + * Total number of tokens in input + */ + prompt_tokens?: number; + /** + * Total number of tokens in output + */ + completion_tokens?: number; + /** + * Total number of input and output tokens + */ + total_tokens?: number; + }; + /** + * Log probabilities for the prompt (if requested) + */ + prompt_logprobs?: {} | null; +} +interface Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_Text_Completion_Response { + /** + * Unique identifier for the completion + */ + id?: string; + /** + * Object type identifier + */ + object?: "text_completion"; + /** + * Unix timestamp of when the completion was created + */ + created?: number; + /** + * Model used for the completion + */ + model?: string; + /** + * List of completion choices + */ + choices?: { + /** + * Index of the choice in the list + */ + index: number; + /** + * The generated text completion + */ + text: string; + /** + * Reason why the model stopped generating + */ + finish_reason: string; + /** + * Stop reason (may be null) + */ + stop_reason?: string | null; + /** + * Log probabilities (if requested) + */ + logprobs?: {} | null; + /** + * Log probabilities for the prompt (if requested) + */ + prompt_logprobs?: {} | null; + }[]; + /** + * Usage statistics for the inference request + */ + usage?: { + /** + * Total number of tokens in input + */ + prompt_tokens?: number; + /** + * Total number of tokens in output + */ + completion_tokens?: number; + /** + * Total number of input and output tokens + */ + total_tokens?: number; + }; +} +interface Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_AsyncResponse { + /** + * The async request id that can be used to obtain the results. + */ + request_id?: string; +} +declare abstract class Base_Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8 { + inputs: Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_Input; + postProcessedOutputs: Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_Output; +} +interface Ai_Cf_Deepgram_Nova_3_Input { + audio: { + body: object; + contentType: string; + }; + /** + * Sets how the model will interpret strings submitted to the custom_topic param. When strict, the model will only return topics submitted using the custom_topic param. When extended, the model will return its own detected topics in addition to those submitted using the custom_topic param. + */ + custom_topic_mode?: "extended" | "strict"; + /** + * Custom topics you want the model to detect within your input audio or text if present Submit up to 100 + */ + custom_topic?: string; + /** + * Sets how the model will interpret intents submitted to the custom_intent param. When strict, the model will only return intents submitted using the custom_intent param. When extended, the model will return its own detected intents in addition those submitted using the custom_intents param + */ + custom_intent_mode?: "extended" | "strict"; + /** + * Custom intents you want the model to detect within your input audio if present + */ + custom_intent?: string; + /** + * Identifies and extracts key entities from content in submitted audio + */ + detect_entities?: boolean; + /** + * Identifies the dominant language spoken in submitted audio + */ + detect_language?: boolean; + /** + * Recognize speaker changes. Each word in the transcript will be assigned a speaker number starting at 0 + */ + diarize?: boolean; + /** + * Identify and extract key entities from content in submitted audio + */ + dictation?: boolean; + /** + * Specify the expected encoding of your submitted audio + */ + encoding?: "linear16" | "flac" | "mulaw" | "amr-nb" | "amr-wb" | "opus" | "speex" | "g729"; + /** + * Arbitrary key-value pairs that are attached to the API response for usage in downstream processing + */ + extra?: string; + /** + * Filler Words can help transcribe interruptions in your audio, like 'uh' and 'um' + */ + filler_words?: boolean; + /** + * Key term prompting can boost or suppress specialized terminology and brands. + */ + keyterm?: string; + /** + * Keywords can boost or suppress specialized terminology and brands. + */ + keywords?: string; + /** + * The BCP-47 language tag that hints at the primary spoken language. Depending on the Model and API endpoint you choose only certain languages are available. + */ + language?: string; + /** + * Spoken measurements will be converted to their corresponding abbreviations. + */ + measurements?: boolean; + /** + * Opts out requests from the Deepgram Model Improvement Program. Refer to our Docs for pricing impacts before setting this to true. https://dpgr.am/deepgram-mip. + */ + mip_opt_out?: boolean; + /** + * Mode of operation for the model representing broad area of topic that will be talked about in the supplied audio + */ + mode?: "general" | "medical" | "finance"; + /** + * Transcribe each audio channel independently. + */ + multichannel?: boolean; + /** + * Numerals converts numbers from written format to numerical format. + */ + numerals?: boolean; + /** + * Splits audio into paragraphs to improve transcript readability. + */ + paragraphs?: boolean; + /** + * Profanity Filter looks for recognized profanity and converts it to the nearest recognized non-profane word or removes it from the transcript completely. + */ + profanity_filter?: boolean; + /** + * Add punctuation and capitalization to the transcript. + */ + punctuate?: boolean; + /** + * Redaction removes sensitive information from your transcripts. + */ + redact?: string; + /** + * Search for terms or phrases in submitted audio and replaces them. + */ + replace?: string; + /** + * Search for terms or phrases in submitted audio. + */ + search?: string; + /** + * Recognizes the sentiment throughout a transcript or text. + */ + sentiment?: boolean; + /** + * Apply formatting to transcript output. When set to true, additional formatting will be applied to transcripts to improve readability. + */ + smart_format?: boolean; + /** + * Detect topics throughout a transcript or text. + */ + topics?: boolean; + /** + * Segments speech into meaningful semantic units. + */ + utterances?: boolean; + /** + * Seconds to wait before detecting a pause between words in submitted audio. + */ + utt_split?: number; + /** + * The number of channels in the submitted audio + */ + channels?: number; + /** + * Specifies whether the streaming endpoint should provide ongoing transcription updates as more audio is received. When set to true, the endpoint sends continuous updates, meaning transcription results may evolve over time. Note: Supported only for webosockets. + */ + interim_results?: boolean; + /** + * Indicates how long model will wait to detect whether a speaker has finished speaking or pauses for a significant period of time. When set to a value, the streaming endpoint immediately finalizes the transcription for the processed time range and returns the transcript with a speech_final parameter set to true. Can also be set to false to disable endpointing + */ + endpointing?: string; + /** + * Indicates that speech has started. You'll begin receiving Speech Started messages upon speech starting. Note: Supported only for webosockets. + */ + vad_events?: boolean; + /** + * Indicates how long model will wait to send an UtteranceEnd message after a word has been transcribed. Use with interim_results. Note: Supported only for webosockets. + */ + utterance_end_ms?: boolean; +} +interface Ai_Cf_Deepgram_Nova_3_Output { + results?: { + channels?: { + alternatives?: { + confidence?: number; + transcript?: string; + words?: { + confidence?: number; + end?: number; + start?: number; + word?: string; + }[]; + }[]; + }[]; + summary?: { + result?: string; + short?: string; + }; + sentiments?: { + segments?: { + text?: string; + start_word?: number; + end_word?: number; + sentiment?: string; + sentiment_score?: number; + }[]; + average?: { + sentiment?: string; + sentiment_score?: number; + }; + }; + }; +} +declare abstract class Base_Ai_Cf_Deepgram_Nova_3 { + inputs: Ai_Cf_Deepgram_Nova_3_Input; + postProcessedOutputs: Ai_Cf_Deepgram_Nova_3_Output; +} +interface Ai_Cf_Qwen_Qwen3_Embedding_0_6B_Input { + queries?: string | string[]; + /** + * Optional instruction for the task + */ + instruction?: string; + documents?: string | string[]; + text?: string | string[]; +} +interface Ai_Cf_Qwen_Qwen3_Embedding_0_6B_Output { + data?: number[][]; + shape?: number[]; +} +declare abstract class Base_Ai_Cf_Qwen_Qwen3_Embedding_0_6B { + inputs: Ai_Cf_Qwen_Qwen3_Embedding_0_6B_Input; + postProcessedOutputs: Ai_Cf_Qwen_Qwen3_Embedding_0_6B_Output; +} +type Ai_Cf_Pipecat_Ai_Smart_Turn_V2_Input = { + /** + * readable stream with audio data and content-type specified for that data + */ + audio: { + body: object; + contentType: string; + }; + /** + * type of data PCM data that's sent to the inference server as raw array + */ + dtype?: "uint8" | "float32" | "float64"; +} | { + /** + * base64 encoded audio data + */ + audio: string; + /** + * type of data PCM data that's sent to the inference server as raw array + */ + dtype?: "uint8" | "float32" | "float64"; +}; +interface Ai_Cf_Pipecat_Ai_Smart_Turn_V2_Output { + /** + * if true, end-of-turn was detected + */ + is_complete?: boolean; + /** + * probability of the end-of-turn detection + */ + probability?: number; +} +declare abstract class Base_Ai_Cf_Pipecat_Ai_Smart_Turn_V2 { + inputs: Ai_Cf_Pipecat_Ai_Smart_Turn_V2_Input; + postProcessedOutputs: Ai_Cf_Pipecat_Ai_Smart_Turn_V2_Output; +} +declare abstract class Base_Ai_Cf_Openai_Gpt_Oss_120B { + inputs: XOR; + postProcessedOutputs: XOR; +} +declare abstract class Base_Ai_Cf_Openai_Gpt_Oss_20B { + inputs: XOR; + postProcessedOutputs: XOR; +} +interface Ai_Cf_Leonardo_Phoenix_1_0_Input { + /** + * A text description of the image you want to generate. + */ + prompt: string; + /** + * Controls how closely the generated image should adhere to the prompt; higher values make the image more aligned with the prompt + */ + guidance?: number; + /** + * Random seed for reproducibility of the image generation + */ + seed?: number; + /** + * The height of the generated image in pixels + */ + height?: number; + /** + * The width of the generated image in pixels + */ + width?: number; + /** + * The number of diffusion steps; higher values can improve quality but take longer + */ + num_steps?: number; + /** + * Specify what to exclude from the generated images + */ + negative_prompt?: string; +} +/** + * The generated image in JPEG format + */ +type Ai_Cf_Leonardo_Phoenix_1_0_Output = string; +declare abstract class Base_Ai_Cf_Leonardo_Phoenix_1_0 { + inputs: Ai_Cf_Leonardo_Phoenix_1_0_Input; + postProcessedOutputs: Ai_Cf_Leonardo_Phoenix_1_0_Output; +} +interface Ai_Cf_Leonardo_Lucid_Origin_Input { + /** + * A text description of the image you want to generate. + */ + prompt: string; + /** + * Controls how closely the generated image should adhere to the prompt; higher values make the image more aligned with the prompt + */ + guidance?: number; + /** + * Random seed for reproducibility of the image generation + */ + seed?: number; + /** + * The height of the generated image in pixels + */ + height?: number; + /** + * The width of the generated image in pixels + */ + width?: number; + /** + * The number of diffusion steps; higher values can improve quality but take longer + */ + num_steps?: number; + /** + * The number of diffusion steps; higher values can improve quality but take longer + */ + steps?: number; +} +interface Ai_Cf_Leonardo_Lucid_Origin_Output { + /** + * The generated image in Base64 format. + */ + image?: string; +} +declare abstract class Base_Ai_Cf_Leonardo_Lucid_Origin { + inputs: Ai_Cf_Leonardo_Lucid_Origin_Input; + postProcessedOutputs: Ai_Cf_Leonardo_Lucid_Origin_Output; +} +interface Ai_Cf_Deepgram_Aura_1_Input { + /** + * Speaker used to produce the audio. + */ + speaker?: "angus" | "asteria" | "arcas" | "orion" | "orpheus" | "athena" | "luna" | "zeus" | "perseus" | "helios" | "hera" | "stella"; + /** + * Encoding of the output audio. + */ + encoding?: "linear16" | "flac" | "mulaw" | "alaw" | "mp3" | "opus" | "aac"; + /** + * Container specifies the file format wrapper for the output audio. The available options depend on the encoding type.. + */ + container?: "none" | "wav" | "ogg"; + /** + * The text content to be converted to speech + */ + text: string; + /** + * Sample Rate specifies the sample rate for the output audio. Based on the encoding, different sample rates are supported. For some encodings, the sample rate is not configurable + */ + sample_rate?: number; + /** + * The bitrate of the audio in bits per second. Choose from predefined ranges or specific values based on the encoding type. + */ + bit_rate?: number; +} +/** + * The generated audio in MP3 format + */ +type Ai_Cf_Deepgram_Aura_1_Output = string; +declare abstract class Base_Ai_Cf_Deepgram_Aura_1 { + inputs: Ai_Cf_Deepgram_Aura_1_Input; + postProcessedOutputs: Ai_Cf_Deepgram_Aura_1_Output; +} +interface Ai_Cf_Ai4Bharat_Indictrans2_En_Indic_1B_Input { + /** + * Input text to translate. Can be a single string or a list of strings. + */ + text: string | string[]; + /** + * Target langauge to translate to + */ + target_language: "asm_Beng" | "awa_Deva" | "ben_Beng" | "bho_Deva" | "brx_Deva" | "doi_Deva" | "eng_Latn" | "gom_Deva" | "gon_Deva" | "guj_Gujr" | "hin_Deva" | "hne_Deva" | "kan_Knda" | "kas_Arab" | "kas_Deva" | "kha_Latn" | "lus_Latn" | "mag_Deva" | "mai_Deva" | "mal_Mlym" | "mar_Deva" | "mni_Beng" | "mni_Mtei" | "npi_Deva" | "ory_Orya" | "pan_Guru" | "san_Deva" | "sat_Olck" | "snd_Arab" | "snd_Deva" | "tam_Taml" | "tel_Telu" | "urd_Arab" | "unr_Deva"; +} +interface Ai_Cf_Ai4Bharat_Indictrans2_En_Indic_1B_Output { + /** + * Translated texts + */ + translations: string[]; +} +declare abstract class Base_Ai_Cf_Ai4Bharat_Indictrans2_En_Indic_1B { + inputs: Ai_Cf_Ai4Bharat_Indictrans2_En_Indic_1B_Input; + postProcessedOutputs: Ai_Cf_Ai4Bharat_Indictrans2_En_Indic_1B_Output; +} +type Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_Input = Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_Prompt | Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_Messages | Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_Async_Batch; +interface Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_Prompt { + /** + * The input text prompt for the model to generate a response. + */ + prompt: string; + /** + * Name of the LoRA (Low-Rank Adaptation) model to fine-tune the base model. + */ + lora?: string; + response_format?: Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_JSON_Mode; + /** + * If true, a chat template is not applied and you must adhere to the specific model's expected formatting. + */ + raw?: boolean; + /** + * If true, the response will be streamed back incrementally using SSE, Server Sent Events. + */ + stream?: boolean; + /** + * The maximum number of tokens to generate in the response. + */ + max_tokens?: number; + /** + * Controls the randomness of the output; higher values produce more random results. + */ + temperature?: number; + /** + * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses. + */ + top_p?: number; + /** + * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises. + */ + top_k?: number; + /** + * Random seed for reproducibility of the generation. + */ + seed?: number; + /** + * Penalty for repeated tokens; higher values discourage repetition. + */ + repetition_penalty?: number; + /** + * Decreases the likelihood of the model repeating the same lines verbatim. + */ + frequency_penalty?: number; + /** + * Increases the likelihood of the model introducing new topics. + */ + presence_penalty?: number; +} +interface Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_JSON_Mode { + type?: "json_object" | "json_schema"; + json_schema?: unknown; +} +interface Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_Messages { + /** + * An array of message objects representing the conversation history. + */ + messages: { + /** + * The role of the message sender (e.g., 'user', 'assistant', 'system', 'tool'). + */ + role: string; + content: string | { + /** + * Type of the content (text) + */ + type?: string; + /** + * Text content + */ + text?: string; + }[]; + }[]; + functions?: { + name: string; + code: string; + }[]; + /** + * A list of tools available for the assistant to use. + */ + tools?: ({ + /** + * The name of the tool. More descriptive the better. + */ + name: string; + /** + * A brief description of what the tool does. + */ + description: string; + /** + * Schema defining the parameters accepted by the tool. + */ + parameters: { + /** + * The type of the parameters object (usually 'object'). + */ + type: string; + /** + * List of required parameter names. + */ + required?: string[]; + /** + * Definitions of each parameter. + */ + properties: { + [k: string]: { + /** + * The data type of the parameter. + */ + type: string; + /** + * A description of the expected parameter. + */ + description: string; + }; + }; + }; + } | { + /** + * Specifies the type of tool (e.g., 'function'). + */ + type: string; + /** + * Details of the function tool. + */ + function: { + /** + * The name of the function. + */ + name: string; + /** + * A brief description of what the function does. + */ + description: string; + /** + * Schema defining the parameters accepted by the function. + */ + parameters: { + /** + * The type of the parameters object (usually 'object'). + */ + type: string; + /** + * List of required parameter names. + */ + required?: string[]; + /** + * Definitions of each parameter. + */ + properties: { + [k: string]: { + /** + * The data type of the parameter. + */ + type: string; + /** + * A description of the expected parameter. + */ + description: string; + }; + }; + }; + }; + })[]; + response_format?: Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_JSON_Mode_1; + /** + * If true, a chat template is not applied and you must adhere to the specific model's expected formatting. + */ + raw?: boolean; + /** + * If true, the response will be streamed back incrementally using SSE, Server Sent Events. + */ + stream?: boolean; + /** + * The maximum number of tokens to generate in the response. + */ + max_tokens?: number; + /** + * Controls the randomness of the output; higher values produce more random results. + */ + temperature?: number; + /** + * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses. + */ + top_p?: number; + /** + * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises. + */ + top_k?: number; + /** + * Random seed for reproducibility of the generation. + */ + seed?: number; + /** + * Penalty for repeated tokens; higher values discourage repetition. + */ + repetition_penalty?: number; + /** + * Decreases the likelihood of the model repeating the same lines verbatim. + */ + frequency_penalty?: number; + /** + * Increases the likelihood of the model introducing new topics. + */ + presence_penalty?: number; +} +interface Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_JSON_Mode_1 { + type?: "json_object" | "json_schema"; + json_schema?: unknown; +} +interface Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_Async_Batch { + requests: (Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_Prompt_1 | Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_Messages_1)[]; +} +interface Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_Prompt_1 { + /** + * The input text prompt for the model to generate a response. + */ + prompt: string; + /** + * Name of the LoRA (Low-Rank Adaptation) model to fine-tune the base model. + */ + lora?: string; + response_format?: Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_JSON_Mode_2; + /** + * If true, a chat template is not applied and you must adhere to the specific model's expected formatting. + */ + raw?: boolean; + /** + * If true, the response will be streamed back incrementally using SSE, Server Sent Events. + */ + stream?: boolean; + /** + * The maximum number of tokens to generate in the response. + */ + max_tokens?: number; + /** + * Controls the randomness of the output; higher values produce more random results. + */ + temperature?: number; + /** + * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses. + */ + top_p?: number; + /** + * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises. + */ + top_k?: number; + /** + * Random seed for reproducibility of the generation. + */ + seed?: number; + /** + * Penalty for repeated tokens; higher values discourage repetition. + */ + repetition_penalty?: number; + /** + * Decreases the likelihood of the model repeating the same lines verbatim. + */ + frequency_penalty?: number; + /** + * Increases the likelihood of the model introducing new topics. + */ + presence_penalty?: number; +} +interface Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_JSON_Mode_2 { + type?: "json_object" | "json_schema"; + json_schema?: unknown; +} +interface Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_Messages_1 { + /** + * An array of message objects representing the conversation history. + */ + messages: { + /** + * The role of the message sender (e.g., 'user', 'assistant', 'system', 'tool'). + */ + role: string; + content: string | { + /** + * Type of the content (text) + */ + type?: string; + /** + * Text content + */ + text?: string; + }[]; + }[]; + functions?: { + name: string; + code: string; + }[]; + /** + * A list of tools available for the assistant to use. + */ + tools?: ({ + /** + * The name of the tool. More descriptive the better. + */ + name: string; + /** + * A brief description of what the tool does. + */ + description: string; + /** + * Schema defining the parameters accepted by the tool. + */ + parameters: { + /** + * The type of the parameters object (usually 'object'). + */ + type: string; + /** + * List of required parameter names. + */ + required?: string[]; + /** + * Definitions of each parameter. + */ + properties: { + [k: string]: { + /** + * The data type of the parameter. + */ + type: string; + /** + * A description of the expected parameter. + */ + description: string; + }; + }; + }; + } | { + /** + * Specifies the type of tool (e.g., 'function'). + */ + type: string; + /** + * Details of the function tool. + */ + function: { + /** + * The name of the function. + */ + name: string; + /** + * A brief description of what the function does. + */ + description: string; + /** + * Schema defining the parameters accepted by the function. + */ + parameters: { + /** + * The type of the parameters object (usually 'object'). + */ + type: string; + /** + * List of required parameter names. + */ + required?: string[]; + /** + * Definitions of each parameter. + */ + properties: { + [k: string]: { + /** + * The data type of the parameter. + */ + type: string; + /** + * A description of the expected parameter. + */ + description: string; + }; + }; + }; + }; + })[]; + response_format?: Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_JSON_Mode_3; + /** + * If true, a chat template is not applied and you must adhere to the specific model's expected formatting. + */ + raw?: boolean; + /** + * If true, the response will be streamed back incrementally using SSE, Server Sent Events. + */ + stream?: boolean; + /** + * The maximum number of tokens to generate in the response. + */ + max_tokens?: number; + /** + * Controls the randomness of the output; higher values produce more random results. + */ + temperature?: number; + /** + * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses. + */ + top_p?: number; + /** + * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises. + */ + top_k?: number; + /** + * Random seed for reproducibility of the generation. + */ + seed?: number; + /** + * Penalty for repeated tokens; higher values discourage repetition. + */ + repetition_penalty?: number; + /** + * Decreases the likelihood of the model repeating the same lines verbatim. + */ + frequency_penalty?: number; + /** + * Increases the likelihood of the model introducing new topics. + */ + presence_penalty?: number; +} +interface Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_JSON_Mode_3 { + type?: "json_object" | "json_schema"; + json_schema?: unknown; +} +type Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_Output = Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_Chat_Completion_Response | Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_Text_Completion_Response | string | Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_AsyncResponse; +interface Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_Chat_Completion_Response { + /** + * Unique identifier for the completion + */ + id?: string; + /** + * Object type identifier + */ + object?: "chat.completion"; + /** + * Unix timestamp of when the completion was created + */ + created?: number; + /** + * Model used for the completion + */ + model?: string; + /** + * List of completion choices + */ + choices?: { + /** + * Index of the choice in the list + */ + index?: number; + /** + * The message generated by the model + */ + message?: { + /** + * Role of the message author + */ + role: string; + /** + * The content of the message + */ + content: string; + /** + * Internal reasoning content (if available) + */ + reasoning_content?: string; + /** + * Tool calls made by the assistant + */ + tool_calls?: { + /** + * Unique identifier for the tool call + */ + id: string; + /** + * Type of tool call + */ + type: "function"; + function: { + /** + * Name of the function to call + */ + name: string; + /** + * JSON string of arguments for the function + */ + arguments: string; + }; + }[]; + }; + /** + * Reason why the model stopped generating + */ + finish_reason?: string; + /** + * Stop reason (may be null) + */ + stop_reason?: string | null; + /** + * Log probabilities (if requested) + */ + logprobs?: {} | null; + }[]; + /** + * Usage statistics for the inference request + */ + usage?: { + /** + * Total number of tokens in input + */ + prompt_tokens?: number; + /** + * Total number of tokens in output + */ + completion_tokens?: number; + /** + * Total number of input and output tokens + */ + total_tokens?: number; + }; + /** + * Log probabilities for the prompt (if requested) + */ + prompt_logprobs?: {} | null; +} +interface Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_Text_Completion_Response { + /** + * Unique identifier for the completion + */ + id?: string; + /** + * Object type identifier + */ + object?: "text_completion"; + /** + * Unix timestamp of when the completion was created + */ + created?: number; + /** + * Model used for the completion + */ + model?: string; + /** + * List of completion choices + */ + choices?: { + /** + * Index of the choice in the list + */ + index: number; + /** + * The generated text completion + */ + text: string; + /** + * Reason why the model stopped generating + */ + finish_reason: string; + /** + * Stop reason (may be null) + */ + stop_reason?: string | null; + /** + * Log probabilities (if requested) + */ + logprobs?: {} | null; + /** + * Log probabilities for the prompt (if requested) + */ + prompt_logprobs?: {} | null; + }[]; + /** + * Usage statistics for the inference request + */ + usage?: { + /** + * Total number of tokens in input + */ + prompt_tokens?: number; + /** + * Total number of tokens in output + */ + completion_tokens?: number; + /** + * Total number of input and output tokens + */ + total_tokens?: number; + }; +} +interface Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_AsyncResponse { + /** + * The async request id that can be used to obtain the results. + */ + request_id?: string; +} +declare abstract class Base_Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It { + inputs: Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_Input; + postProcessedOutputs: Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_Output; +} +interface Ai_Cf_Pfnet_Plamo_Embedding_1B_Input { + /** + * Input text to embed. Can be a single string or a list of strings. + */ + text: string | string[]; +} +interface Ai_Cf_Pfnet_Plamo_Embedding_1B_Output { + /** + * Embedding vectors, where each vector is a list of floats. + */ + data: number[][]; + /** + * Shape of the embedding data as [number_of_embeddings, embedding_dimension]. + * + * @minItems 2 + * @maxItems 2 + */ + shape: [ + number, + number + ]; +} +declare abstract class Base_Ai_Cf_Pfnet_Plamo_Embedding_1B { + inputs: Ai_Cf_Pfnet_Plamo_Embedding_1B_Input; + postProcessedOutputs: Ai_Cf_Pfnet_Plamo_Embedding_1B_Output; +} +interface Ai_Cf_Deepgram_Flux_Input { + /** + * Encoding of the audio stream. Currently only supports raw signed little-endian 16-bit PCM. + */ + encoding: "linear16"; + /** + * Sample rate of the audio stream in Hz. + */ + sample_rate: string; + /** + * End-of-turn confidence required to fire an eager end-of-turn event. When set, enables EagerEndOfTurn and TurnResumed events. Valid Values 0.3 - 0.9. + */ + eager_eot_threshold?: string; + /** + * End-of-turn confidence required to finish a turn. Valid Values 0.5 - 0.9. + */ + eot_threshold?: string; + /** + * A turn will be finished when this much time has passed after speech, regardless of EOT confidence. + */ + eot_timeout_ms?: string; + /** + * Keyterm prompting can improve recognition of specialized terminology. Pass multiple keyterm query parameters to boost multiple keyterms. + */ + keyterm?: string; + /** + * Opts out requests from the Deepgram Model Improvement Program. Refer to Deepgram Docs for pricing impacts before setting this to true. https://dpgr.am/deepgram-mip + */ + mip_opt_out?: "true" | "false"; + /** + * Label your requests for the purpose of identification during usage reporting + */ + tag?: string; +} +/** + * Output will be returned as websocket messages. + */ +interface Ai_Cf_Deepgram_Flux_Output { + /** + * The unique identifier of the request (uuid) + */ + request_id?: string; + /** + * Starts at 0 and increments for each message the server sends to the client. + */ + sequence_id?: number; + /** + * The type of event being reported. + */ + event?: "Update" | "StartOfTurn" | "EagerEndOfTurn" | "TurnResumed" | "EndOfTurn"; + /** + * The index of the current turn + */ + turn_index?: number; + /** + * Start time in seconds of the audio range that was transcribed + */ + audio_window_start?: number; + /** + * End time in seconds of the audio range that was transcribed + */ + audio_window_end?: number; + /** + * Text that was said over the course of the current turn + */ + transcript?: string; + /** + * The words in the transcript + */ + words?: { + /** + * The individual punctuated, properly-cased word from the transcript + */ + word: string; + /** + * Confidence that this word was transcribed correctly + */ + confidence: number; + }[]; + /** + * Confidence that no more speech is coming in this turn + */ + end_of_turn_confidence?: number; +} +declare abstract class Base_Ai_Cf_Deepgram_Flux { + inputs: Ai_Cf_Deepgram_Flux_Input; + postProcessedOutputs: Ai_Cf_Deepgram_Flux_Output; +} +interface Ai_Cf_Deepgram_Aura_2_En_Input { + /** + * Speaker used to produce the audio. + */ + speaker?: "amalthea" | "andromeda" | "apollo" | "arcas" | "aries" | "asteria" | "athena" | "atlas" | "aurora" | "callista" | "cora" | "cordelia" | "delia" | "draco" | "electra" | "harmonia" | "helena" | "hera" | "hermes" | "hyperion" | "iris" | "janus" | "juno" | "jupiter" | "luna" | "mars" | "minerva" | "neptune" | "odysseus" | "ophelia" | "orion" | "orpheus" | "pandora" | "phoebe" | "pluto" | "saturn" | "thalia" | "theia" | "vesta" | "zeus"; + /** + * Encoding of the output audio. + */ + encoding?: "linear16" | "flac" | "mulaw" | "alaw" | "mp3" | "opus" | "aac"; + /** + * Container specifies the file format wrapper for the output audio. The available options depend on the encoding type.. + */ + container?: "none" | "wav" | "ogg"; + /** + * The text content to be converted to speech + */ + text: string; + /** + * Sample Rate specifies the sample rate for the output audio. Based on the encoding, different sample rates are supported. For some encodings, the sample rate is not configurable + */ + sample_rate?: number; + /** + * The bitrate of the audio in bits per second. Choose from predefined ranges or specific values based on the encoding type. + */ + bit_rate?: number; +} +/** + * The generated audio in MP3 format + */ +type Ai_Cf_Deepgram_Aura_2_En_Output = string; +declare abstract class Base_Ai_Cf_Deepgram_Aura_2_En { + inputs: Ai_Cf_Deepgram_Aura_2_En_Input; + postProcessedOutputs: Ai_Cf_Deepgram_Aura_2_En_Output; +} +interface Ai_Cf_Deepgram_Aura_2_Es_Input { + /** + * Speaker used to produce the audio. + */ + speaker?: "sirio" | "nestor" | "carina" | "celeste" | "alvaro" | "diana" | "aquila" | "selena" | "estrella" | "javier"; + /** + * Encoding of the output audio. + */ + encoding?: "linear16" | "flac" | "mulaw" | "alaw" | "mp3" | "opus" | "aac"; + /** + * Container specifies the file format wrapper for the output audio. The available options depend on the encoding type.. + */ + container?: "none" | "wav" | "ogg"; + /** + * The text content to be converted to speech + */ + text: string; + /** + * Sample Rate specifies the sample rate for the output audio. Based on the encoding, different sample rates are supported. For some encodings, the sample rate is not configurable + */ + sample_rate?: number; + /** + * The bitrate of the audio in bits per second. Choose from predefined ranges or specific values based on the encoding type. + */ + bit_rate?: number; +} +/** + * The generated audio in MP3 format + */ +type Ai_Cf_Deepgram_Aura_2_Es_Output = string; +declare abstract class Base_Ai_Cf_Deepgram_Aura_2_Es { + inputs: Ai_Cf_Deepgram_Aura_2_Es_Input; + postProcessedOutputs: Ai_Cf_Deepgram_Aura_2_Es_Output; +} +interface Ai_Cf_Black_Forest_Labs_Flux_2_Dev_Input { + multipart: { + body?: object; + contentType?: string; + }; +} +interface Ai_Cf_Black_Forest_Labs_Flux_2_Dev_Output { + /** + * Generated image as Base64 string. + */ + image?: string; +} +declare abstract class Base_Ai_Cf_Black_Forest_Labs_Flux_2_Dev { + inputs: Ai_Cf_Black_Forest_Labs_Flux_2_Dev_Input; + postProcessedOutputs: Ai_Cf_Black_Forest_Labs_Flux_2_Dev_Output; +} +interface Ai_Cf_Black_Forest_Labs_Flux_2_Klein_4B_Input { + multipart: { + body?: object; + contentType?: string; + }; +} +interface Ai_Cf_Black_Forest_Labs_Flux_2_Klein_4B_Output { + /** + * Generated image as Base64 string. + */ + image?: string; +} +declare abstract class Base_Ai_Cf_Black_Forest_Labs_Flux_2_Klein_4B { + inputs: Ai_Cf_Black_Forest_Labs_Flux_2_Klein_4B_Input; + postProcessedOutputs: Ai_Cf_Black_Forest_Labs_Flux_2_Klein_4B_Output; +} +interface Ai_Cf_Black_Forest_Labs_Flux_2_Klein_9B_Input { + multipart: { + body?: object; + contentType?: string; + }; +} +interface Ai_Cf_Black_Forest_Labs_Flux_2_Klein_9B_Output { + /** + * Generated image as Base64 string. + */ + image?: string; +} +declare abstract class Base_Ai_Cf_Black_Forest_Labs_Flux_2_Klein_9B { + inputs: Ai_Cf_Black_Forest_Labs_Flux_2_Klein_9B_Input; + postProcessedOutputs: Ai_Cf_Black_Forest_Labs_Flux_2_Klein_9B_Output; +} +declare abstract class Base_Ai_Cf_Zai_Org_Glm_4_7_Flash { + inputs: ChatCompletionsInput; + postProcessedOutputs: ChatCompletionsOutput; +} +declare abstract class Base_Ai_Cf_Moonshotai_Kimi_K2_5 { + inputs: ChatCompletionsInput; + postProcessedOutputs: ChatCompletionsOutput; +} +declare abstract class Base_Ai_Cf_Nvidia_Nemotron_3_120B_A12B { + inputs: ChatCompletionsInput; + postProcessedOutputs: ChatCompletionsOutput; +} +declare abstract class Base_Ai_Cf_Google_Gemma_4_26B_A4B_IT { + inputs: ChatCompletionsInput; + postProcessedOutputs: ChatCompletionsOutput; +} +interface AiModels { + "@cf/huggingface/distilbert-sst-2-int8": BaseAiTextClassification; + "@cf/stabilityai/stable-diffusion-xl-base-1.0": BaseAiTextToImage; + "@cf/runwayml/stable-diffusion-v1-5-inpainting": BaseAiTextToImage; + "@cf/runwayml/stable-diffusion-v1-5-img2img": BaseAiTextToImage; + "@cf/lykon/dreamshaper-8-lcm": BaseAiTextToImage; + "@cf/bytedance/stable-diffusion-xl-lightning": BaseAiTextToImage; + "@cf/myshell-ai/melotts": BaseAiTextToSpeech; + "@cf/google/embeddinggemma-300m": BaseAiTextEmbeddings; + "@cf/microsoft/resnet-50": BaseAiImageClassification; + "@cf/meta/llama-2-7b-chat-int8": BaseAiTextGeneration; + "@cf/mistral/mistral-7b-instruct-v0.1": BaseAiTextGeneration; + "@cf/meta/llama-2-7b-chat-fp16": BaseAiTextGeneration; + "@hf/thebloke/llama-2-13b-chat-awq": BaseAiTextGeneration; + "@hf/thebloke/mistral-7b-instruct-v0.1-awq": BaseAiTextGeneration; + "@hf/thebloke/zephyr-7b-beta-awq": BaseAiTextGeneration; + "@hf/thebloke/openhermes-2.5-mistral-7b-awq": BaseAiTextGeneration; + "@hf/thebloke/neural-chat-7b-v3-1-awq": BaseAiTextGeneration; + "@hf/thebloke/deepseek-coder-6.7b-base-awq": BaseAiTextGeneration; + "@hf/thebloke/deepseek-coder-6.7b-instruct-awq": BaseAiTextGeneration; + "@cf/deepseek-ai/deepseek-math-7b-instruct": BaseAiTextGeneration; + "@cf/defog/sqlcoder-7b-2": BaseAiTextGeneration; + "@cf/openchat/openchat-3.5-0106": BaseAiTextGeneration; + "@cf/tiiuae/falcon-7b-instruct": BaseAiTextGeneration; + "@cf/thebloke/discolm-german-7b-v1-awq": BaseAiTextGeneration; + "@cf/qwen/qwen1.5-0.5b-chat": BaseAiTextGeneration; + "@cf/qwen/qwen1.5-7b-chat-awq": BaseAiTextGeneration; + "@cf/qwen/qwen1.5-14b-chat-awq": BaseAiTextGeneration; + "@cf/tinyllama/tinyllama-1.1b-chat-v1.0": BaseAiTextGeneration; + "@cf/microsoft/phi-2": BaseAiTextGeneration; + "@cf/qwen/qwen1.5-1.8b-chat": BaseAiTextGeneration; + "@cf/mistral/mistral-7b-instruct-v0.2-lora": BaseAiTextGeneration; + "@hf/nousresearch/hermes-2-pro-mistral-7b": BaseAiTextGeneration; + "@hf/nexusflow/starling-lm-7b-beta": BaseAiTextGeneration; + "@hf/google/gemma-7b-it": BaseAiTextGeneration; + "@cf/meta-llama/llama-2-7b-chat-hf-lora": BaseAiTextGeneration; + "@cf/google/gemma-2b-it-lora": BaseAiTextGeneration; + "@cf/google/gemma-7b-it-lora": BaseAiTextGeneration; + "@hf/mistral/mistral-7b-instruct-v0.2": BaseAiTextGeneration; + "@cf/meta/llama-3-8b-instruct": BaseAiTextGeneration; + "@cf/fblgit/una-cybertron-7b-v2-bf16": BaseAiTextGeneration; + "@cf/meta/llama-3-8b-instruct-awq": BaseAiTextGeneration; + "@cf/meta/llama-3.1-8b-instruct-fp8": BaseAiTextGeneration; + "@cf/meta/llama-3.1-8b-instruct-awq": BaseAiTextGeneration; + "@cf/meta/llama-3.2-3b-instruct": BaseAiTextGeneration; + "@cf/meta/llama-3.2-1b-instruct": BaseAiTextGeneration; + "@cf/deepseek-ai/deepseek-r1-distill-qwen-32b": BaseAiTextGeneration; + "@cf/ibm-granite/granite-4.0-h-micro": BaseAiTextGeneration; + "@cf/facebook/bart-large-cnn": BaseAiSummarization; + "@cf/llava-hf/llava-1.5-7b-hf": BaseAiImageToText; + "@cf/baai/bge-base-en-v1.5": Base_Ai_Cf_Baai_Bge_Base_En_V1_5; + "@cf/openai/whisper": Base_Ai_Cf_Openai_Whisper; + "@cf/meta/m2m100-1.2b": Base_Ai_Cf_Meta_M2M100_1_2B; + "@cf/baai/bge-small-en-v1.5": Base_Ai_Cf_Baai_Bge_Small_En_V1_5; + "@cf/baai/bge-large-en-v1.5": Base_Ai_Cf_Baai_Bge_Large_En_V1_5; + "@cf/unum/uform-gen2-qwen-500m": Base_Ai_Cf_Unum_Uform_Gen2_Qwen_500M; + "@cf/openai/whisper-tiny-en": Base_Ai_Cf_Openai_Whisper_Tiny_En; + "@cf/openai/whisper-large-v3-turbo": Base_Ai_Cf_Openai_Whisper_Large_V3_Turbo; + "@cf/baai/bge-m3": Base_Ai_Cf_Baai_Bge_M3; + "@cf/black-forest-labs/flux-1-schnell": Base_Ai_Cf_Black_Forest_Labs_Flux_1_Schnell; + "@cf/meta/llama-3.2-11b-vision-instruct": Base_Ai_Cf_Meta_Llama_3_2_11B_Vision_Instruct; + "@cf/meta/llama-3.3-70b-instruct-fp8-fast": Base_Ai_Cf_Meta_Llama_3_3_70B_Instruct_Fp8_Fast; + "@cf/meta/llama-guard-3-8b": Base_Ai_Cf_Meta_Llama_Guard_3_8B; + "@cf/baai/bge-reranker-base": Base_Ai_Cf_Baai_Bge_Reranker_Base; + "@cf/qwen/qwen2.5-coder-32b-instruct": Base_Ai_Cf_Qwen_Qwen2_5_Coder_32B_Instruct; + "@cf/qwen/qwq-32b": Base_Ai_Cf_Qwen_Qwq_32B; + "@cf/mistralai/mistral-small-3.1-24b-instruct": Base_Ai_Cf_Mistralai_Mistral_Small_3_1_24B_Instruct; + "@cf/google/gemma-3-12b-it": Base_Ai_Cf_Google_Gemma_3_12B_It; + "@cf/meta/llama-4-scout-17b-16e-instruct": Base_Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct; + "@cf/qwen/qwen3-30b-a3b-fp8": Base_Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8; + "@cf/deepgram/nova-3": Base_Ai_Cf_Deepgram_Nova_3; + "@cf/qwen/qwen3-embedding-0.6b": Base_Ai_Cf_Qwen_Qwen3_Embedding_0_6B; + "@cf/pipecat-ai/smart-turn-v2": Base_Ai_Cf_Pipecat_Ai_Smart_Turn_V2; + "@cf/openai/gpt-oss-120b": Base_Ai_Cf_Openai_Gpt_Oss_120B; + "@cf/openai/gpt-oss-20b": Base_Ai_Cf_Openai_Gpt_Oss_20B; + "@cf/leonardo/phoenix-1.0": Base_Ai_Cf_Leonardo_Phoenix_1_0; + "@cf/leonardo/lucid-origin": Base_Ai_Cf_Leonardo_Lucid_Origin; + "@cf/deepgram/aura-1": Base_Ai_Cf_Deepgram_Aura_1; + "@cf/ai4bharat/indictrans2-en-indic-1B": Base_Ai_Cf_Ai4Bharat_Indictrans2_En_Indic_1B; + "@cf/aisingapore/gemma-sea-lion-v4-27b-it": Base_Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It; + "@cf/pfnet/plamo-embedding-1b": Base_Ai_Cf_Pfnet_Plamo_Embedding_1B; + "@cf/deepgram/flux": Base_Ai_Cf_Deepgram_Flux; + "@cf/deepgram/aura-2-en": Base_Ai_Cf_Deepgram_Aura_2_En; + "@cf/deepgram/aura-2-es": Base_Ai_Cf_Deepgram_Aura_2_Es; + "@cf/black-forest-labs/flux-2-dev": Base_Ai_Cf_Black_Forest_Labs_Flux_2_Dev; + "@cf/black-forest-labs/flux-2-klein-4b": Base_Ai_Cf_Black_Forest_Labs_Flux_2_Klein_4B; + "@cf/black-forest-labs/flux-2-klein-9b": Base_Ai_Cf_Black_Forest_Labs_Flux_2_Klein_9B; + "@cf/zai-org/glm-4.7-flash": Base_Ai_Cf_Zai_Org_Glm_4_7_Flash; + "@cf/moonshotai/kimi-k2.5": Base_Ai_Cf_Moonshotai_Kimi_K2_5; + "@cf/nvidia/nemotron-3-120b-a12b": Base_Ai_Cf_Nvidia_Nemotron_3_120B_A12B; +} +type AiOptions = { + /** + * Send requests as an asynchronous batch job, only works for supported models + * https://developers.cloudflare.com/workers-ai/features/batch-api + */ + queueRequest?: boolean; + /** + * Establish websocket connections, only works for supported models + */ + websocket?: boolean; + /** + * Tag your requests to group and view them in Cloudflare dashboard. + * + * Rules: + * Tags must only contain letters, numbers, and the symbols: : - . / @ + * Each tag can have maximum 50 characters. + * Maximum 5 tags are allowed each request. + * Duplicate tags will removed. + */ + tags?: string[]; + gateway?: GatewayOptions; + returnRawResponse?: boolean; + prefix?: string; + extraHeaders?: object; + signal?: AbortSignal; +}; +type AiModelsSearchParams = { + author?: string; + hide_experimental?: boolean; + page?: number; + per_page?: number; + search?: string; + source?: number; + task?: string; +}; +type AiModelsSearchObject = { + id: string; + source: number; + name: string; + description: string; + task: { + id: string; + name: string; + description: string; + }; + tags: string[]; + properties: { + property_id: string; + value: string; + }[]; +}; +type ChatCompletionsBase = XOR; +type ChatCompletionsInput = XOR; +interface InferenceUpstreamError extends Error { +} +interface AiInternalError extends Error { +} +type AiModelListType = Record; +type AiAsyncBatchResponse = { + request_id: string; +}; +declare abstract class Ai { + aiGatewayLogId: string | null; + gateway(gatewayId: string): AiGateway; + /** + * @deprecated Use the standalone `ai_search_namespaces` or `ai_search` Workers bindings instead. + * See https://developers.cloudflare.com/ai-search/usage/workers-binding/ + */ + aiSearch(): AiSearchNamespace; + /** + * @deprecated AutoRAG has been replaced by AI Search. + * Use the standalone `ai_search_namespaces` or `ai_search` Workers bindings instead. + * See https://developers.cloudflare.com/ai-search/usage/workers-binding/ + * + * @param autoragId Instance ID + */ + autorag(autoragId: string): AutoRAG; + // Batch request + run(model: Name, inputs: { + requests: AiModelList[Name]['inputs'][]; + }, options: AiOptions & { + queueRequest: true; + }): Promise; + // Raw response + run(model: Name, inputs: AiModelList[Name]['inputs'], options: AiOptions & { + returnRawResponse: true; + }): Promise; + // WebSocket + run(model: Name, inputs: AiModelList[Name]['inputs'], options: AiOptions & { + websocket: true; + }): Promise; + // Streaming + run(model: Name, inputs: AiModelList[Name]['inputs'] & { + stream: true; + }, options?: AiOptions): Promise; + // Normal (default) - known model + run(model: Name, inputs: AiModelList[Name]['inputs'], options?: AiOptions): Promise; + // Unknown model (gateway fallback) + run(model: string & {}, inputs: Record, options?: AiOptions): Promise>; + models(params?: AiModelsSearchParams): Promise; + toMarkdown(): ToMarkdownService; + toMarkdown(files: MarkdownDocument[], options?: ConversionRequestOptions): Promise; + toMarkdown(files: MarkdownDocument, options?: ConversionRequestOptions): Promise; +} +type GatewayRetries = { + maxAttempts?: 1 | 2 | 3 | 4 | 5; + retryDelayMs?: number; + backoff?: 'constant' | 'linear' | 'exponential'; +}; +type GatewayOptions = { + id: string; + cacheKey?: string; + cacheTtl?: number; + skipCache?: boolean; + metadata?: Record; + collectLog?: boolean; + eventId?: string; + requestTimeoutMs?: number; + retries?: GatewayRetries; +}; +type UniversalGatewayOptions = Exclude & { + /** + ** @deprecated + */ + id?: string; +}; +type AiGatewayPatchLog = { + score?: number | null; + feedback?: -1 | 1 | null; + metadata?: Record | null; +}; +type AiGatewayLog = { + id: string; + provider: string; + model: string; + model_type?: string; + path: string; + duration: number; + request_type?: string; + request_content_type?: string; + status_code: number; + response_content_type?: string; + success: boolean; + cached: boolean; + tokens_in?: number; + tokens_out?: number; + metadata?: Record; + step?: number; + cost?: number; + custom_cost?: boolean; + request_size: number; + request_head?: string; + request_head_complete: boolean; + response_size: number; + response_head?: string; + response_head_complete: boolean; + created_at: Date; +}; +type AIGatewayProviders = 'workers-ai' | 'anthropic' | 'aws-bedrock' | 'azure-openai' | 'google-vertex-ai' | 'huggingface' | 'openai' | 'perplexity-ai' | 'replicate' | 'groq' | 'cohere' | 'google-ai-studio' | 'mistral' | 'grok' | 'openrouter' | 'deepseek' | 'cerebras' | 'cartesia' | 'elevenlabs' | 'adobe-firefly'; +type AIGatewayHeaders = { + 'cf-aig-metadata': Record | string; + 'cf-aig-custom-cost': { + per_token_in?: number; + per_token_out?: number; + } | { + total_cost?: number; + } | string; + 'cf-aig-cache-ttl': number | string; + 'cf-aig-skip-cache': boolean | string; + 'cf-aig-cache-key': string; + 'cf-aig-event-id': string; + 'cf-aig-request-timeout': number | string; + 'cf-aig-max-attempts': number | string; + 'cf-aig-retry-delay': number | string; + 'cf-aig-backoff': string; + 'cf-aig-collect-log': boolean | string; + Authorization: string; + 'Content-Type': string; + [key: string]: string | number | boolean | object; +}; +type AIGatewayUniversalRequest = { + provider: AIGatewayProviders | string; // eslint-disable-line + endpoint: string; + headers: Partial; + query: unknown; +}; +interface AiGatewayInternalError extends Error { +} +interface AiGatewayLogNotFound extends Error { +} +declare abstract class AiGateway { + patchLog(logId: string, data: AiGatewayPatchLog): Promise; + getLog(logId: string): Promise; + run(data: AIGatewayUniversalRequest | AIGatewayUniversalRequest[], options?: { + gateway?: UniversalGatewayOptions; + extraHeaders?: object; + signal?: AbortSignal; + }): Promise; + getUrl(provider?: AIGatewayProviders | string): Promise; // eslint-disable-line +} +// Copyright (c) 2022-2025 Cloudflare, Inc. +// Licensed under the Apache 2.0 license found in the LICENSE file or at: +// https://opensource.org/licenses/Apache-2.0 +/** + * Artifacts — Git-compatible file storage on Cloudflare Workers. + * + * Provides programmatic access to create, manage, and fork repositories, + * and to issue and revoke scoped access tokens. + */ +/** Information about a repository. */ +interface ArtifactsRepoInfo { + /** Unique repository ID. */ + id: string; + /** Repository name. */ + name: string; + /** Repository description, or null if not set. */ + description: string | null; + /** Default branch name (e.g. "main"). */ + defaultBranch: string; + /** ISO 8601 creation timestamp. */ + createdAt: string; + /** ISO 8601 last-updated timestamp. */ + updatedAt: string; + /** ISO 8601 timestamp of the last push, or null if never pushed. */ + lastPushAt: string | null; + /** Fork source (e.g. "github:owner/repo", "artifacts:namespace/repo"), or null if not a fork. */ + source: string | null; + /** Whether the repository is read-only. */ + readOnly: boolean; + /** HTTPS git remote URL. */ + remote: string; +} +/** Result of creating a repository — includes the initial access token. */ +interface ArtifactsCreateRepoResult { + /** Unique repository ID. */ + id: string; + /** Repository name. */ + name: string; + /** Repository description, or null if not set. */ + description: string | null; + /** Default branch name. */ + defaultBranch: string; + /** HTTPS git remote URL. */ + remote: string; + /** Plaintext access token (only returned at creation time). */ + token: string; + /** ISO 8601 token expiry timestamp. */ + tokenExpiresAt: string; +} +/** Paginated list of repositories. */ +interface ArtifactsRepoListResult { + /** Repositories in this page (without the `remote` field). */ + repos: Omit[]; + /** Total number of repositories in the namespace. */ + total: number; + /** Cursor for the next page, if there are more results. */ + cursor?: string; +} +/** Result of creating an access token. */ +interface ArtifactsCreateTokenResult { + /** Unique token ID. */ + id: string; + /** Plaintext token (only returned at creation time). */ + plaintext: string; + /** Token scope: "read" or "write". */ + scope: 'read' | 'write'; + /** ISO 8601 token expiry timestamp. */ + expiresAt: string; +} +/** Token metadata (no plaintext). */ +interface ArtifactsTokenInfo { + /** Unique token ID. */ + id: string; + /** Token scope: "read" or "write". */ + scope: 'read' | 'write'; + /** Token state: "active", "expired", or "revoked". */ + state: 'active' | 'expired' | 'revoked'; + /** ISO 8601 creation timestamp. */ + createdAt: string; + /** ISO 8601 expiry timestamp. */ + expiresAt: string; +} +/** Paginated list of tokens for a repository. */ +interface ArtifactsTokenListResult { + /** Tokens in this page. */ + tokens: ArtifactsTokenInfo[]; + /** Total number of tokens for the repository. */ + total: number; +} +/** Handle for a single repository. Returned by Artifacts.get(). */ +interface ArtifactsRepo extends ArtifactsRepoInfo { + /** + * Create an access token for this repo. + * @param scope Token scope: "write" (default) or "read". + * @param ttl Time-to-live in seconds (default 86400, min 60, max 31536000). + */ + createToken(scope?: 'write' | 'read', ttl?: number): Promise; + /** List tokens for this repo (metadata only, no plaintext). */ + listTokens(): Promise; + /** + * Revoke a token by plaintext or ID. + * @param tokenOrId Plaintext token or token ID. + * @returns true if revoked, false if not found. + */ + revokeToken(tokenOrId: string): Promise; + // ── Fork ── + /** + * Fork this repo to a new repo. + * @param name Target repository name. + * @param opts Optional: description, readOnly flag, defaultBranchOnly (default true). + */ + fork(name: string, opts?: { + description?: string; + readOnly?: boolean; + defaultBranchOnly?: boolean; + }): Promise; +} +/** Artifacts binding — namespace-level operations. */ +interface Artifacts { + /** + * Create a new repository with an initial access token. + * @param name Repository name (alphanumeric, dots, hyphens, underscores). + * @param opts Optional: readOnly flag, description, default branch name. + * @returns Repo metadata with initial token. + */ + create(name: string, opts?: { + readOnly?: boolean; + description?: string; + setDefaultBranch?: string; + }): Promise; + /** + * Get a handle to an existing repository. + * @param name Repository name. + * @returns Repo handle. + */ + get(name: string): Promise; + /** + * Import a repository from an external git remote. + * @param params Source URL and optional branch/depth, plus target name and options. + * @returns Repo metadata with initial token. + */ + import(params: { + source: { + url: string; + branch?: string; + depth?: number; + }; + target: { + name: string; + opts?: { + description?: string; + readOnly?: boolean; + }; + }; + }): Promise; + /** + * List repositories with cursor-based pagination. + * @param opts Optional: limit (1–200, default 50), cursor for next page. + */ + list(opts?: { + limit?: number; + cursor?: string; + }): Promise; + /** + * Delete a repository and all associated tokens. + * @param name Repository name. + * @returns true if deleted, false if not found. + */ + delete(name: string): Promise; +} +/** + * @deprecated Use the standalone AI Search Workers binding instead. + * See https://developers.cloudflare.com/ai-search/usage/workers-binding/ + */ +interface AutoRAGInternalError extends Error { +} +/** + * @deprecated Use the standalone AI Search Workers binding instead. + * See https://developers.cloudflare.com/ai-search/usage/workers-binding/ + */ +interface AutoRAGNotFoundError extends Error { +} +/** + * @deprecated Use the standalone AI Search Workers binding instead. + * See https://developers.cloudflare.com/ai-search/usage/workers-binding/ + */ +interface AutoRAGUnauthorizedError extends Error { +} +/** + * @deprecated Use the standalone AI Search Workers binding instead. + * See https://developers.cloudflare.com/ai-search/usage/workers-binding/ + */ +interface AutoRAGNameNotSetError extends Error { +} +type ComparisonFilter = { + key: string; + type: 'eq' | 'ne' | 'gt' | 'gte' | 'lt' | 'lte'; + value: string | number | boolean; +}; +type CompoundFilter = { + type: 'and' | 'or'; + filters: ComparisonFilter[]; +}; +/** + * @deprecated Use the standalone AI Search Workers binding instead. + * See https://developers.cloudflare.com/ai-search/usage/workers-binding/ + */ +type AutoRagSearchRequest = { + query: string; + filters?: CompoundFilter | ComparisonFilter; + max_num_results?: number; + ranking_options?: { + ranker?: string; + score_threshold?: number; + }; + reranking?: { + enabled?: boolean; + model?: string; + }; + rewrite_query?: boolean; +}; +/** + * @deprecated Use the standalone AI Search Workers binding instead. + * See https://developers.cloudflare.com/ai-search/usage/workers-binding/ + */ +type AutoRagAiSearchRequest = AutoRagSearchRequest & { + stream?: boolean; + system_prompt?: string; +}; +/** + * @deprecated Use the standalone AI Search Workers binding instead. + * See https://developers.cloudflare.com/ai-search/usage/workers-binding/ + */ +type AutoRagAiSearchRequestStreaming = Omit & { + stream: true; +}; +/** + * @deprecated Use the standalone AI Search Workers binding instead. + * See https://developers.cloudflare.com/ai-search/usage/workers-binding/ + */ +type AutoRagSearchResponse = { + object: 'vector_store.search_results.page'; + search_query: string; + data: { + file_id: string; + filename: string; + score: number; + attributes: Record; + content: { + type: 'text'; + text: string; + }[]; + }[]; + has_more: boolean; + next_page: string | null; +}; +/** + * @deprecated Use the standalone AI Search Workers binding instead. + * See https://developers.cloudflare.com/ai-search/usage/workers-binding/ + */ +type AutoRagListResponse = { + id: string; + enable: boolean; + type: string; + source: string; + vectorize_name: string; + paused: boolean; + status: string; +}[]; +/** + * @deprecated Use the standalone AI Search Workers binding instead. + * See https://developers.cloudflare.com/ai-search/usage/workers-binding/ + */ +type AutoRagAiSearchResponse = AutoRagSearchResponse & { + response: string; +}; +/** + * @deprecated Use the standalone AI Search Workers binding instead. + * See https://developers.cloudflare.com/ai-search/usage/workers-binding/ + */ +declare abstract class AutoRAG { + /** + * @deprecated Use the standalone AI Search Workers binding instead. + * See https://developers.cloudflare.com/ai-search/usage/workers-binding/ + */ + list(): Promise; + /** + * @deprecated Use the standalone AI Search Workers binding instead. + * See https://developers.cloudflare.com/ai-search/usage/workers-binding/ + */ + search(params: AutoRagSearchRequest): Promise; + /** + * @deprecated Use the standalone AI Search Workers binding instead. + * See https://developers.cloudflare.com/ai-search/usage/workers-binding/ + */ + aiSearch(params: AutoRagAiSearchRequestStreaming): Promise; + /** + * @deprecated Use the standalone AI Search Workers binding instead. + * See https://developers.cloudflare.com/ai-search/usage/workers-binding/ + */ + aiSearch(params: AutoRagAiSearchRequest): Promise; + /** + * @deprecated Use the standalone AI Search Workers binding instead. + * See https://developers.cloudflare.com/ai-search/usage/workers-binding/ + */ + aiSearch(params: AutoRagAiSearchRequest): Promise; +} +interface BasicImageTransformations { + /** + * Maximum width in image pixels. The value must be an integer. + */ + width?: number; + /** + * Maximum height in image pixels. The value must be an integer. + */ + height?: number; + /** + * Resizing mode as a string. It affects interpretation of width and height + * options: + * - scale-down: Similar to contain, but the image is never enlarged. If + * the image is larger than given width or height, it will be resized. + * Otherwise its original size will be kept. + * - contain: Resizes to maximum size that fits within the given width and + * height. If only a single dimension is given (e.g. only width), the + * image will be shrunk or enlarged to exactly match that dimension. + * Aspect ratio is always preserved. + * - cover: Resizes (shrinks or enlarges) to fill the entire area of width + * and height. If the image has an aspect ratio different from the ratio + * of width and height, it will be cropped to fit. + * - crop: The image will be shrunk and cropped to fit within the area + * specified by width and height. The image will not be enlarged. For images + * smaller than the given dimensions it's the same as scale-down. For + * images larger than the given dimensions, it's the same as cover. + * See also trim. + * - pad: Resizes to the maximum size that fits within the given width and + * height, and then fills the remaining area with a background color + * (white by default). Use of this mode is not recommended, as the same + * effect can be more efficiently achieved with the contain mode and the + * CSS object-fit: contain property. + * - squeeze: Stretches and deforms to the width and height given, even if it + * breaks aspect ratio + */ + fit?: "scale-down" | "contain" | "cover" | "crop" | "pad" | "squeeze"; + /** + * Image segmentation using artificial intelligence models. Sets pixels not + * within selected segment area to transparent e.g "foreground" sets every + * background pixel as transparent. + */ + segment?: "foreground"; + /** + * When cropping with fit: "cover", this defines the side or point that should + * be left uncropped. The value is either a string + * "left", "right", "top", "bottom", "auto", or "center" (the default), + * or an object {x, y} containing focal point coordinates in the original + * image expressed as fractions ranging from 0.0 (top or left) to 1.0 + * (bottom or right), 0.5 being the center. {fit: "cover", gravity: "top"} will + * crop bottom or left and right sides as necessary, but won’t crop anything + * from the top. {fit: "cover", gravity: {x:0.5, y:0.2}} will crop each side to + * preserve as much as possible around a point at 20% of the height of the + * source image. + */ + gravity?: 'face' | 'left' | 'right' | 'top' | 'bottom' | 'center' | 'auto' | 'entropy' | BasicImageTransformationsGravityCoordinates; + /** + * Background color to add underneath the image. Applies only to images with + * transparency (such as PNG). Accepts any CSS color (#RRGGBB, rgba(…), + * hsl(…), etc.) + */ + background?: string; + /** + * Number of degrees (90, 180, 270) to rotate the image by. width and height + * options refer to axes after rotation. + */ + rotate?: 0 | 90 | 180 | 270 | 360; +} +interface BasicImageTransformationsGravityCoordinates { + x?: number; + y?: number; + mode?: 'remainder' | 'box-center'; +} +/** + * In addition to the properties you can set in the RequestInit dict + * that you pass as an argument to the Request constructor, you can + * set certain properties of a `cf` object to control how Cloudflare + * features are applied to that new Request. + * + * Note: Currently, these properties cannot be tested in the + * playground. + */ +interface RequestInitCfProperties extends Record { + cacheEverything?: boolean; + /** + * A request's cache key is what determines if two requests are + * "the same" for caching purposes. If a request has the same cache key + * as some previous request, then we can serve the same cached response for + * both. (e.g. 'some-key') + * + * Only available for Enterprise customers. + */ + cacheKey?: string; + /** + * This allows you to append additional Cache-Tag response headers + * to the origin response without modifications to the origin server. + * This will allow for greater control over the Purge by Cache Tag feature + * utilizing changes only in the Workers process. + * + * Only available for Enterprise customers. + */ + cacheTags?: string[]; + /** + * Force response to be cached for a given number of seconds. (e.g. 300) + */ + cacheTtl?: number; + /** + * Force response to be cached for a given number of seconds based on the Origin status code. + * (e.g. { '200-299': 86400, '404': 1, '500-599': 0 }) + */ + cacheTtlByStatus?: Record; + /** + * Explicit Cache-Control header value to set on the response stored in cache. + * This gives full control over cache directives (e.g. 'public, max-age=3600, s-maxage=86400'). + * + * Cannot be used together with `cacheTtl` or the `cache` request option (`no-store`/`no-cache`), + * as these are mutually exclusive cache control mechanisms. Setting both will throw a TypeError. + * + * Can be used together with `cacheTtlByStatus`. + */ + cacheControl?: string; + /** + * Whether the response should be eligible for Cache Reserve storage. + */ + cacheReserveEligible?: boolean; + /** + * Whether to respect strong ETags (as opposed to weak ETags) from the origin. + */ + respectStrongEtag?: boolean; + /** + * Whether to strip ETag headers from the origin response before caching. + */ + stripEtags?: boolean; + /** + * Whether to strip Last-Modified headers from the origin response before caching. + */ + stripLastModified?: boolean; + /** + * Whether to enable Cache Deception Armor, which protects against web cache + * deception attacks by verifying the Content-Type matches the URL extension. + */ + cacheDeceptionArmor?: boolean; + /** + * Minimum file size in bytes for a response to be eligible for Cache Reserve storage. + */ + cacheReserveMinimumFileSize?: number; + scrapeShield?: boolean; + apps?: boolean; + image?: RequestInitCfPropertiesImage; + minify?: RequestInitCfPropertiesImageMinify; + mirage?: boolean; + polish?: "lossy" | "lossless" | "off"; + r2?: RequestInitCfPropertiesR2; + /** + * Redirects the request to an alternate origin server. You can use this, + * for example, to implement load balancing across several origins. + * (e.g.us-east.example.com) + * + * Note - For security reasons, the hostname set in resolveOverride must + * be proxied on the same Cloudflare zone of the incoming request. + * Otherwise, the setting is ignored. CNAME hosts are allowed, so to + * resolve to a host under a different domain or a DNS only domain first + * declare a CNAME record within your own zone’s DNS mapping to the + * external hostname, set proxy on Cloudflare, then set resolveOverride + * to point to that CNAME record. + */ + resolveOverride?: string; +} +interface RequestInitCfPropertiesImageDraw extends BasicImageTransformations { + /** + * Absolute URL of the image file to use for the drawing. It can be any of + * the supported file formats. For drawing of watermarks or non-rectangular + * overlays we recommend using PNG or WebP images. + */ + url: string; + /** + * Floating-point number between 0 (transparent) and 1 (opaque). + * For example, opacity: 0.5 makes overlay semitransparent. + */ + opacity?: number; + /** + * - If set to true, the overlay image will be tiled to cover the entire + * area. This is useful for stock-photo-like watermarks. + * - If set to "x", the overlay image will be tiled horizontally only + * (form a line). + * - If set to "y", the overlay image will be tiled vertically only + * (form a line). + */ + repeat?: true | "x" | "y"; + /** + * Position of the overlay image relative to a given edge. Each property is + * an offset in pixels. 0 aligns exactly to the edge. For example, left: 10 + * positions left side of the overlay 10 pixels from the left edge of the + * image it's drawn over. bottom: 0 aligns bottom of the overlay with bottom + * of the background image. + * + * Setting both left & right, or both top & bottom is an error. + * + * If no position is specified, the image will be centered. + */ + top?: number; + left?: number; + bottom?: number; + right?: number; +} +interface RequestInitCfPropertiesImage extends BasicImageTransformations { + /** + * Device Pixel Ratio. Default 1. Multiplier for width/height that makes it + * easier to specify higher-DPI sizes in . + */ + dpr?: number; + /** + * Allows you to trim your image. Takes dpr into account and is performed before + * resizing or rotation. + * + * It can be used as: + * - left, top, right, bottom - it will specify the number of pixels to cut + * off each side + * - width, height - the width/height you'd like to end up with - can be used + * in combination with the properties above + * - border - this will automatically trim the surroundings of an image based on + * it's color. It consists of three properties: + * - color: rgb or hex representation of the color you wish to trim (todo: verify the rgba bit) + * - tolerance: difference from color to treat as color + * - keep: the number of pixels of border to keep + */ + trim?: "border" | { + top?: number; + bottom?: number; + left?: number; + right?: number; + width?: number; + height?: number; + border?: boolean | { + color?: string; + tolerance?: number; + keep?: number; + }; + }; + /** + * Quality setting from 1-100 (useful values are in 60-90 range). Lower values + * make images look worse, but load faster. The default is 85. It applies only + * to JPEG and WebP images. It doesn’t have any effect on PNG. + */ + quality?: number | "low" | "medium-low" | "medium-high" | "high"; + /** + * Output format to generate. It can be: + * - avif: generate images in AVIF format. + * - webp: generate images in Google WebP format. Set quality to 100 to get + * the WebP-lossless format. + * - json: instead of generating an image, outputs information about the + * image, in JSON format. The JSON object will contain image size + * (before and after resizing), source image’s MIME type, file size, etc. + * - jpeg: generate images in JPEG format. + * - png: generate images in PNG format. + */ + format?: "avif" | "webp" | "json" | "jpeg" | "png" | "baseline-jpeg" | "png-force" | "svg"; + /** + * Whether to preserve animation frames from input files. Default is true. + * Setting it to false reduces animations to still images. This setting is + * recommended when enlarging images or processing arbitrary user content, + * because large GIF animations can weigh tens or even hundreds of megabytes. + * It is also useful to set anim:false when using format:"json" to get the + * response quicker without the number of frames. + */ + anim?: boolean; + /** + * What EXIF data should be preserved in the output image. Note that EXIF + * rotation and embedded color profiles are always applied ("baked in" into + * the image), and aren't affected by this option. Note that if the Polish + * feature is enabled, all metadata may have been removed already and this + * option may have no effect. + * - keep: Preserve most of EXIF metadata, including GPS location if there's + * any. + * - copyright: Only keep the copyright tag, and discard everything else. + * This is the default behavior for JPEG files. + * - none: Discard all invisible EXIF metadata. Currently WebP and PNG + * output formats always discard metadata. + */ + metadata?: "keep" | "copyright" | "none"; + /** + * Strength of sharpening filter to apply to the image. Floating-point + * number between 0 (no sharpening, default) and 10 (maximum). 1.0 is a + * recommended value for downscaled images. + */ + sharpen?: number; + /** + * Radius of a blur filter (approximate gaussian). Maximum supported radius + * is 250. + */ + blur?: number; + /** + * Overlays are drawn in the order they appear in the array (last array + * entry is the topmost layer). + */ + draw?: RequestInitCfPropertiesImageDraw[]; + /** + * Fetching image from authenticated origin. Setting this property will + * pass authentication headers (Authorization, Cookie, etc.) through to + * the origin. + */ + "origin-auth"?: "share-publicly"; + /** + * Adds a border around the image. The border is added after resizing. Border + * width takes dpr into account, and can be specified either using a single + * width property, or individually for each side. + */ + border?: { + color: string; + width: number; + } | { + color: string; + top: number; + right: number; + bottom: number; + left: number; + }; + /** + * Increase brightness by a factor. A value of 1.0 equals no change, a value + * of 0.5 equals half brightness, and a value of 2.0 equals twice as bright. + * 0 is ignored. + */ + brightness?: number; + /** + * Increase contrast by a factor. A value of 1.0 equals no change, a value of + * 0.5 equals low contrast, and a value of 2.0 equals high contrast. 0 is + * ignored. + */ + contrast?: number; + /** + * Increase exposure by a factor. A value of 1.0 equals no change, a value of + * 0.5 darkens the image, and a value of 2.0 lightens the image. 0 is ignored. + */ + gamma?: number; + /** + * Increase contrast by a factor. A value of 1.0 equals no change, a value of + * 0.5 equals low contrast, and a value of 2.0 equals high contrast. 0 is + * ignored. + */ + saturation?: number; + /** + * Flips the images horizontally, vertically, or both. Flipping is applied before + * rotation, so if you apply flip=h,rotate=90 then the image will be flipped + * horizontally, then rotated by 90 degrees. + */ + flip?: 'h' | 'v' | 'hv'; + /** + * Slightly reduces latency on a cache miss by selecting a + * quickest-to-compress file format, at a cost of increased file size and + * lower image quality. It will usually override the format option and choose + * JPEG over WebP or AVIF. We do not recommend using this option, except in + * unusual circumstances like resizing uncacheable dynamically-generated + * images. + */ + compression?: "fast"; +} +interface RequestInitCfPropertiesImageMinify { + javascript?: boolean; + css?: boolean; + html?: boolean; +} +interface RequestInitCfPropertiesR2 { + /** + * Colo id of bucket that an object is stored in + */ + bucketColoId?: number; +} +/** + * Request metadata provided by Cloudflare's edge. + */ +type IncomingRequestCfProperties = IncomingRequestCfPropertiesBase & IncomingRequestCfPropertiesBotManagementEnterprise & IncomingRequestCfPropertiesCloudflareForSaaSEnterprise & IncomingRequestCfPropertiesGeographicInformation & IncomingRequestCfPropertiesCloudflareAccessOrApiShield; +interface IncomingRequestCfPropertiesBase extends Record { + /** + * [ASN](https://www.iana.org/assignments/as-numbers/as-numbers.xhtml) of the incoming request. + * + * @example 395747 + */ + asn?: number; + /** + * The organization which owns the ASN of the incoming request. + * + * @example "Google Cloud" + */ + asOrganization?: string; + /** + * The original value of the `Accept-Encoding` header if Cloudflare modified it. + * + * @example "gzip, deflate, br" + */ + clientAcceptEncoding?: string; + /** + * The number of milliseconds it took for the request to reach your worker. + * + * @example 22 + */ + clientTcpRtt?: number; + /** + * The three-letter [IATA](https://en.wikipedia.org/wiki/IATA_airport_code) + * airport code of the data center that the request hit. + * + * @example "DFW" + */ + colo: string; + /** + * Represents the upstream's response to a + * [TCP `keepalive` message](https://tldp.org/HOWTO/TCP-Keepalive-HOWTO/overview.html) + * from cloudflare. + * + * For workers with no upstream, this will always be `1`. + * + * @example 3 + */ + edgeRequestKeepAliveStatus: IncomingRequestCfPropertiesEdgeRequestKeepAliveStatus; + /** + * The HTTP Protocol the request used. + * + * @example "HTTP/2" + */ + httpProtocol: string; + /** + * The browser-requested prioritization information in the request object. + * + * If no information was set, defaults to the empty string `""` + * + * @example "weight=192;exclusive=0;group=3;group-weight=127" + * @default "" + */ + requestPriority: string; + /** + * The TLS version of the connection to Cloudflare. + * In requests served over plaintext (without TLS), this property is the empty string `""`. + * + * @example "TLSv1.3" + */ + tlsVersion: string; + /** + * The cipher for the connection to Cloudflare. + * In requests served over plaintext (without TLS), this property is the empty string `""`. + * + * @example "AEAD-AES128-GCM-SHA256" + */ + tlsCipher: string; + /** + * Metadata containing the [`HELLO`](https://www.rfc-editor.org/rfc/rfc5246#section-7.4.1.2) and [`FINISHED`](https://www.rfc-editor.org/rfc/rfc5246#section-7.4.9) messages from this request's TLS handshake. + * + * If the incoming request was served over plaintext (without TLS) this field is undefined. + */ + tlsExportedAuthenticator?: IncomingRequestCfPropertiesExportedAuthenticatorMetadata; +} +interface IncomingRequestCfPropertiesBotManagementBase { + /** + * Cloudflare’s [level of certainty](https://developers.cloudflare.com/bots/concepts/bot-score/) that a request comes from a bot, + * represented as an integer percentage between `1` (almost certainly a bot) and `99` (almost certainly human). + * + * @example 54 + */ + score: number; + /** + * A boolean value that is true if the request comes from a good bot, like Google or Bing. + * Most customers choose to allow this traffic. For more details, see [Traffic from known bots](https://developers.cloudflare.com/firewall/known-issues-and-faq/#how-does-firewall-rules-handle-traffic-from-known-bots). + */ + verifiedBot: boolean; + /** + * A boolean value that is true if the request originates from a + * Cloudflare-verified proxy service. + */ + corporateProxy: boolean; + /** + * A boolean value that's true if the request matches [file extensions](https://developers.cloudflare.com/bots/reference/static-resources/) for many types of static resources. + */ + staticResource: boolean; + /** + * List of IDs that correlate to the Bot Management heuristic detections made on a request (you can have multiple heuristic detections on the same request). + */ + detectionIds: number[]; +} +interface IncomingRequestCfPropertiesBotManagement { + /** + * Results of Cloudflare's Bot Management analysis + */ + botManagement: IncomingRequestCfPropertiesBotManagementBase; + /** + * Duplicate of `botManagement.score`. + * + * @deprecated + */ + clientTrustScore: number; +} +interface IncomingRequestCfPropertiesBotManagementEnterprise extends IncomingRequestCfPropertiesBotManagement { + /** + * Results of Cloudflare's Bot Management analysis + */ + botManagement: IncomingRequestCfPropertiesBotManagementBase & { + /** + * A [JA3 Fingerprint](https://developers.cloudflare.com/bots/concepts/ja3-fingerprint/) to help profile specific SSL/TLS clients + * across different destination IPs, Ports, and X509 certificates. + */ + ja3Hash: string; + }; +} +interface IncomingRequestCfPropertiesCloudflareForSaaSEnterprise { + /** + * Custom metadata set per-host in [Cloudflare for SaaS](https://developers.cloudflare.com/cloudflare-for-platforms/cloudflare-for-saas/). + * + * This field is only present if you have Cloudflare for SaaS enabled on your account + * and you have followed the [required steps to enable it]((https://developers.cloudflare.com/cloudflare-for-platforms/cloudflare-for-saas/domain-support/custom-metadata/)). + */ + hostMetadata?: HostMetadata; +} +interface IncomingRequestCfPropertiesCloudflareAccessOrApiShield { + /** + * Information about the client certificate presented to Cloudflare. + * + * This is populated when the incoming request is served over TLS using + * either Cloudflare Access or API Shield (mTLS) + * and the presented SSL certificate has a valid + * [Certificate Serial Number](https://ldapwiki.com/wiki/Certificate%20Serial%20Number) + * (i.e., not `null` or `""`). + * + * Otherwise, a set of placeholder values are used. + * + * The property `certPresented` will be set to `"1"` when + * the object is populated (i.e. the above conditions were met). + */ + tlsClientAuth: IncomingRequestCfPropertiesTLSClientAuth | IncomingRequestCfPropertiesTLSClientAuthPlaceholder; +} +/** + * Metadata about the request's TLS handshake + */ +interface IncomingRequestCfPropertiesExportedAuthenticatorMetadata { + /** + * The client's [`HELLO` message](https://www.rfc-editor.org/rfc/rfc5246#section-7.4.1.2), encoded in hexadecimal + * + * @example "44372ba35fa1270921d318f34c12f155dc87b682cf36a790cfaa3ba8737a1b5d" + */ + clientHandshake: string; + /** + * The server's [`HELLO` message](https://www.rfc-editor.org/rfc/rfc5246#section-7.4.1.2), encoded in hexadecimal + * + * @example "44372ba35fa1270921d318f34c12f155dc87b682cf36a790cfaa3ba8737a1b5d" + */ + serverHandshake: string; + /** + * The client's [`FINISHED` message](https://www.rfc-editor.org/rfc/rfc5246#section-7.4.9), encoded in hexadecimal + * + * @example "084ee802fe1348f688220e2a6040a05b2199a761f33cf753abb1b006792d3f8b" + */ + clientFinished: string; + /** + * The server's [`FINISHED` message](https://www.rfc-editor.org/rfc/rfc5246#section-7.4.9), encoded in hexadecimal + * + * @example "084ee802fe1348f688220e2a6040a05b2199a761f33cf753abb1b006792d3f8b" + */ + serverFinished: string; +} +/** + * Geographic data about the request's origin. + */ +interface IncomingRequestCfPropertiesGeographicInformation { + /** + * The [ISO 3166-1 Alpha 2](https://www.iso.org/iso-3166-country-codes.html) country code the request originated from. + * + * If your worker is [configured to accept TOR connections](https://support.cloudflare.com/hc/en-us/articles/203306930-Understanding-Cloudflare-Tor-support-and-Onion-Routing), this may also be `"T1"`, indicating a request that originated over TOR. + * + * If Cloudflare is unable to determine where the request originated this property is omitted. + * + * The country code `"T1"` is used for requests originating on TOR. + * + * @example "GB" + */ + country?: Iso3166Alpha2Code | "T1"; + /** + * If present, this property indicates that the request originated in the EU + * + * @example "1" + */ + isEUCountry?: "1"; + /** + * A two-letter code indicating the continent the request originated from. + * + * @example "AN" + */ + continent?: ContinentCode; + /** + * The city the request originated from + * + * @example "Austin" + */ + city?: string; + /** + * Postal code of the incoming request + * + * @example "78701" + */ + postalCode?: string; + /** + * Latitude of the incoming request + * + * @example "30.27130" + */ + latitude?: string; + /** + * Longitude of the incoming request + * + * @example "-97.74260" + */ + longitude?: string; + /** + * Timezone of the incoming request + * + * @example "America/Chicago" + */ + timezone?: string; + /** + * If known, the ISO 3166-2 name for the first level region associated with + * the IP address of the incoming request + * + * @example "Texas" + */ + region?: string; + /** + * If known, the ISO 3166-2 code for the first-level region associated with + * the IP address of the incoming request + * + * @example "TX" + */ + regionCode?: string; + /** + * Metro code (DMA) of the incoming request + * + * @example "635" + */ + metroCode?: string; +} +/** Data about the incoming request's TLS certificate */ +interface IncomingRequestCfPropertiesTLSClientAuth { + /** Always `"1"`, indicating that the certificate was presented */ + certPresented: "1"; + /** + * Result of certificate verification. + * + * @example "FAILED:self signed certificate" + */ + certVerified: Exclude; + /** The presented certificate's revokation status. + * + * - A value of `"1"` indicates the certificate has been revoked + * - A value of `"0"` indicates the certificate has not been revoked + */ + certRevoked: "1" | "0"; + /** + * The certificate issuer's [distinguished name](https://knowledge.digicert.com/generalinformation/INFO1745.html) + * + * @example "CN=cloudflareaccess.com, C=US, ST=Texas, L=Austin, O=Cloudflare" + */ + certIssuerDN: string; + /** + * The certificate subject's [distinguished name](https://knowledge.digicert.com/generalinformation/INFO1745.html) + * + * @example "CN=*.cloudflareaccess.com, C=US, ST=Texas, L=Austin, O=Cloudflare" + */ + certSubjectDN: string; + /** + * The certificate issuer's [distinguished name](https://knowledge.digicert.com/generalinformation/INFO1745.html) ([RFC 2253](https://www.rfc-editor.org/rfc/rfc2253.html) formatted) + * + * @example "CN=cloudflareaccess.com, C=US, ST=Texas, L=Austin, O=Cloudflare" + */ + certIssuerDNRFC2253: string; + /** + * The certificate subject's [distinguished name](https://knowledge.digicert.com/generalinformation/INFO1745.html) ([RFC 2253](https://www.rfc-editor.org/rfc/rfc2253.html) formatted) + * + * @example "CN=*.cloudflareaccess.com, C=US, ST=Texas, L=Austin, O=Cloudflare" + */ + certSubjectDNRFC2253: string; + /** The certificate issuer's distinguished name (legacy policies) */ + certIssuerDNLegacy: string; + /** The certificate subject's distinguished name (legacy policies) */ + certSubjectDNLegacy: string; + /** + * The certificate's serial number + * + * @example "00936EACBE07F201DF" + */ + certSerial: string; + /** + * The certificate issuer's serial number + * + * @example "2489002934BDFEA34" + */ + certIssuerSerial: string; + /** + * The certificate's Subject Key Identifier + * + * @example "BB:AF:7E:02:3D:FA:A6:F1:3C:84:8E:AD:EE:38:98:EC:D9:32:32:D4" + */ + certSKI: string; + /** + * The certificate issuer's Subject Key Identifier + * + * @example "BB:AF:7E:02:3D:FA:A6:F1:3C:84:8E:AD:EE:38:98:EC:D9:32:32:D4" + */ + certIssuerSKI: string; + /** + * The certificate's SHA-1 fingerprint + * + * @example "6b9109f323999e52259cda7373ff0b4d26bd232e" + */ + certFingerprintSHA1: string; + /** + * The certificate's SHA-256 fingerprint + * + * @example "acf77cf37b4156a2708e34c4eb755f9b5dbbe5ebb55adfec8f11493438d19e6ad3f157f81fa3b98278453d5652b0c1fd1d71e5695ae4d709803a4d3f39de9dea" + */ + certFingerprintSHA256: string; + /** + * The effective starting date of the certificate + * + * @example "Dec 22 19:39:00 2018 GMT" + */ + certNotBefore: string; + /** + * The effective expiration date of the certificate + * + * @example "Dec 22 19:39:00 2018 GMT" + */ + certNotAfter: string; +} +/** Placeholder values for TLS Client Authorization */ +interface IncomingRequestCfPropertiesTLSClientAuthPlaceholder { + certPresented: "0"; + certVerified: "NONE"; + certRevoked: "0"; + certIssuerDN: ""; + certSubjectDN: ""; + certIssuerDNRFC2253: ""; + certSubjectDNRFC2253: ""; + certIssuerDNLegacy: ""; + certSubjectDNLegacy: ""; + certSerial: ""; + certIssuerSerial: ""; + certSKI: ""; + certIssuerSKI: ""; + certFingerprintSHA1: ""; + certFingerprintSHA256: ""; + certNotBefore: ""; + certNotAfter: ""; +} +/** Possible outcomes of TLS verification */ +declare type CertVerificationStatus = +/** Authentication succeeded */ +"SUCCESS" +/** No certificate was presented */ + | "NONE" +/** Failed because the certificate was self-signed */ + | "FAILED:self signed certificate" +/** Failed because the certificate failed a trust chain check */ + | "FAILED:unable to verify the first certificate" +/** Failed because the certificate not yet valid */ + | "FAILED:certificate is not yet valid" +/** Failed because the certificate is expired */ + | "FAILED:certificate has expired" +/** Failed for another unspecified reason */ + | "FAILED"; +/** + * An upstream endpoint's response to a TCP `keepalive` message from Cloudflare. + */ +declare type IncomingRequestCfPropertiesEdgeRequestKeepAliveStatus = 0 /** Unknown */ | 1 /** no keepalives (not found) */ | 2 /** no connection re-use, opening keepalive connection failed */ | 3 /** no connection re-use, keepalive accepted and saved */ | 4 /** connection re-use, refused by the origin server (`TCP FIN`) */ | 5; /** connection re-use, accepted by the origin server */ +/** ISO 3166-1 Alpha-2 codes */ +declare type Iso3166Alpha2Code = "AD" | "AE" | "AF" | "AG" | "AI" | "AL" | "AM" | "AO" | "AQ" | "AR" | "AS" | "AT" | "AU" | "AW" | "AX" | "AZ" | "BA" | "BB" | "BD" | "BE" | "BF" | "BG" | "BH" | "BI" | "BJ" | "BL" | "BM" | "BN" | "BO" | "BQ" | "BR" | "BS" | "BT" | "BV" | "BW" | "BY" | "BZ" | "CA" | "CC" | "CD" | "CF" | "CG" | "CH" | "CI" | "CK" | "CL" | "CM" | "CN" | "CO" | "CR" | "CU" | "CV" | "CW" | "CX" | "CY" | "CZ" | "DE" | "DJ" | "DK" | "DM" | "DO" | "DZ" | "EC" | "EE" | "EG" | "EH" | "ER" | "ES" | "ET" | "FI" | "FJ" | "FK" | "FM" | "FO" | "FR" | "GA" | "GB" | "GD" | "GE" | "GF" | "GG" | "GH" | "GI" | "GL" | "GM" | "GN" | "GP" | "GQ" | "GR" | "GS" | "GT" | "GU" | "GW" | "GY" | "HK" | "HM" | "HN" | "HR" | "HT" | "HU" | "ID" | "IE" | "IL" | "IM" | "IN" | "IO" | "IQ" | "IR" | "IS" | "IT" | "JE" | "JM" | "JO" | "JP" | "KE" | "KG" | "KH" | "KI" | "KM" | "KN" | "KP" | "KR" | "KW" | "KY" | "KZ" | "LA" | "LB" | "LC" | "LI" | "LK" | "LR" | "LS" | "LT" | "LU" | "LV" | "LY" | "MA" | "MC" | "MD" | "ME" | "MF" | "MG" | "MH" | "MK" | "ML" | "MM" | "MN" | "MO" | "MP" | "MQ" | "MR" | "MS" | "MT" | "MU" | "MV" | "MW" | "MX" | "MY" | "MZ" | "NA" | "NC" | "NE" | "NF" | "NG" | "NI" | "NL" | "NO" | "NP" | "NR" | "NU" | "NZ" | "OM" | "PA" | "PE" | "PF" | "PG" | "PH" | "PK" | "PL" | "PM" | "PN" | "PR" | "PS" | "PT" | "PW" | "PY" | "QA" | "RE" | "RO" | "RS" | "RU" | "RW" | "SA" | "SB" | "SC" | "SD" | "SE" | "SG" | "SH" | "SI" | "SJ" | "SK" | "SL" | "SM" | "SN" | "SO" | "SR" | "SS" | "ST" | "SV" | "SX" | "SY" | "SZ" | "TC" | "TD" | "TF" | "TG" | "TH" | "TJ" | "TK" | "TL" | "TM" | "TN" | "TO" | "TR" | "TT" | "TV" | "TW" | "TZ" | "UA" | "UG" | "UM" | "US" | "UY" | "UZ" | "VA" | "VC" | "VE" | "VG" | "VI" | "VN" | "VU" | "WF" | "WS" | "YE" | "YT" | "ZA" | "ZM" | "ZW"; +/** The 2-letter continent codes Cloudflare uses */ +declare type ContinentCode = "AF" | "AN" | "AS" | "EU" | "NA" | "OC" | "SA"; +type CfProperties = IncomingRequestCfProperties | RequestInitCfProperties; +interface D1Meta { + duration: number; + size_after: number; + rows_read: number; + rows_written: number; + last_row_id: number; + changed_db: boolean; + changes: number; + /** + * The region of the database instance that executed the query. + */ + served_by_region?: string; + /** + * The three letters airport code of the colo that executed the query. + */ + served_by_colo?: string; + /** + * True if-and-only-if the database instance that executed the query was the primary. + */ + served_by_primary?: boolean; + timings?: { + /** + * The duration of the SQL query execution by the database instance. It doesn't include any network time. + */ + sql_duration_ms: number; + }; + /** + * Number of total attempts to execute the query, due to automatic retries. + * Note: All other fields in the response like `timings` only apply to the last attempt. + */ + total_attempts?: number; +} +interface D1Response { + success: true; + meta: D1Meta & Record; + error?: never; +} +type D1Result = D1Response & { + results: T[]; +}; +interface D1ExecResult { + count: number; + duration: number; +} +type D1SessionConstraint = +// Indicates that the first query should go to the primary, and the rest queries +// using the same D1DatabaseSession will go to any replica that is consistent with +// the bookmark maintained by the session (returned by the first query). +'first-primary' +// Indicates that the first query can go anywhere (primary or replica), and the rest queries +// using the same D1DatabaseSession will go to any replica that is consistent with +// the bookmark maintained by the session (returned by the first query). + | 'first-unconstrained'; +type D1SessionBookmark = string; +declare abstract class D1Database { + prepare(query: string): D1PreparedStatement; + batch(statements: D1PreparedStatement[]): Promise[]>; + exec(query: string): Promise; + /** + * Creates a new D1 Session anchored at the given constraint or the bookmark. + * All queries executed using the created session will have sequential consistency, + * meaning that all writes done through the session will be visible in subsequent reads. + * + * @param constraintOrBookmark Either the session constraint or the explicit bookmark to anchor the created session. + */ + withSession(constraintOrBookmark?: D1SessionBookmark | D1SessionConstraint): D1DatabaseSession; + /** + * @deprecated dump() will be removed soon, only applies to deprecated alpha v1 databases. + */ + dump(): Promise; +} +declare abstract class D1DatabaseSession { + prepare(query: string): D1PreparedStatement; + batch(statements: D1PreparedStatement[]): Promise[]>; + /** + * @returns The latest session bookmark across all executed queries on the session. + * If no query has been executed yet, `null` is returned. + */ + getBookmark(): D1SessionBookmark | null; +} +declare abstract class D1PreparedStatement { + bind(...values: unknown[]): D1PreparedStatement; + first(colName: string): Promise; + first>(): Promise; + run>(): Promise>; + all>(): Promise>; + raw(options: { + columnNames: true; + }): Promise<[ + string[], + ...T[] + ]>; + raw(options?: { + columnNames?: false; + }): Promise; +} +// `Disposable` was added to TypeScript's standard lib types in version 5.2. +// To support older TypeScript versions, define an empty `Disposable` interface. +// Users won't be able to use `using`/`Symbol.dispose` without upgrading to 5.2, +// but this will ensure type checking on older versions still passes. +// TypeScript's interface merging will ensure our empty interface is effectively +// ignored when `Disposable` is included in the standard lib. +interface Disposable { +} +/** + * The returned data after sending an email + */ +interface EmailSendResult { + /** + * The Email Message ID + */ + messageId: string; +} +/** + * An email message that can be sent from a Worker. + */ +interface EmailMessage { + /** + * Envelope From attribute of the email message. + */ + readonly from: string; + /** + * Envelope To attribute of the email message. + */ + readonly to: string; +} +/** + * An email message that is sent to a consumer Worker and can be rejected/forwarded. + */ +interface ForwardableEmailMessage extends EmailMessage { + /** + * Stream of the email message content. + */ + readonly raw: ReadableStream; + /** + * An [Headers object](https://developer.mozilla.org/en-US/docs/Web/API/Headers). + */ + readonly headers: Headers; + /** + * Size of the email message content. + */ + readonly rawSize: number; + /** + * Reject this email message by returning a permanent SMTP error back to the connecting client including the given reason. + * @param reason The reject reason. + * @returns void + */ + setReject(reason: string): void; + /** + * Forward this email message to a verified destination address of the account. + * @param rcptTo Verified destination address. + * @param headers A [Headers object](https://developer.mozilla.org/en-US/docs/Web/API/Headers). + * @returns A promise that resolves when the email message is forwarded. + */ + forward(rcptTo: string, headers?: Headers): Promise; + /** + * Reply to the sender of this email message with a new EmailMessage object. + * @param message The reply message. + * @returns A promise that resolves when the email message is replied. + */ + reply(message: EmailMessage): Promise; +} +/** A file attachment for an email message */ +type EmailAttachment = { + disposition: 'inline'; + contentId: string; + filename: string; + type: string; + content: string | ArrayBuffer | ArrayBufferView; +} | { + disposition: 'attachment'; + contentId?: undefined; + filename: string; + type: string; + content: string | ArrayBuffer | ArrayBufferView; +}; +/** An Email Address */ +interface EmailAddress { + name: string; + email: string; +} +/** + * A binding that allows a Worker to send email messages. + */ +interface SendEmail { + send(message: EmailMessage): Promise; + send(builder: { + from: string | EmailAddress; + to: string | string[]; + subject: string; + replyTo?: string | EmailAddress; + cc?: string | string[]; + bcc?: string | string[]; + headers?: Record; + text?: string; + html?: string; + attachments?: EmailAttachment[]; + }): Promise; +} +declare abstract class EmailEvent extends ExtendableEvent { + readonly message: ForwardableEmailMessage; +} +declare type EmailExportedHandler = (message: ForwardableEmailMessage, env: Env, ctx: ExecutionContext) => void | Promise; +declare module "cloudflare:email" { + let _EmailMessage: { + prototype: EmailMessage; + new (from: string, to: string, raw: ReadableStream | string): EmailMessage; + }; + export { _EmailMessage as EmailMessage }; +} +/** + * Evaluation context for targeting rules. + * Keys are attribute names (e.g. "userId", "country"), values are the attribute values. + */ +type FlagshipEvaluationContext = Record; +interface FlagshipEvaluationDetails { + flagKey: string; + value: T; + variant?: string | undefined; + reason?: string | undefined; + errorCode?: string | undefined; + errorMessage?: string | undefined; +} +interface FlagshipEvaluationError extends Error { +} +/** + * Feature flags binding for evaluating feature flags from a Cloudflare Workers script. + * + * @example + * ```typescript + * // Get a boolean flag value with a default + * const enabled = await env.FLAGS.getBooleanValue('my-feature', false); + * + * // Get a flag value with evaluation context for targeting + * const variant = await env.FLAGS.getStringValue('experiment', 'control', { + * userId: 'user-123', + * country: 'US', + * }); + * + * // Get full evaluation details including variant and reason + * const details = await env.FLAGS.getBooleanDetails('my-feature', false); + * console.log(details.variant, details.reason); + * ``` + */ +declare abstract class Flagship { + /** + * Get a flag value without type checking. + * @param flagKey The key of the flag to evaluate. + * @param defaultValue Optional default value returned when evaluation fails. + * @param context Optional evaluation context for targeting rules. + */ + get(flagKey: string, defaultValue?: unknown, context?: FlagshipEvaluationContext): Promise; + /** + * Get a boolean flag value. + * @param flagKey The key of the flag to evaluate. + * @param defaultValue Default value returned when evaluation fails or the flag type does not match. + * @param context Optional evaluation context for targeting rules. + */ + getBooleanValue(flagKey: string, defaultValue: boolean, context?: FlagshipEvaluationContext): Promise; + /** + * Get a string flag value. + * @param flagKey The key of the flag to evaluate. + * @param defaultValue Default value returned when evaluation fails or the flag type does not match. + * @param context Optional evaluation context for targeting rules. + */ + getStringValue(flagKey: string, defaultValue: string, context?: FlagshipEvaluationContext): Promise; + /** + * Get a number flag value. + * @param flagKey The key of the flag to evaluate. + * @param defaultValue Default value returned when evaluation fails or the flag type does not match. + * @param context Optional evaluation context for targeting rules. + */ + getNumberValue(flagKey: string, defaultValue: number, context?: FlagshipEvaluationContext): Promise; + /** + * Get an object flag value. + * @param flagKey The key of the flag to evaluate. + * @param defaultValue Default value returned when evaluation fails or the flag type does not match. + * @param context Optional evaluation context for targeting rules. + */ + getObjectValue(flagKey: string, defaultValue: T, context?: FlagshipEvaluationContext): Promise; + /** + * Get a boolean flag value with full evaluation details. + * @param flagKey The key of the flag to evaluate. + * @param defaultValue Default value returned when evaluation fails or the flag type does not match. + * @param context Optional evaluation context for targeting rules. + */ + getBooleanDetails(flagKey: string, defaultValue: boolean, context?: FlagshipEvaluationContext): Promise>; + /** + * Get a string flag value with full evaluation details. + * @param flagKey The key of the flag to evaluate. + * @param defaultValue Default value returned when evaluation fails or the flag type does not match. + * @param context Optional evaluation context for targeting rules. + */ + getStringDetails(flagKey: string, defaultValue: string, context?: FlagshipEvaluationContext): Promise>; + /** + * Get a number flag value with full evaluation details. + * @param flagKey The key of the flag to evaluate. + * @param defaultValue Default value returned when evaluation fails or the flag type does not match. + * @param context Optional evaluation context for targeting rules. + */ + getNumberDetails(flagKey: string, defaultValue: number, context?: FlagshipEvaluationContext): Promise>; + /** + * Get an object flag value with full evaluation details. + * @param flagKey The key of the flag to evaluate. + * @param defaultValue Default value returned when evaluation fails or the flag type does not match. + * @param context Optional evaluation context for targeting rules. + */ + getObjectDetails(flagKey: string, defaultValue: T, context?: FlagshipEvaluationContext): Promise>; +} +/** + * Hello World binding to serve as an explanatory example. DO NOT USE + */ +interface HelloWorldBinding { + /** + * Retrieve the current stored value + */ + get(): Promise<{ + value: string; + ms?: number; + }>; + /** + * Set a new stored value + */ + set(value: string): Promise; +} +interface Hyperdrive { + /** + * Connect directly to Hyperdrive as if it's your database, returning a TCP socket. + * + * Calling this method returns an identical socket to if you call + * `connect("host:port")` using the `host` and `port` fields from this object. + * Pick whichever approach works better with your preferred DB client library. + * + * Note that this socket is not yet authenticated -- it's expected that your + * code (or preferably, the client library of your choice) will authenticate + * using the information in this class's readonly fields. + */ + connect(): Socket; + /** + * A valid DB connection string that can be passed straight into the typical + * client library/driver/ORM. This will typically be the easiest way to use + * Hyperdrive. + */ + readonly connectionString: string; + /* + * A randomly generated hostname that is only valid within the context of the + * currently running Worker which, when passed into `connect()` function from + * the "cloudflare:sockets" module, will connect to the Hyperdrive instance + * for your database. + */ + readonly host: string; + /* + * The port that must be paired the the host field when connecting. + */ + readonly port: number; + /* + * The username to use when authenticating to your database via Hyperdrive. + * Unlike the host and password, this will be the same every time + */ + readonly user: string; + /* + * The randomly generated password to use when authenticating to your + * database via Hyperdrive. Like the host field, this password is only valid + * within the context of the currently running Worker instance from which + * it's read. + */ + readonly password: string; + /* + * The name of the database to connect to. + */ + readonly database: string; +} +// Copyright (c) 2024 Cloudflare, Inc. +// Licensed under the Apache 2.0 license found in the LICENSE file or at: +// https://opensource.org/licenses/Apache-2.0 +type ImageInfoResponse = { + format: 'image/svg+xml'; +} | { + format: string; + fileSize: number; + width: number; + height: number; +}; +type ImageTransform = { + width?: number; + height?: number; + background?: string; + blur?: number; + border?: { + color?: string; + width?: number; + } | { + top?: number; + bottom?: number; + left?: number; + right?: number; + }; + brightness?: number; + contrast?: number; + fit?: 'scale-down' | 'contain' | 'pad' | 'squeeze' | 'cover' | 'crop'; + flip?: 'h' | 'v' | 'hv'; + gamma?: number; + segment?: 'foreground'; + gravity?: 'face' | 'left' | 'right' | 'top' | 'bottom' | 'center' | 'auto' | 'entropy' | { + x?: number; + y?: number; + mode: 'remainder' | 'box-center'; + }; + rotate?: 0 | 90 | 180 | 270; + saturation?: number; + sharpen?: number; + trim?: 'border' | { + top?: number; + bottom?: number; + left?: number; + right?: number; + width?: number; + height?: number; + border?: boolean | { + color?: string; + tolerance?: number; + keep?: number; + }; + }; +}; +type ImageDrawOptions = { + opacity?: number; + repeat?: boolean | string; + top?: number; + left?: number; + bottom?: number; + right?: number; +}; +type ImageInputOptions = { + encoding?: 'base64'; +}; +type ImageOutputOptions = { + format: 'image/jpeg' | 'image/png' | 'image/gif' | 'image/webp' | 'image/avif' | 'rgb' | 'rgba'; + quality?: number; + background?: string; + anim?: boolean; +}; +interface ImageMetadata { + id: string; + filename?: string; + uploaded?: string; + requireSignedURLs: boolean; + meta?: Record; + variants: string[]; + draft?: boolean; + creator?: string; +} +interface ImageUploadOptions { + id?: string; + filename?: string; + requireSignedURLs?: boolean; + metadata?: Record; + creator?: string; + encoding?: 'base64'; +} +interface ImageUpdateOptions { + requireSignedURLs?: boolean; + metadata?: Record; + creator?: string; +} +interface ImageListOptions { + limit?: number; + cursor?: string; + sortOrder?: 'asc' | 'desc'; + creator?: string; +} +interface ImageList { + images: ImageMetadata[]; + cursor?: string; + listComplete: boolean; +} +interface ImageHandle { + /** + * Get metadata for a hosted image + * @returns Image metadata, or null if not found + */ + details(): Promise; + /** + * Get the raw image data for a hosted image + * @returns ReadableStream of image bytes, or null if not found + */ + bytes(): Promise | null>; + /** + * Update hosted image metadata + * @param options Properties to update + * @returns Updated image metadata + * @throws {@link ImagesError} if update fails + */ + update(options: ImageUpdateOptions): Promise; + /** + * Delete a hosted image + * @returns True if deleted, false if not found + */ + delete(): Promise; +} +interface HostedImagesBinding { + /** + * Get a handle for a hosted image + * @param imageId The ID of the image (UUID or custom ID) + * @returns A handle for per-image operations + */ + image(imageId: string): ImageHandle; + /** + * Upload a new hosted image + * @param image The image file to upload + * @param options Upload configuration + * @returns Metadata for the uploaded image + * @throws {@link ImagesError} if upload fails + */ + upload(image: ReadableStream | ArrayBuffer, options?: ImageUploadOptions): Promise; + /** + * List hosted images with pagination + * @param options List configuration + * @returns List of images with pagination info + * @throws {@link ImagesError} if list fails + */ + list(options?: ImageListOptions): Promise; +} +interface ImagesBinding { + /** + * Get image metadata (type, width and height) + * @throws {@link ImagesError} with code 9412 if input is not an image + * @param stream The image bytes + */ + info(stream: ReadableStream, options?: ImageInputOptions): Promise; + /** + * Begin applying a series of transformations to an image + * @param stream The image bytes + * @returns A transform handle + */ + input(stream: ReadableStream, options?: ImageInputOptions): ImageTransformer; + /** + * Access hosted images CRUD operations + */ + readonly hosted: HostedImagesBinding; +} +interface ImageTransformer { + /** + * Apply transform next, returning a transform handle. + * You can then apply more transformations, draw, or retrieve the output. + * @param transform + */ + transform(transform: ImageTransform): ImageTransformer; + /** + * Draw an image on this transformer, returning a transform handle. + * You can then apply more transformations, draw, or retrieve the output. + * @param image The image (or transformer that will give the image) to draw + * @param options The options configuring how to draw the image + */ + draw(image: ReadableStream | ImageTransformer, options?: ImageDrawOptions): ImageTransformer; + /** + * Retrieve the image that results from applying the transforms to the + * provided input + * @param options Options that apply to the output e.g. output format + */ + output(options: ImageOutputOptions): Promise; +} +type ImageTransformationOutputOptions = { + encoding?: 'base64'; +}; +interface ImageTransformationResult { + /** + * The image as a response, ready to store in cache or return to users + */ + response(): Response; + /** + * The content type of the returned image + */ + contentType(): string; + /** + * The bytes of the response + */ + image(options?: ImageTransformationOutputOptions): ReadableStream; +} +interface ImagesError extends Error { + readonly code: number; + readonly message: string; + readonly stack?: string; +} +/** + * Media binding for transforming media streams. + * Provides the entry point for media transformation operations. + */ +interface MediaBinding { + /** + * Creates a media transformer from an input stream. + * @param media - The input media bytes + * @returns A MediaTransformer instance for applying transformations + */ + input(media: ReadableStream): MediaTransformer; +} +/** + * Media transformer for applying transformation operations to media content. + * Handles sizing, fitting, and other input transformation parameters. + */ +interface MediaTransformer { + /** + * Applies transformation options to the media content. + * @param transform - Configuration for how the media should be transformed + * @returns A generator for producing the transformed media output + */ + transform(transform?: MediaTransformationInputOptions): MediaTransformationGenerator; + /** + * Generates the final media output with specified options. + * @param output - Configuration for the output format and parameters + * @returns The final transformation result containing the transformed media + */ + output(output?: MediaTransformationOutputOptions): MediaTransformationResult; +} +/** + * Generator for producing media transformation results. + * Configures the output format and parameters for the transformed media. + */ +interface MediaTransformationGenerator { + /** + * Generates the final media output with specified options. + * @param output - Configuration for the output format and parameters + * @returns The final transformation result containing the transformed media + */ + output(output?: MediaTransformationOutputOptions): MediaTransformationResult; +} +/** + * Result of a media transformation operation. + * Provides multiple ways to access the transformed media content. + */ +interface MediaTransformationResult { + /** + * Returns the transformed media as a readable stream of bytes. + * @returns A promise containing a readable stream with the transformed media + */ + media(): Promise>; + /** + * Returns the transformed media as an HTTP response object. + * @returns The transformed media as a Promise, ready to store in cache or return to users + */ + response(): Promise; + /** + * Returns the MIME type of the transformed media. + * @returns A promise containing the content type string (e.g., 'image/jpeg', 'video/mp4') + */ + contentType(): Promise; +} +/** + * Configuration options for transforming media input. + * Controls how the media should be resized and fitted. + */ +type MediaTransformationInputOptions = { + /** How the media should be resized to fit the specified dimensions */ + fit?: 'contain' | 'cover' | 'scale-down'; + /** Target width in pixels */ + width?: number; + /** Target height in pixels */ + height?: number; +}; +/** + * Configuration options for Media Transformations output. + * Controls the format, timing, and type of the generated output. + */ +type MediaTransformationOutputOptions = { + /** + * Output mode determining the type of media to generate + */ + mode?: 'video' | 'spritesheet' | 'frame' | 'audio'; + /** Whether to include audio in the output */ + audio?: boolean; + /** + * Starting timestamp for frame extraction or start time for clips. (e.g. '2s'). + */ + time?: string; + /** + * Duration for video clips, audio extraction, and spritesheet generation (e.g. '5s'). + */ + duration?: string; + /** + * Number of frames in the spritesheet. + */ + imageCount?: number; + /** + * Output format for the generated media. + */ + format?: 'jpg' | 'png' | 'm4a'; +}; +/** + * Error object for media transformation operations. + * Extends the standard Error interface with additional media-specific information. + */ +interface MediaError extends Error { + readonly code: number; + readonly message: string; + readonly stack?: string; +} +declare module 'cloudflare:node' { + interface NodeStyleServer { + listen(...args: unknown[]): this; + address(): { + port?: number | null | undefined; + }; + } + export function httpServerHandler(port: number): ExportedHandler; + export function httpServerHandler(options: { + port: number; + }): ExportedHandler; + export function httpServerHandler(server: NodeStyleServer): ExportedHandler; +} +type Params

= Record; +type EventContext = { + request: Request>; + functionPath: string; + waitUntil: (promise: Promise) => void; + passThroughOnException: () => void; + next: (input?: Request | string, init?: RequestInit) => Promise; + env: Env & { + ASSETS: { + fetch: typeof fetch; + }; + }; + params: Params

; + data: Data; +}; +type PagesFunction = Record> = (context: EventContext) => Response | Promise; +type EventPluginContext = { + request: Request>; + functionPath: string; + waitUntil: (promise: Promise) => void; + passThroughOnException: () => void; + next: (input?: Request | string, init?: RequestInit) => Promise; + env: Env & { + ASSETS: { + fetch: typeof fetch; + }; + }; + params: Params

; + data: Data; + pluginArgs: PluginArgs; +}; +type PagesPluginFunction = Record, PluginArgs = unknown> = (context: EventPluginContext) => Response | Promise; +declare module "assets:*" { + export const onRequest: PagesFunction; +} +// Copyright (c) 2022-2023 Cloudflare, Inc. +// Licensed under the Apache 2.0 license found in the LICENSE file or at: +// https://opensource.org/licenses/Apache-2.0 +declare module "cloudflare:pipelines" { + export abstract class PipelineTransformationEntrypoint { + protected env: Env; + protected ctx: ExecutionContext; + constructor(ctx: ExecutionContext, env: Env); + /** + * run receives an array of PipelineRecord which can be + * transformed and returned to the pipeline + * @param records Incoming records from the pipeline to be transformed + * @param metadata Information about the specific pipeline calling the transformation entrypoint + * @returns A promise containing the transformed PipelineRecord array + */ + public run(records: I[], metadata: PipelineBatchMetadata): Promise; + } + export type PipelineRecord = Record; + export type PipelineBatchMetadata = { + pipelineId: string; + pipelineName: string; + }; + export interface Pipeline { + /** + * The Pipeline interface represents the type of a binding to a Pipeline + * + * @param records The records to send to the pipeline + */ + send(records: T[]): Promise; + } +} +// PubSubMessage represents an incoming PubSub message. +// The message includes metadata about the broker, the client, and the payload +// itself. +// https://developers.cloudflare.com/pub-sub/ +interface PubSubMessage { + // Message ID + readonly mid: number; + // MQTT broker FQDN in the form mqtts://BROKER.NAMESPACE.cloudflarepubsub.com:PORT + readonly broker: string; + // The MQTT topic the message was sent on. + readonly topic: string; + // The client ID of the client that published this message. + readonly clientId: string; + // The unique identifier (JWT ID) used by the client to authenticate, if token + // auth was used. + readonly jti?: string; + // A Unix timestamp (seconds from Jan 1, 1970), set when the Pub/Sub Broker + // received the message from the client. + readonly receivedAt: number; + // An (optional) string with the MIME type of the payload, if set by the + // client. + readonly contentType: string; + // Set to 1 when the payload is a UTF-8 string + // https://docs.oasis-open.org/mqtt/mqtt/v5.0/os/mqtt-v5.0-os.html#_Toc3901063 + readonly payloadFormatIndicator: number; + // Pub/Sub (MQTT) payloads can be UTF-8 strings, or byte arrays. + // You can use payloadFormatIndicator to inspect this before decoding. + payload: string | Uint8Array; +} +// JsonWebKey extended by kid parameter +interface JsonWebKeyWithKid extends JsonWebKey { + // Key Identifier of the JWK + readonly kid: string; +} +interface RateLimitOptions { + key: string; +} +interface RateLimitOutcome { + success: boolean; +} +interface RateLimit { + /** + * Rate limit a request based on the provided options. + * @see https://developers.cloudflare.com/workers/runtime-apis/bindings/rate-limit/ + * @returns A promise that resolves with the outcome of the rate limit. + */ + limit(options: RateLimitOptions): Promise; +} +// Namespace for RPC utility types. Unfortunately, we can't use a `module` here as these types need +// to referenced by `Fetcher`. This is included in the "importable" version of the types which +// strips all `module` blocks. +declare namespace Rpc { + // Branded types for identifying `WorkerEntrypoint`/`DurableObject`/`Target`s. + // TypeScript uses *structural* typing meaning anything with the same shape as type `T` is a `T`. + // For the classes exported by `cloudflare:workers` we want *nominal* typing (i.e. we only want to + // accept `WorkerEntrypoint` from `cloudflare:workers`, not any other class with the same shape) + export const __RPC_STUB_BRAND: '__RPC_STUB_BRAND'; + export const __RPC_TARGET_BRAND: '__RPC_TARGET_BRAND'; + export const __WORKER_ENTRYPOINT_BRAND: '__WORKER_ENTRYPOINT_BRAND'; + export const __DURABLE_OBJECT_BRAND: '__DURABLE_OBJECT_BRAND'; + export const __WORKFLOW_ENTRYPOINT_BRAND: '__WORKFLOW_ENTRYPOINT_BRAND'; + export interface RpcTargetBranded { + [__RPC_TARGET_BRAND]: never; + } + export interface WorkerEntrypointBranded { + [__WORKER_ENTRYPOINT_BRAND]: never; + } + export interface DurableObjectBranded { + [__DURABLE_OBJECT_BRAND]: never; + } + export interface WorkflowEntrypointBranded { + [__WORKFLOW_ENTRYPOINT_BRAND]: never; + } + export type EntrypointBranded = WorkerEntrypointBranded | DurableObjectBranded | WorkflowEntrypointBranded; + // Types that can be used through `Stub`s + export type Stubable = RpcTargetBranded | ((...args: any[]) => any); + // Types that can be passed over RPC + // The reason for using a generic type here is to build a serializable subset of structured + // cloneable composite types. This allows types defined with the "interface" keyword to pass the + // serializable check as well. Otherwise, only types defined with the "type" keyword would pass. + type Serializable = + // Structured cloneables + BaseType + // Structured cloneable composites + | Map ? Serializable : never, T extends Map ? Serializable : never> | Set ? Serializable : never> | ReadonlyArray ? Serializable : never> | { + [K in keyof T]: K extends number | string ? Serializable : never; + } + // Special types + | Stub + // Serialized as stubs, see `Stubify` + | Stubable; + // Base type for all RPC stubs, including common memory management methods. + // `T` is used as a marker type for unwrapping `Stub`s later. + interface StubBase extends Disposable { + [__RPC_STUB_BRAND]: T; + dup(): this; + } + export type Stub = Provider & StubBase; + // This represents all the types that can be sent as-is over an RPC boundary + type BaseType = void | undefined | null | boolean | number | bigint | string | TypedArray | ArrayBuffer | DataView | Date | Error | RegExp | ReadableStream | WritableStream | Request | Response | Headers; + // Recursively rewrite all `Stubable` types with `Stub`s + // prettier-ignore + type Stubify = T extends Stubable ? Stub : T extends Map ? Map, Stubify> : T extends Set ? Set> : T extends Array ? Array> : T extends ReadonlyArray ? ReadonlyArray> : T extends BaseType ? T : T extends { + [key: string | number]: any; + } ? { + [K in keyof T]: Stubify; + } : T; + // Recursively rewrite all `Stub`s with the corresponding `T`s. + // Note we use `StubBase` instead of `Stub` here to avoid circular dependencies: + // `Stub` depends on `Provider`, which depends on `Unstubify`, which would depend on `Stub`. + // prettier-ignore + type Unstubify = T extends StubBase ? V : T extends Map ? Map, Unstubify> : T extends Set ? Set> : T extends Array ? Array> : T extends ReadonlyArray ? ReadonlyArray> : T extends BaseType ? T : T extends { + [key: string | number]: unknown; + } ? { + [K in keyof T]: Unstubify; + } : T; + type UnstubifyAll = { + [I in keyof A]: Unstubify; + }; + // Utility type for adding `Provider`/`Disposable`s to `object` types only. + // Note `unknown & T` is equivalent to `T`. + type MaybeProvider = T extends object ? Provider : unknown; + type MaybeDisposable = T extends object ? Disposable : unknown; + // Type for method return or property on an RPC interface. + // - Stubable types are replaced by stubs. + // - Serializable types are passed by value, with stubable types replaced by stubs + // and a top-level `Disposer`. + // Everything else can't be passed over PRC. + // Technically, we use custom thenables here, but they quack like `Promise`s. + // Intersecting with `(Maybe)Provider` allows pipelining. + // prettier-ignore + type Result = R extends Stubable ? Promise> & Provider : R extends Serializable ? Promise & MaybeDisposable> & MaybeProvider : never; + // Type for method or property on an RPC interface. + // For methods, unwrap `Stub`s in parameters, and rewrite returns to be `Result`s. + // Unwrapping `Stub`s allows calling with `Stubable` arguments. + // For properties, rewrite types to be `Result`s. + // In each case, unwrap `Promise`s. + type MethodOrProperty = V extends (...args: infer P) => infer R ? (...args: UnstubifyAll

) => Result> : Result>; + // Type for the callable part of an `Provider` if `T` is callable. + // This is intersected with methods/properties. + type MaybeCallableProvider = T extends (...args: any[]) => any ? MethodOrProperty : unknown; + // Base type for all other types providing RPC-like interfaces. + // Rewrites all methods/properties to be `MethodOrProperty`s, while preserving callable types. + // `Reserved` names (e.g. stub method names like `dup()`) and symbols can't be accessed over RPC. + export type Provider = MaybeCallableProvider & Pick<{ + [K in keyof T]: MethodOrProperty; + }, Exclude>>; +} +declare namespace Cloudflare { + // Type of `env`. + // + // The specific project can extend `Env` by redeclaring it in project-specific files. Typescript + // will merge all declarations. + // + // You can use `wrangler types` to generate the `Env` type automatically. + interface Env { + } + // Project-specific parameters used to inform types. + // + // This interface is, again, intended to be declared in project-specific files, and then that + // declaration will be merged with this one. + // + // A project should have a declaration like this: + // + // interface GlobalProps { + // // Declares the main module's exports. Used to populate Cloudflare.Exports aka the type + // // of `ctx.exports`. + // mainModule: typeof import("my-main-module"); + // + // // Declares which of the main module's exports are configured with durable storage, and + // // thus should behave as Durable Object namsepace bindings. + // durableNamespaces: "MyDurableObject" | "AnotherDurableObject"; + // } + // + // You can use `wrangler types` to generate `GlobalProps` automatically. + interface GlobalProps { + } + // Evaluates to the type of a property in GlobalProps, defaulting to `Default` if it is not + // present. + type GlobalProp = K extends keyof GlobalProps ? GlobalProps[K] : Default; + // The type of the program's main module exports, if known. Requires `GlobalProps` to declare the + // `mainModule` property. + type MainModule = GlobalProp<"mainModule", {}>; + // The type of ctx.exports, which contains loopback bindings for all top-level exports. + type Exports = { + [K in keyof MainModule]: LoopbackForExport + // If the export is listed in `durableNamespaces`, then it is also a + // DurableObjectNamespace. + & (K extends GlobalProp<"durableNamespaces", never> ? MainModule[K] extends new (...args: any[]) => infer DoInstance ? DoInstance extends Rpc.DurableObjectBranded ? DurableObjectNamespace : DurableObjectNamespace : DurableObjectNamespace : {}); + }; +} +declare namespace CloudflareWorkersModule { + export type RpcStub = Rpc.Stub; + export const RpcStub: { + new (value: T): Rpc.Stub; + }; + export abstract class RpcTarget implements Rpc.RpcTargetBranded { + [Rpc.__RPC_TARGET_BRAND]: never; + } + // `protected` fields don't appear in `keyof`s, so can't be accessed over RPC + export abstract class WorkerEntrypoint implements Rpc.WorkerEntrypointBranded { + [Rpc.__WORKER_ENTRYPOINT_BRAND]: never; + protected ctx: ExecutionContext; + protected env: Env; + constructor(ctx: ExecutionContext, env: Env); + email?(message: ForwardableEmailMessage): void | Promise; + fetch?(request: Request): Response | Promise; + connect?(socket: Socket): void | Promise; + queue?(batch: MessageBatch): void | Promise; + scheduled?(controller: ScheduledController): void | Promise; + tail?(events: TraceItem[]): void | Promise; + tailStream?(event: TailStream.TailEvent): TailStream.TailEventHandlerType | Promise; + test?(controller: TestController): void | Promise; + trace?(traces: TraceItem[]): void | Promise; + } + export abstract class DurableObject implements Rpc.DurableObjectBranded { + [Rpc.__DURABLE_OBJECT_BRAND]: never; + protected ctx: DurableObjectState; + protected env: Env; + constructor(ctx: DurableObjectState, env: Env); + alarm?(alarmInfo?: AlarmInvocationInfo): void | Promise; + fetch?(request: Request): Response | Promise; + connect?(socket: Socket): void | Promise; + webSocketMessage?(ws: WebSocket, message: string | ArrayBuffer): void | Promise; + webSocketClose?(ws: WebSocket, code: number, reason: string, wasClean: boolean): void | Promise; + webSocketError?(ws: WebSocket, error: unknown): void | Promise; + } + export type WorkflowDurationLabel = 'second' | 'minute' | 'hour' | 'day' | 'week' | 'month' | 'year'; + export type WorkflowSleepDuration = `${number} ${WorkflowDurationLabel}${'s' | ''}` | number; + export type WorkflowDelayDuration = WorkflowSleepDuration; + export type WorkflowTimeoutDuration = WorkflowSleepDuration; + export type WorkflowRetentionDuration = WorkflowSleepDuration; + export type WorkflowBackoff = 'constant' | 'linear' | 'exponential'; + export type WorkflowStepConfig = { + retries?: { + limit: number; + delay: WorkflowDelayDuration | number; + backoff?: WorkflowBackoff; + }; + timeout?: WorkflowTimeoutDuration | number; + }; + export type WorkflowEvent = { + payload: Readonly; + timestamp: Date; + instanceId: string; + }; + export type WorkflowStepEvent = { + payload: Readonly; + timestamp: Date; + type: string; + }; + export type WorkflowStepContext = { + step: { + name: string; + count: number; + }; + attempt: number; + config: WorkflowStepConfig; + }; + export abstract class WorkflowStep { + do>(name: string, callback: (ctx: WorkflowStepContext) => Promise): Promise; + do>(name: string, config: WorkflowStepConfig, callback: (ctx: WorkflowStepContext) => Promise): Promise; + sleep: (name: string, duration: WorkflowSleepDuration) => Promise; + sleepUntil: (name: string, timestamp: Date | number) => Promise; + waitForEvent>(name: string, options: { + type: string; + timeout?: WorkflowTimeoutDuration | number; + }): Promise>; + } + export type WorkflowInstanceStatus = 'queued' | 'running' | 'paused' | 'errored' | 'terminated' | 'complete' | 'waiting' | 'waitingForPause' | 'unknown'; + export abstract class WorkflowEntrypoint | unknown = unknown> implements Rpc.WorkflowEntrypointBranded { + [Rpc.__WORKFLOW_ENTRYPOINT_BRAND]: never; + protected ctx: ExecutionContext; + protected env: Env; + constructor(ctx: ExecutionContext, env: Env); + run(event: Readonly>, step: WorkflowStep): Promise; + } + export function waitUntil(promise: Promise): void; + export function withEnv(newEnv: unknown, fn: () => unknown): unknown; + export function withExports(newExports: unknown, fn: () => unknown): unknown; + export function withEnvAndExports(newEnv: unknown, newExports: unknown, fn: () => unknown): unknown; + export const env: Cloudflare.Env; + export const exports: Cloudflare.Exports; + export const cache: CacheContext; + export const tracing: Tracing; +} +declare module 'cloudflare:workers' { + export = CloudflareWorkersModule; +} +interface SecretsStoreSecret { + /** + * Get a secret from the Secrets Store, returning a string of the secret value + * if it exists, or throws an error if it does not exist + */ + get(): Promise; +} +declare module "cloudflare:sockets" { + function _connect(address: string | SocketAddress, options?: SocketOptions): Socket; + export { _connect as connect }; +} +/** + * Binding entrypoint for Cloudflare Stream. + * + * Usage: + * - Binding-level operations: + * `await env.STREAM.videos.upload` + * `await env.STREAM.videos.createDirectUpload` + * `await env.STREAM.videos.*` + * `await env.STREAM.watermarks.*` + * - Per-video operations: + * `await env.STREAM.video(id).downloads.*` + * `await env.STREAM.video(id).captions.*` + * + * Example usage: + * ```ts + * await env.STREAM.video(id).downloads.generate(); + * + * const video = env.STREAM.video(id) + * const captions = video.captions.list(); + * const videoDetails = video.details() + * ``` + */ +interface StreamBinding { + /** + * Returns a handle scoped to a single video for per-video operations. + * @param id The unique identifier for the video. + * @returns A handle for per-video operations. + */ + video(id: string): StreamVideoHandle; + /** + * Uploads a new video from a provided URL. + * @param url The URL to upload from. + * @param params Optional upload parameters. + * @returns The uploaded video details. + * @throws {BadRequestError} if the upload parameter is invalid or the URL is invalid + * @throws {QuotaReachedError} if the account storage capacity is exceeded + * @throws {MaxFileSizeError} if the file size is too large + * @throws {RateLimitedError} if the server received too many requests + * @throws {AlreadyUploadedError} if a video was already uploaded to this URL + * @throws {InternalError} if an unexpected error occurs + */ + upload(url: string, params?: StreamUrlUploadParams): Promise; + /** + * Creates a direct upload that allows video uploads without an API key. + * @param params Parameters for the direct upload + * @returns The direct upload details. + * @throws {BadRequestError} if the parameters are invalid + * @throws {RateLimitedError} if the server received too many requests + * @throws {InternalError} if an unexpected error occurs + */ + createDirectUpload(params: StreamDirectUploadCreateParams): Promise; + videos: StreamVideos; + watermarks: StreamWatermarks; +} +/** + * Handle for operations scoped to a single Stream video. + */ +interface StreamVideoHandle { + /** + * The unique identifier for the video. + */ + id: string; + /** + * Get a full videos details + * @returns The full video details. + * @throws {NotFoundError} if the video is not found + * @throws {InternalError} if an unexpected error occurs + */ + details(): Promise; + /** + * Update details for a single video. + * @param params The fields to update for the video. + * @returns The updated video details. + * @throws {NotFoundError} if the video is not found + * @throws {BadRequestError} if the parameters are invalid + * @throws {InternalError} if an unexpected error occurs + */ + update(params: StreamUpdateVideoParams): Promise; + /** + * Deletes a video and its copies from Cloudflare Stream. + * @returns A promise that resolves when deletion completes. + * @throws {NotFoundError} if the video is not found + * @throws {InternalError} if an unexpected error occurs + */ + delete(): Promise; + /** + * Creates a signed URL token for a video. + * @returns The signed token that was created. + * @throws {InternalError} if the signing key cannot be retrieved or the token cannot be signed + */ + generateToken(): Promise; + downloads: StreamScopedDownloads; + captions: StreamScopedCaptions; +} +interface StreamVideo { + /** + * The unique identifier for the video. + */ + id: string; + /** + * A user-defined identifier for the media creator. + */ + creator: string | null; + /** + * The thumbnail URL for the video. + */ + thumbnail: string; + /** + * The thumbnail timestamp percentage. + */ + thumbnailTimestampPct: number; + /** + * Indicates whether the video is ready to stream. + */ + readyToStream: boolean; + /** + * The date and time the video became ready to stream. + */ + readyToStreamAt: string | null; + /** + * Processing status information. + */ + status: StreamVideoStatus; + /** + * A user modifiable key-value store. + */ + meta: Record; + /** + * The date and time the video was created. + */ + created: string; + /** + * The date and time the video was last modified. + */ + modified: string; + /** + * The date and time at which the video will be deleted. + */ + scheduledDeletion: string | null; + /** + * The size of the video in bytes. + */ + size: number; + /** + * The preview URL for the video. + */ + preview?: string; + /** + * Origins allowed to display the video. + */ + allowedOrigins: Array; + /** + * Indicates whether signed URLs are required. + */ + requireSignedURLs: boolean | null; + /** + * The date and time the video was uploaded. + */ + uploaded: string | null; + /** + * The date and time when the upload URL expires. + */ + uploadExpiry: string | null; + /** + * The maximum size in bytes for direct uploads. + */ + maxSizeBytes: number | null; + /** + * The maximum duration in seconds for direct uploads. + */ + maxDurationSeconds: number | null; + /** + * The video duration in seconds. -1 indicates unknown. + */ + duration: number; + /** + * Input metadata for the original upload. + */ + input: StreamVideoInput; + /** + * Playback URLs for the video. + */ + hlsPlaybackUrl: string; + dashPlaybackUrl: string; + /** + * The watermark applied to the video, if any. + */ + watermark: StreamWatermark | null; + /** + * The live input id associated with the video, if any. + */ + liveInputId?: string | null; + /** + * The source video id if this is a clip. + */ + clippedFromId: string | null; + /** + * Public details associated with the video. + */ + publicDetails: StreamPublicDetails | null; +} +type StreamVideoStatus = { + /** + * The current processing state. + */ + state: string; + /** + * The current processing step. + */ + step?: string; + /** + * The percent complete as a string. + */ + pctComplete?: string; + /** + * An error reason code, if applicable. + */ + errorReasonCode: string; + /** + * An error reason text, if applicable. + */ + errorReasonText: string; +}; +type StreamVideoInput = { + /** + * The input width in pixels. + */ + width: number; + /** + * The input height in pixels. + */ + height: number; +}; +type StreamPublicDetails = { + /** + * The public title for the video. + */ + title: string | null; + /** + * The public share link. + */ + share_link: string | null; + /** + * The public channel link. + */ + channel_link: string | null; + /** + * The public logo URL. + */ + logo: string | null; +}; +type StreamDirectUpload = { + /** + * The URL an unauthenticated upload can use for a single multipart request. + */ + uploadURL: string; + /** + * A Cloudflare-generated unique identifier for a media item. + */ + id: string; + /** + * The watermark profile applied to the upload. + */ + watermark: StreamWatermark | null; + /** + * The scheduled deletion time, if any. + */ + scheduledDeletion: string | null; +}; +type StreamDirectUploadCreateParams = { + /** + * The maximum duration in seconds for a video upload. + */ + maxDurationSeconds: number; + /** + * The date and time after upload when videos will not be accepted. + */ + expiry?: string; + /** + * A user-defined identifier for the media creator. + */ + creator?: string; + /** + * A user modifiable key-value store used to reference other systems of record for + * managing videos. + */ + meta?: Record; + /** + * Lists the origins allowed to display the video. + */ + allowedOrigins?: Array; + /** + * Indicates whether the video can be accessed using the id. When set to `true`, + * a signed token must be generated with a signing key to view the video. + */ + requireSignedURLs?: boolean; + /** + * The thumbnail timestamp percentage. + */ + thumbnailTimestampPct?: number; + /** + * The date and time at which the video will be deleted. Include `null` to remove + * a scheduled deletion. + */ + scheduledDeletion?: string | null; + /** + * The watermark profile to apply. + */ + watermark?: StreamDirectUploadWatermark; +}; +type StreamDirectUploadWatermark = { + /** + * The unique identifier for the watermark profile. + */ + id: string; +}; +type StreamUrlUploadParams = { + /** + * Lists the origins allowed to display the video. Enter allowed origin + * domains in an array and use `*` for wildcard subdomains. Empty arrays allow the + * video to be viewed on any origin. + */ + allowedOrigins?: Array; + /** + * A user-defined identifier for the media creator. + */ + creator?: string; + /** + * A user modifiable key-value store used to reference other systems of + * record for managing videos. + */ + meta?: Record; + /** + * Indicates whether the video can be a accessed using the id. When + * set to `true`, a signed token must be generated with a signing key to view the + * video. + */ + requireSignedURLs?: boolean; + /** + * Indicates the date and time at which the video will be deleted. Omit + * the field to indicate no change, or include with a `null` value to remove an + * existing scheduled deletion. If specified, must be at least 30 days from upload + * time. + */ + scheduledDeletion?: string | null; + /** + * The timestamp for a thumbnail image calculated as a percentage value + * of the video's duration. To convert from a second-wise timestamp to a + * percentage, divide the desired timestamp by the total duration of the video. If + * this value is not set, the default thumbnail image is taken from 0s of the + * video. + */ + thumbnailTimestampPct?: number; + /** + * The identifier for the watermark profile + */ + watermarkId?: string; +}; +interface StreamScopedCaptions { + /** + * Uploads the caption or subtitle file to the endpoint for a specific BCP47 language. + * One caption or subtitle file per language is allowed. + * @param language The BCP 47 language tag for the caption or subtitle. + * @param input The caption or subtitle stream to upload. + * @returns The created caption entry. + * @throws {NotFoundError} if the video is not found + * @throws {BadRequestError} if the language or file is invalid + * @throws {InternalError} if an unexpected error occurs + */ + upload(language: string, input: ReadableStream): Promise; + /** + * Generate captions or subtitles for the provided language via AI. + * @param language The BCP 47 language tag to generate. + * @returns The generated caption entry. + * @throws {NotFoundError} if the video is not found + * @throws {BadRequestError} if the language is invalid + * @throws {StreamError} if a generated caption already exists + * @throws {StreamError} if the video duration is too long + * @throws {StreamError} if the video is missing audio + * @throws {StreamError} if the requested language is not supported + * @throws {InternalError} if an unexpected error occurs + */ + generate(language: string): Promise; + /** + * Lists the captions or subtitles. + * Use the language parameter to filter by a specific language. + * @param language The optional BCP 47 language tag to filter by. + * @returns The list of captions or subtitles. + * @throws {NotFoundError} if the video or caption is not found + * @throws {InternalError} if an unexpected error occurs + */ + list(language?: string): Promise; + /** + * Removes the captions or subtitles from a video. + * @param language The BCP 47 language tag to remove. + * @returns A promise that resolves when deletion completes. + * @throws {NotFoundError} if the video or caption is not found + * @throws {InternalError} if an unexpected error occurs + */ + delete(language: string): Promise; +} +interface StreamScopedDownloads { + /** + * Generates a download for a video when a video is ready to view. Available + * types are `default` and `audio`. Defaults to `default` when omitted. + * @param downloadType The download type to create. + * @returns The current downloads for the video. + * @throws {NotFoundError} if the video is not found + * @throws {BadRequestError} if the download type is invalid + * @throws {StreamError} if the video duration is too long to generate a download + * @throws {StreamError} if the video is not ready to stream + * @throws {InternalError} if an unexpected error occurs + */ + generate(downloadType?: StreamDownloadType): Promise; + /** + * Lists the downloads created for a video. + * @returns The current downloads for the video. + * @throws {NotFoundError} if the video or downloads are not found + * @throws {InternalError} if an unexpected error occurs + */ + get(): Promise; + /** + * Delete the downloads for a video. Available types are `default` and `audio`. + * Defaults to `default` when omitted. + * @param downloadType The download type to delete. + * @returns A promise that resolves when deletion completes. + * @throws {NotFoundError} if the video or downloads are not found + * @throws {InternalError} if an unexpected error occurs + */ + delete(downloadType?: StreamDownloadType): Promise; +} +interface StreamVideos { + /** + * Lists all videos in a users account. + * @returns The list of videos. + * @throws {BadRequestError} if the parameters are invalid + * @throws {InternalError} if an unexpected error occurs + */ + list(params?: StreamVideosListParams): Promise; +} +interface StreamWatermarks { + /** + * Generate a new watermark profile + * @param input The image stream to upload + * @param params The watermark creation parameters. + * @returns The created watermark profile. + * @throws {BadRequestError} if the parameters are invalid + * @throws {InvalidURLError} if the URL is invalid + * @throws {TooManyWatermarksError} if the number of allowed watermarks is reached + * @throws {InternalError} if an unexpected error occurs + */ + generate(input: ReadableStream, params: StreamWatermarkCreateParams): Promise; + /** + * Generate a new watermark profile + * @param url The image url to upload + * @param params The watermark creation parameters. + * @returns The created watermark profile. + * @throws {BadRequestError} if the parameters are invalid + * @throws {InvalidURLError} if the URL is invalid + * @throws {TooManyWatermarksError} if the number of allowed watermarks is reached + * @throws {InternalError} if an unexpected error occurs + */ + generate(url: string, params: StreamWatermarkCreateParams): Promise; + /** + * Lists all watermark profiles for an account. + * @returns The list of watermark profiles. + * @throws {InternalError} if an unexpected error occurs + */ + list(): Promise; + /** + * Retrieves details for a single watermark profile. + * @param watermarkId The watermark profile identifier. + * @returns The watermark profile details. + * @throws {NotFoundError} if the watermark is not found + * @throws {InternalError} if an unexpected error occurs + */ + get(watermarkId: string): Promise; + /** + * Deletes a watermark profile. + * @param watermarkId The watermark profile identifier. + * @returns A promise that resolves when deletion completes. + * @throws {NotFoundError} if the watermark is not found + * @throws {InternalError} if an unexpected error occurs + */ + delete(watermarkId: string): Promise; +} +type StreamUpdateVideoParams = { + /** + * Lists the origins allowed to display the video. Enter allowed origin + * domains in an array and use `*` for wildcard subdomains. Empty arrays allow the + * video to be viewed on any origin. + */ + allowedOrigins?: Array; + /** + * A user-defined identifier for the media creator. + */ + creator?: string; + /** + * The maximum duration in seconds for a video upload. Can be set for a + * video that is not yet uploaded to limit its duration. Uploads that exceed the + * specified duration will fail during processing. A value of `-1` means the value + * is unknown. + */ + maxDurationSeconds?: number; + /** + * A user modifiable key-value store used to reference other systems of + * record for managing videos. + */ + meta?: Record; + /** + * Indicates whether the video can be a accessed using the id. When + * set to `true`, a signed token must be generated with a signing key to view the + * video. + */ + requireSignedURLs?: boolean; + /** + * Indicates the date and time at which the video will be deleted. Omit + * the field to indicate no change, or include with a `null` value to remove an + * existing scheduled deletion. If specified, must be at least 30 days from upload + * time. + */ + scheduledDeletion?: string | null; + /** + * The timestamp for a thumbnail image calculated as a percentage value + * of the video's duration. To convert from a second-wise timestamp to a + * percentage, divide the desired timestamp by the total duration of the video. If + * this value is not set, the default thumbnail image is taken from 0s of the + * video. + */ + thumbnailTimestampPct?: number; +}; +type StreamCaption = { + /** + * Whether the caption was generated via AI. + */ + generated?: boolean; + /** + * The language label displayed in the native language to users. + */ + label: string; + /** + * The language tag in BCP 47 format. + */ + language: string; + /** + * The status of a generated caption. + */ + status?: 'ready' | 'inprogress' | 'error'; +}; +type StreamDownloadStatus = 'ready' | 'inprogress' | 'error'; +type StreamDownloadType = 'default' | 'audio'; +type StreamDownload = { + /** + * Indicates the progress as a percentage between 0 and 100. + */ + percentComplete: number; + /** + * The status of a generated download. + */ + status: StreamDownloadStatus; + /** + * The URL to access the generated download. + */ + url?: string; +}; +/** + * An object with download type keys. Each key is optional and only present if that + * download type has been created. + */ +type StreamDownloadGetResponse = { + /** + * The audio-only download. Only present if this download type has been created. + */ + audio?: StreamDownload; + /** + * The default video download. Only present if this download type has been created. + */ + default?: StreamDownload; +}; +type StreamWatermarkPosition = 'upperRight' | 'upperLeft' | 'lowerLeft' | 'lowerRight' | 'center'; +type StreamWatermark = { + /** + * The unique identifier for a watermark profile. + */ + id: string; + /** + * The size of the image in bytes. + */ + size: number; + /** + * The height of the image in pixels. + */ + height: number; + /** + * The width of the image in pixels. + */ + width: number; + /** + * The date and a time a watermark profile was created. + */ + created: string; + /** + * The source URL for a downloaded image. If the watermark profile was created via + * direct upload, this field is null. + */ + downloadedFrom: string | null; + /** + * A short description of the watermark profile. + */ + name: string; + /** + * The translucency of the image. A value of `0.0` makes the image completely + * transparent, and `1.0` makes the image completely opaque. Note that if the image + * is already semi-transparent, setting this to `1.0` will not make the image + * completely opaque. + */ + opacity: number; + /** + * The whitespace between the adjacent edges (determined by position) of the video + * and the image. `0.0` indicates no padding, and `1.0` indicates a fully padded + * video width or length, as determined by the algorithm. + */ + padding: number; + /** + * The size of the image relative to the overall size of the video. This parameter + * will adapt to horizontal and vertical videos automatically. `0.0` indicates no + * scaling (use the size of the image as-is), and `1.0 `fills the entire video. + */ + scale: number; + /** + * The location of the image. Valid positions are: `upperRight`, `upperLeft`, + * `lowerLeft`, `lowerRight`, and `center`. Note that `center` ignores the + * `padding` parameter. + */ + position: StreamWatermarkPosition; +}; +type StreamWatermarkCreateParams = { + /** + * A short description of the watermark profile. + */ + name?: string; + /** + * The translucency of the image. A value of `0.0` makes the image completely + * transparent, and `1.0` makes the image completely opaque. Note that if the + * image is already semi-transparent, setting this to `1.0` will not make the + * image completely opaque. + */ + opacity?: number; + /** + * The whitespace between the adjacent edges (determined by position) of the + * video and the image. `0.0` indicates no padding, and `1.0` indicates a fully + * padded video width or length, as determined by the algorithm. + */ + padding?: number; + /** + * The size of the image relative to the overall size of the video. This + * parameter will adapt to horizontal and vertical videos automatically. `0.0` + * indicates no scaling (use the size of the image as-is), and `1.0 `fills the + * entire video. + */ + scale?: number; + /** + * The location of the image. + */ + position?: StreamWatermarkPosition; +}; +type StreamVideosListParams = { + /** + * The maximum number of videos to return. + */ + limit?: number; + /** + * Return videos created before this timestamp. + * (RFC3339/RFC3339Nano) + */ + before?: string; + /** + * Comparison operator for the `before` field. + * @default 'lt' + */ + beforeComp?: StreamPaginationComparison; + /** + * Return videos created after this timestamp. + * (RFC3339/RFC3339Nano) + */ + after?: string; + /** + * Comparison operator for the `after` field. + * @default 'gte' + */ + afterComp?: StreamPaginationComparison; +}; +type StreamPaginationComparison = 'eq' | 'gt' | 'gte' | 'lt' | 'lte'; +/** + * Error object for Stream binding operations. + */ +interface StreamError extends Error { + readonly code: number; + readonly statusCode: number; + readonly message: string; + readonly stack?: string; +} +interface InternalError extends StreamError { + name: 'InternalError'; +} +interface BadRequestError extends StreamError { + name: 'BadRequestError'; +} +interface NotFoundError extends StreamError { + name: 'NotFoundError'; +} +interface ForbiddenError extends StreamError { + name: 'ForbiddenError'; +} +interface RateLimitedError extends StreamError { + name: 'RateLimitedError'; +} +interface QuotaReachedError extends StreamError { + name: 'QuotaReachedError'; +} +interface MaxFileSizeError extends StreamError { + name: 'MaxFileSizeError'; +} +interface InvalidURLError extends StreamError { + name: 'InvalidURLError'; +} +interface AlreadyUploadedError extends StreamError { + name: 'AlreadyUploadedError'; +} +interface TooManyWatermarksError extends StreamError { + name: 'TooManyWatermarksError'; +} +type MarkdownDocument = { + name: string; + blob: Blob; +}; +type ConversionResponse = { + id: string; + name: string; + mimeType: string; + format: 'markdown'; + tokens: number; + data: string; +} | { + id: string; + name: string; + mimeType: string; + format: 'error'; + error: string; +}; +type ImageConversionOptions = { + descriptionLanguage?: 'en' | 'es' | 'fr' | 'it' | 'pt' | 'de'; +}; +type EmbeddedImageConversionOptions = ImageConversionOptions & { + convert?: boolean; + maxConvertedImages?: number; +}; +type ConversionOptions = { + html?: { + images?: EmbeddedImageConversionOptions & { + convertOGImage?: boolean; + }; + hostname?: string; + cssSelector?: string; + }; + docx?: { + images?: EmbeddedImageConversionOptions; + }; + image?: ImageConversionOptions; + pdf?: { + images?: EmbeddedImageConversionOptions; + metadata?: boolean; + }; +}; +type ConversionRequestOptions = { + gateway?: GatewayOptions; + extraHeaders?: object; + conversionOptions?: ConversionOptions; +}; +type SupportedFileFormat = { + mimeType: string; + extension: string; +}; +declare abstract class ToMarkdownService { + transform(files: MarkdownDocument[], options?: ConversionRequestOptions): Promise; + transform(files: MarkdownDocument, options?: ConversionRequestOptions): Promise; + supported(): Promise; +} +declare namespace TailStream { + interface Header { + readonly name: string; + readonly value: string; + } + interface FetchEventInfo { + readonly type: "fetch"; + readonly method: string; + readonly url: string; + readonly cfJson?: object; + readonly headers: Header[]; + } + interface JsRpcEventInfo { + readonly type: "jsrpc"; + } + interface ScheduledEventInfo { + readonly type: "scheduled"; + readonly scheduledTime: Date; + readonly cron: string; + } + interface AlarmEventInfo { + readonly type: "alarm"; + readonly scheduledTime: Date; + } + interface QueueEventInfo { + readonly type: "queue"; + readonly queueName: string; + readonly batchSize: number; + } + interface EmailEventInfo { + readonly type: "email"; + readonly mailFrom: string; + readonly rcptTo: string; + readonly rawSize: number; + } + interface TraceEventInfo { + readonly type: "trace"; + readonly traces: (string | null)[]; + } + interface HibernatableWebSocketEventInfoMessage { + readonly type: "message"; + } + interface HibernatableWebSocketEventInfoError { + readonly type: "error"; + } + interface HibernatableWebSocketEventInfoClose { + readonly type: "close"; + readonly code: number; + readonly wasClean: boolean; + } + interface HibernatableWebSocketEventInfo { + readonly type: "hibernatableWebSocket"; + readonly info: HibernatableWebSocketEventInfoClose | HibernatableWebSocketEventInfoError | HibernatableWebSocketEventInfoMessage; + } + interface CustomEventInfo { + readonly type: "custom"; + } + interface FetchResponseInfo { + readonly type: "fetch"; + readonly statusCode: number; + } + interface ConnectEventInfo { + readonly type: "connect"; + } + type EventOutcome = "ok" | "canceled" | "exception" | "unknown" | "killSwitch" | "daemonDown" | "exceededCpu" | "exceededMemory" | "loadShed" | "responseStreamDisconnected" | "scriptNotFound" | "internalError"; + interface ScriptVersion { + readonly id: string; + readonly tag?: string; + readonly message?: string; + } + interface TracePreviewInfo { + readonly id: string; + readonly slug: string; + readonly name: string; + } + interface Onset { + readonly type: "onset"; + readonly attributes: Attribute[]; + // id for the span being opened by this Onset event. + readonly spanId: string; + readonly dispatchNamespace?: string; + readonly entrypoint?: string; + readonly executionModel: string; + readonly scriptName?: string; + readonly scriptTags?: string[]; + readonly scriptVersion?: ScriptVersion; + readonly preview?: TracePreviewInfo; + readonly info: FetchEventInfo | ConnectEventInfo | JsRpcEventInfo | ScheduledEventInfo | AlarmEventInfo | QueueEventInfo | EmailEventInfo | TraceEventInfo | HibernatableWebSocketEventInfo | CustomEventInfo; + } + interface Outcome { + readonly type: "outcome"; + readonly outcome: EventOutcome; + readonly cpuTime: number; + readonly wallTime: number; + } + interface SpanOpen { + readonly type: "spanOpen"; + readonly name: string; + // id for the span being opened by this SpanOpen event. + readonly spanId: string; + readonly info?: FetchEventInfo | JsRpcEventInfo | Attributes; + } + interface SpanClose { + readonly type: "spanClose"; + readonly outcome: EventOutcome; + } + interface DiagnosticChannelEvent { + readonly type: "diagnosticChannel"; + readonly channel: string; + readonly message: any; + } + interface Exception { + readonly type: "exception"; + readonly name: string; + readonly message: string; + readonly stack?: string; + } + interface Log { + readonly type: "log"; + readonly level: "debug" | "error" | "info" | "log" | "warn"; + readonly message: object; + } + interface DroppedEventsDiagnostic { + readonly diagnosticsType: "droppedEvents"; + readonly count: number; + } + interface StreamDiagnostic { + readonly type: 'streamDiagnostic'; + // To add new diagnostic types, define a new interface and add it to this union type. + readonly diagnostic: DroppedEventsDiagnostic; + } + // This marks the worker handler return information. + // This is separate from Outcome because the worker invocation can live for a long time after + // returning. For example - Websockets that return an http upgrade response but then continue + // streaming information or SSE http connections. + interface Return { + readonly type: "return"; + readonly info?: FetchResponseInfo; + } + interface Attribute { + readonly name: string; + readonly value: string | string[] | boolean | boolean[] | number | number[] | bigint | bigint[]; + } + interface Attributes { + readonly type: "attributes"; + readonly info: Attribute[]; + } + type EventType = Onset | Outcome | SpanOpen | SpanClose | DiagnosticChannelEvent | Exception | Log | StreamDiagnostic | Return | Attributes; + // Context in which this trace event lives. + interface SpanContext { + // Single id for the entire top-level invocation + // This should be a new traceId for the first worker stage invoked in the eyeball request and then + // same-account service-bindings should reuse the same traceId but cross-account service-bindings + // should use a new traceId. + readonly traceId: string; + // spanId in which this event is handled + // for Onset and SpanOpen events this would be the parent span id + // for Outcome and SpanClose these this would be the span id of the opening Onset and SpanOpen events + // For Hibernate and Mark this would be the span under which they were emitted. + // spanId is not set ONLY if: + // 1. This is an Onset event + // 2. We are not inheriting any SpanContext. (e.g. this is a cross-account service binding or a new top-level invocation) + readonly spanId?: string; + } + interface TailEvent { + // invocation id of the currently invoked worker stage. + // invocation id will always be unique to every Onset event and will be the same until the Outcome event. + readonly invocationId: string; + // Inherited spanContext for this event. + readonly spanContext: SpanContext; + readonly timestamp: Date; + readonly sequence: number; + readonly event: Event; + } + type TailEventHandler = (event: TailEvent) => void | Promise; + type TailEventHandlerObject = { + outcome?: TailEventHandler; + spanOpen?: TailEventHandler; + spanClose?: TailEventHandler; + diagnosticChannel?: TailEventHandler; + exception?: TailEventHandler; + log?: TailEventHandler; + return?: TailEventHandler; + attributes?: TailEventHandler; + }; + type TailEventHandlerType = TailEventHandler | TailEventHandlerObject; +} +// Copyright (c) 2022-2023 Cloudflare, Inc. +// Licensed under the Apache 2.0 license found in the LICENSE file or at: +// https://opensource.org/licenses/Apache-2.0 +/** + * Data types supported for holding vector metadata. + */ +type VectorizeVectorMetadataValue = string | number | boolean | string[]; +/** + * Additional information to associate with a vector. + */ +type VectorizeVectorMetadata = VectorizeVectorMetadataValue | Record; +type VectorFloatArray = Float32Array | Float64Array; +interface VectorizeError { + code?: number; + error: string; +} +/** + * Comparison logic/operation to use for metadata filtering. + * + * This list is expected to grow as support for more operations are released. + */ +type VectorizeVectorMetadataFilterOp = '$eq' | '$ne' | '$lt' | '$lte' | '$gt' | '$gte'; +type VectorizeVectorMetadataFilterCollectionOp = '$in' | '$nin'; +/** + * Filter criteria for vector metadata used to limit the retrieved query result set. + */ +type VectorizeVectorMetadataFilter = { + [field: string]: Exclude | null | { + [Op in VectorizeVectorMetadataFilterOp]?: Exclude | null; + } | { + [Op in VectorizeVectorMetadataFilterCollectionOp]?: Exclude[]; + }; +}; +/** + * Supported distance metrics for an index. + * Distance metrics determine how other "similar" vectors are determined. + */ +type VectorizeDistanceMetric = "euclidean" | "cosine" | "dot-product"; +/** + * Metadata return levels for a Vectorize query. + * + * Default to "none". + * + * @property all Full metadata for the vector return set, including all fields (including those un-indexed) without truncation. This is a more expensive retrieval, as it requires additional fetching & reading of un-indexed data. + * @property indexed Return all metadata fields configured for indexing in the vector return set. This level of retrieval is "free" in that no additional overhead is incurred returning this data. However, note that indexed metadata is subject to truncation (especially for larger strings). + * @property none No indexed metadata will be returned. + */ +type VectorizeMetadataRetrievalLevel = "all" | "indexed" | "none"; +interface VectorizeQueryOptions { + topK?: number; + namespace?: string; + returnValues?: boolean; + returnMetadata?: boolean | VectorizeMetadataRetrievalLevel; + filter?: VectorizeVectorMetadataFilter; +} +/** + * Information about the configuration of an index. + */ +type VectorizeIndexConfig = { + dimensions: number; + metric: VectorizeDistanceMetric; +} | { + preset: string; // keep this generic, as we'll be adding more presets in the future and this is only in a read capacity +}; +/** + * Metadata about an existing index. + * + * This type is exclusively for the Vectorize **beta** and will be deprecated once Vectorize RC is released. + * See {@link VectorizeIndexInfo} for its post-beta equivalent. + */ +interface VectorizeIndexDetails { + /** The unique ID of the index */ + readonly id: string; + /** The name of the index. */ + name: string; + /** (optional) A human readable description for the index. */ + description?: string; + /** The index configuration, including the dimension size and distance metric. */ + config: VectorizeIndexConfig; + /** The number of records containing vectors within the index. */ + vectorsCount: number; +} +/** + * Metadata about an existing index. + */ +interface VectorizeIndexInfo { + /** The number of records containing vectors within the index. */ + vectorCount: number; + /** Number of dimensions the index has been configured for. */ + dimensions: number; + /** ISO 8601 datetime of the last processed mutation on in the index. All changes before this mutation will be reflected in the index state. */ + processedUpToDatetime: number; + /** UUIDv4 of the last mutation processed by the index. All changes before this mutation will be reflected in the index state. */ + processedUpToMutation: number; +} +/** + * Represents a single vector value set along with its associated metadata. + */ +interface VectorizeVector { + /** The ID for the vector. This can be user-defined, and must be unique. It should uniquely identify the object, and is best set based on the ID of what the vector represents. */ + id: string; + /** The vector values */ + values: VectorFloatArray | number[]; + /** The namespace this vector belongs to. */ + namespace?: string; + /** Metadata associated with the vector. Includes the values of other fields and potentially additional details. */ + metadata?: Record; +} +/** + * Represents a matched vector for a query along with its score and (if specified) the matching vector information. + */ +type VectorizeMatch = Pick, "values"> & Omit & { + /** The score or rank for similarity, when returned as a result */ + score: number; +}; +/** + * A set of matching {@link VectorizeMatch} for a particular query. + */ +interface VectorizeMatches { + matches: VectorizeMatch[]; + count: number; +} +/** + * Results of an operation that performed a mutation on a set of vectors. + * Here, `ids` is a list of vectors that were successfully processed. + * + * This type is exclusively for the Vectorize **beta** and will be deprecated once Vectorize RC is released. + * See {@link VectorizeAsyncMutation} for its post-beta equivalent. + */ +interface VectorizeVectorMutation { + /* List of ids of vectors that were successfully processed. */ + ids: string[]; + /* Total count of the number of processed vectors. */ + count: number; +} +/** + * Result type indicating a mutation on the Vectorize Index. + * Actual mutations are processed async where the `mutationId` is the unique identifier for the operation. + */ +interface VectorizeAsyncMutation { + /** The unique identifier for the async mutation operation containing the changeset. */ + mutationId: string; +} +/** + * A Vectorize Vector Search Index for querying vectors/embeddings. + * + * This type is exclusively for the Vectorize **beta** and will be deprecated once Vectorize RC is released. + * See {@link Vectorize} for its new implementation. + */ +declare abstract class VectorizeIndex { + /** + * Get information about the currently bound index. + * @returns A promise that resolves with information about the current index. + */ + public describe(): Promise; + /** + * Use the provided vector to perform a similarity search across the index. + * @param vector Input vector that will be used to drive the similarity search. + * @param options Configuration options to massage the returned data. + * @returns A promise that resolves with matched and scored vectors. + */ + public query(vector: VectorFloatArray | number[], options?: VectorizeQueryOptions): Promise; + /** + * Insert a list of vectors into the index dataset. If a provided id exists, an error will be thrown. + * @param vectors List of vectors that will be inserted. + * @returns A promise that resolves with the ids & count of records that were successfully processed. + */ + public insert(vectors: VectorizeVector[]): Promise; + /** + * Upsert a list of vectors into the index dataset. If a provided id exists, it will be replaced with the new values. + * @param vectors List of vectors that will be upserted. + * @returns A promise that resolves with the ids & count of records that were successfully processed. + */ + public upsert(vectors: VectorizeVector[]): Promise; + /** + * Delete a list of vectors with a matching id. + * @param ids List of vector ids that should be deleted. + * @returns A promise that resolves with the ids & count of records that were successfully processed (and thus deleted). + */ + public deleteByIds(ids: string[]): Promise; + /** + * Get a list of vectors with a matching id. + * @param ids List of vector ids that should be returned. + * @returns A promise that resolves with the raw unscored vectors matching the id set. + */ + public getByIds(ids: string[]): Promise; +} +/** + * A Vectorize Vector Search Index for querying vectors/embeddings. + * + * Mutations in this version are async, returning a mutation id. + */ +declare abstract class Vectorize { + /** + * Get information about the currently bound index. + * @returns A promise that resolves with information about the current index. + */ + public describe(): Promise; + /** + * Use the provided vector to perform a similarity search across the index. + * @param vector Input vector that will be used to drive the similarity search. + * @param options Configuration options to massage the returned data. + * @returns A promise that resolves with matched and scored vectors. + */ + public query(vector: VectorFloatArray | number[], options?: VectorizeQueryOptions): Promise; + /** + * Use the provided vector-id to perform a similarity search across the index. + * @param vectorId Id for a vector in the index against which the index should be queried. + * @param options Configuration options to massage the returned data. + * @returns A promise that resolves with matched and scored vectors. + */ + public queryById(vectorId: string, options?: VectorizeQueryOptions): Promise; + /** + * Insert a list of vectors into the index dataset. If a provided id exists, an error will be thrown. + * @param vectors List of vectors that will be inserted. + * @returns A promise that resolves with a unique identifier of a mutation containing the insert changeset. + */ + public insert(vectors: VectorizeVector[]): Promise; + /** + * Upsert a list of vectors into the index dataset. If a provided id exists, it will be replaced with the new values. + * @param vectors List of vectors that will be upserted. + * @returns A promise that resolves with a unique identifier of a mutation containing the upsert changeset. + */ + public upsert(vectors: VectorizeVector[]): Promise; + /** + * Delete a list of vectors with a matching id. + * @param ids List of vector ids that should be deleted. + * @returns A promise that resolves with a unique identifier of a mutation containing the delete changeset. + */ + public deleteByIds(ids: string[]): Promise; + /** + * Get a list of vectors with a matching id. + * @param ids List of vector ids that should be returned. + * @returns A promise that resolves with the raw unscored vectors matching the id set. + */ + public getByIds(ids: string[]): Promise; +} +/** + * The interface for "version_metadata" binding + * providing metadata about the Worker Version using this binding. + */ +type WorkerVersionMetadata = { + /** The ID of the Worker Version using this binding */ + id: string; + /** The tag of the Worker Version using this binding */ + tag: string; + /** The timestamp of when the Worker Version was uploaded */ + timestamp: string; +}; +interface DynamicDispatchLimits { + /** + * Limit CPU time in milliseconds. + */ + cpuMs?: number; + /** + * Limit number of subrequests. + */ + subRequests?: number; +} +interface DynamicDispatchOptions { + /** + * Limit resources of invoked Worker script. + */ + limits?: DynamicDispatchLimits; + /** + * Arguments for outbound Worker script, if configured. + */ + outbound?: { + [key: string]: any; + }; +} +interface DispatchNamespace { + /** + * @param name Name of the Worker script. + * @param args Arguments to Worker script. + * @param options Options for Dynamic Dispatch invocation. + * @returns A Fetcher object that allows you to send requests to the Worker script. + * @throws If the Worker script does not exist in this dispatch namespace, an error will be thrown. + */ + get(name: string, args?: { + [key: string]: any; + }, options?: DynamicDispatchOptions): Fetcher; +} +declare module 'cloudflare:workflows' { + /** + * NonRetryableError allows for a user to throw a fatal error + * that makes a Workflow instance fail immediately without triggering a retry + */ + export class NonRetryableError extends Error { + public constructor(message: string, name?: string); + } +} +declare abstract class Workflow { + /** + * Get a handle to an existing instance of the Workflow. + * @param id Id for the instance of this Workflow + * @returns A promise that resolves with a handle for the Instance + */ + public get(id: string): Promise; + /** + * Create a new instance and return a handle to it. If a provided id exists, an error will be thrown. + * @param options Options when creating an instance including id and params + * @returns A promise that resolves with a handle for the Instance + */ + public create(options?: WorkflowInstanceCreateOptions): Promise; + /** + * Create a batch of instances and return handle for all of them. If a provided id exists, an error will be thrown. + * `createBatch` is limited at 100 instances at a time or when the RPC limit for the batch (1MiB) is reached. + * @param batch List of Options when creating an instance including name and params + * @returns A promise that resolves with a list of handles for the created instances. + */ + public createBatch(batch: WorkflowInstanceCreateOptions[]): Promise; +} +type WorkflowDurationLabel = 'second' | 'minute' | 'hour' | 'day' | 'week' | 'month' | 'year'; +type WorkflowSleepDuration = `${number} ${WorkflowDurationLabel}${'s' | ''}` | number; +type WorkflowRetentionDuration = WorkflowSleepDuration; +interface WorkflowInstanceCreateOptions { + /** + * An id for your Workflow instance. Must be unique within the Workflow. + */ + id?: string; + /** + * The event payload the Workflow instance is triggered with + */ + params?: PARAMS; + /** + * The retention policy for Workflow instance. + * Defaults to the maximum retention period available for the owner's account. + */ + retention?: { + successRetention?: WorkflowRetentionDuration; + errorRetention?: WorkflowRetentionDuration; + }; +} +type InstanceStatus = { + status: 'queued' // means that instance is waiting to be started (see concurrency limits) + | 'running' | 'paused' | 'errored' | 'terminated' // user terminated the instance while it was running + | 'complete' | 'waiting' // instance is hibernating and waiting for sleep or event to finish + | 'waitingForPause' // instance is finishing the current work to pause + | 'unknown'; + error?: { + name: string; + message: string; + }; + output?: unknown; +}; +interface WorkflowError { + code?: number; + message: string; +} +declare abstract class WorkflowInstance { + public id: string; + /** + * Pause the instance. + */ + public pause(): Promise; + /** + * Resume the instance. If it is already running, an error will be thrown. + */ + public resume(): Promise; + /** + * Terminate the instance. If it is errored, terminated or complete, an error will be thrown. + */ + public terminate(): Promise; + /** + * Restart the instance. + */ + public restart(): Promise; + /** + * Returns the current status of the instance. + */ + public status(): Promise; + /** + * Send an event to this instance. + */ + public sendEvent({ type, payload, }: { + type: string; + payload: unknown; + }): Promise; +} diff --git a/edge-api/wrangler.jsonc b/edge-api/wrangler.jsonc new file mode 100644 index 0000000000..993b4f4ebf --- /dev/null +++ b/edge-api/wrangler.jsonc @@ -0,0 +1,32 @@ +{ + "$schema": "node_modules/wrangler/config-schema.json", + "name": "edge-api", + "main": "src/index.ts", + "compatibility_date": "2026-05-10", + "compatibility_flags": [ + "nodejs_compat" + ], + "workers_dev": true, + "observability": { + "enabled": true + }, + "upload_source_maps": true, + "vars": { + "APP_NAME": "edge-api", + "COURSE_NAME": "DevOps Core S26", + "APP_VERSION": "1.0.1", + "ENVIRONMENT": "production" + }, + "secrets": { + "required": [ + "API_TOKEN", + "ADMIN_EMAIL" + ] + }, + "kv_namespaces": [ + { + "binding": "SETTINGS", + "id": "a7dd06a571e7468d9906db5d52c32d12" + } + ] +} From 39e401e887e4c74506a1f0fe4beb1872ffbd6f0b Mon Sep 17 00:00:00 2001 From: LocalT0aster <90502400+LocalT0aster@users.noreply.github.com> Date: Fri, 15 May 2026 00:00:27 +0300 Subject: [PATCH 18/21] app_python: moving from Poetry to uv docker: set writable home for uv app image docker: use uv binary and real app home Co-authored-by: OpenAI Codex --- .github/actions/python-setup/action.yml | 38 +- .github/workflows/python-ci.yml | 12 +- app_python/.dockerignore | 2 +- app_python/Dockerfile | 30 +- app_python/README.md | 16 +- app_python/poetry.lock | 746 ------------------------ app_python/pyproject.toml | 24 +- app_python/uv.lock | 410 +++++++++++++ 8 files changed, 470 insertions(+), 808 deletions(-) delete mode 100644 app_python/poetry.lock create mode 100644 app_python/uv.lock diff --git a/.github/actions/python-setup/action.yml b/.github/actions/python-setup/action.yml index 626200b3f9..df80ebed36 100644 --- a/.github/actions/python-setup/action.yml +++ b/.github/actions/python-setup/action.yml @@ -1,27 +1,27 @@ -name: Python Poetry Setup -description: Set up Python + Poetry, cache dependencies, and install project deps +name: Python uv Setup +description: Set up Python + uv, cache dependencies, and install project deps inputs: python-version: description: Python version to install required: false default: "3.14" - poetry-version: - description: Poetry version to install + uv-version: + description: uv version to install required: false - default: "2.3.2" + default: "0.9.30" working-directory: description: Project directory containing pyproject.toml required: false default: "app_python" lockfile-path: - description: Path to poetry.lock for cache key invalidation + description: Path to uv.lock for cache key invalidation required: false - default: "app_python/poetry.lock" + default: "app_python/uv.lock" install-args: - description: Extra arguments passed to poetry install + description: Extra arguments passed to uv sync required: false - default: "--with dev --no-interaction --no-ansi" + default: "--frozen" runs: using: composite @@ -31,27 +31,21 @@ runs: with: python-version: ${{ inputs.python-version }} - - name: Install Poetry - uses: snok/install-poetry@v1 - with: - version: ${{ inputs.poetry-version }} - - - name: Configure Poetry virtualenv location + - name: Install uv shell: bash - working-directory: ${{ inputs.working-directory }} - run: poetry config virtualenvs.in-project true + run: python -m pip install --upgrade "uv==${{ inputs.uv-version }}" - - name: Cache Poetry dependencies + - name: Cache uv dependencies uses: actions/cache@v5 with: path: | - ~/.cache/pypoetry + ~/.cache/uv ${{ inputs.working-directory }}/.venv - key: ${{ runner.os }}-py${{ inputs.python-version }}-poetry${{ inputs.poetry-version }}-${{ hashFiles(inputs.lockfile-path) }} + key: ${{ runner.os }}-py${{ inputs.python-version }}-uv${{ inputs.uv-version }}-${{ hashFiles(inputs.lockfile-path) }} restore-keys: | - ${{ runner.os }}-py${{ inputs.python-version }}-poetry${{ inputs.poetry-version }}- + ${{ runner.os }}-py${{ inputs.python-version }}-uv${{ inputs.uv-version }}- - name: Install dependencies shell: bash working-directory: ${{ inputs.working-directory }} - run: poetry install ${{ inputs.install-args }} + run: uv sync ${{ inputs.install-args }} diff --git a/.github/workflows/python-ci.yml b/.github/workflows/python-ci.yml index 62c6a465fd..c6f7c29752 100644 --- a/.github/workflows/python-ci.yml +++ b/.github/workflows/python-ci.yml @@ -20,7 +20,7 @@ jobs: fail-fast: false matrix: python-version: [3.14] - poetry-version: [2.3.2] + uv-version: [0.9.30] os: [ubuntu-latest] runs-on: ${{ matrix.os }} defaults: @@ -32,16 +32,16 @@ jobs: uses: ./.github/actions/python-setup with: python-version: ${{ matrix.python-version }} - poetry-version: ${{ matrix.poetry-version }} + uv-version: ${{ matrix.uv-version }} working-directory: app_python - lockfile-path: app_python/poetry.lock - install-args: --with dev --no-interaction --no-ansi + lockfile-path: app_python/uv.lock + install-args: --frozen - name: Lint with flake8 - run: poetry run flake8 src tests + run: uv run flake8 src tests - name: Test using pytest with coverage report run: | mkdir -p test-results - poetry run pytest \ + uv run pytest \ --junitxml=test-results/pytest-report.xml \ --cov=src \ --cov-report=term-missing \ diff --git a/app_python/.dockerignore b/app_python/.dockerignore index deb2fd9687..64b0526ee0 100644 --- a/app_python/.dockerignore +++ b/app_python/.dockerignore @@ -1,5 +1,5 @@ * !src/** !pyproject.toml -!poetry.lock +!uv.lock !gunicorn.conf.py diff --git a/app_python/Dockerfile b/app_python/Dockerfile index a123b9e3be..edaf12cd32 100644 --- a/app_python/Dockerfile +++ b/app_python/Dockerfile @@ -1,24 +1,32 @@ +# syntax=docker/dockerfile:1 FROM python:3.14-alpine -RUN apk upgrade -U + +COPY --from=ghcr.io/astral-sh/uv:0.11.14 /uv /uvx /bin/ ENV PYTHONDONTWRITEBYTECODE=1 ENV PYTHONUNBUFFERED=1 -ENV POETRY_VERSION=2.3.2 - -RUN pip install --no-cache-dir "poetry==$POETRY_VERSION" \ - && addgroup appgroup \ - && adduser --disabled-password --gecos "" --no-create-home -s /bin/sh appuser -G appgroup +ENV UV_COMPILE_BYTECODE=1 +ENV UV_LINK_MODE=copy +ENV UV_PROJECT_ENVIRONMENT=/app/.venv +ENV HOME=/home/appuser +ENV PATH="/app/.venv/bin:$PATH" WORKDIR /app -COPY pyproject.toml poetry.lock gunicorn.conf.py ./ -RUN poetry config virtualenvs.create false \ - && poetry install --only main --no-interaction --no-ansi --no-root +RUN apk upgrade -U \ + && addgroup -S appgroup \ + && adduser -S -D -h /home/appuser -s /sbin/nologin -G appgroup appuser \ + && mkdir -p /data \ + && chown -R appuser:appgroup /app /data /home/appuser + +COPY pyproject.toml uv.lock gunicorn.conf.py ./ +RUN --mount=type=cache,target=/root/.cache/uv \ + uv sync --locked --no-dev --no-install-project -COPY src ./src +COPY --chown=appuser:appgroup src ./src ENV PORT=5000 ENV HOST="0.0.0.0" USER appuser -CMD ["sh", "-c", "gunicorn --config /app/gunicorn.conf.py src.main:app"] +CMD ["gunicorn", "--config", "/app/gunicorn.conf.py", "src.main:app"] diff --git a/app_python/README.md b/app_python/README.md index e9e3dd1bca..a172eb1b79 100644 --- a/app_python/README.md +++ b/app_python/README.md @@ -9,12 +9,12 @@ Small Flask web service that reports service metadata, system information, runti ## Prerequisites - Python 3.14+ -- Poetry +- uv ## Installation ```bash -poetry install +uv sync ``` ### Docker @@ -29,7 +29,7 @@ poetry install ``` The Docker build installs dependencies with: ```bash - poetry install --only main --no-root + uv sync --frozen --no-dev --no-install-project ``` ## Running the Application @@ -37,8 +37,8 @@ poetry install Production-style local run with Gunicorn: ```bash -poetry run gunicorn --config gunicorn.conf.py src.main:app -HOST=127.0.0.1 PORT=8080 poetry run gunicorn --config gunicorn.conf.py src.main:app +uv run gunicorn --config gunicorn.conf.py src.main:app +HOST=127.0.0.1 PORT=8080 uv run gunicorn --config gunicorn.conf.py src.main:app ``` Gunicorn access logs are emitted as JSON so Loki can parse request fields cleanly. @@ -86,8 +86,8 @@ For Lab 12, run the monitoring stack with a writable `/data` volume for the Pyth The project uses `pytest` for unit tests. ```bash -poetry install --with dev -poetry run pytest --cov=src --cov-report=term-missing +uv sync +uv run pytest --cov=src --cov-report=term-missing ``` The test suite covers: @@ -101,5 +101,5 @@ The test suite covers: ## Linting ```bash -poetry run flake8 src tests +uv run flake8 src tests ``` diff --git a/app_python/poetry.lock b/app_python/poetry.lock deleted file mode 100644 index 82248b12d8..0000000000 --- a/app_python/poetry.lock +++ /dev/null @@ -1,746 +0,0 @@ -# This file is automatically @generated by Poetry 2.3.2 and should not be changed by hand. - -[[package]] -name = "blinker" -version = "1.9.0" -description = "Fast, simple object-to-object and broadcast signaling" -optional = false -python-versions = ">=3.9" -groups = ["main"] -files = [ - {file = "blinker-1.9.0-py3-none-any.whl", hash = "sha256:ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc"}, - {file = "blinker-1.9.0.tar.gz", hash = "sha256:b4ce2265a7abece45e7cc896e98dbebe6cead56bcf805a3d23136d145f5445bf"}, -] - -[[package]] -name = "certifi" -version = "2026.2.25" -description = "Python package for providing Mozilla's CA Bundle." -optional = false -python-versions = ">=3.7" -groups = ["main"] -files = [ - {file = "certifi-2026.2.25-py3-none-any.whl", hash = "sha256:027692e4402ad994f1c42e52a4997a9763c646b73e4096e4d5d6db8af1d6f0fa"}, - {file = "certifi-2026.2.25.tar.gz", hash = "sha256:e887ab5cee78ea814d3472169153c2d12cd43b14bd03329a39a9c6e2e80bfba7"}, -] - -[[package]] -name = "charset-normalizer" -version = "3.4.7" -description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -optional = false -python-versions = ">=3.7" -groups = ["main"] -files = [ - {file = "charset_normalizer-3.4.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cdd68a1fb318e290a2077696b7eb7a21a49163c455979c639bf5a5dcdc46617d"}, - {file = "charset_normalizer-3.4.7-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e17b8d5d6a8c47c85e68ca8379def1303fd360c3e22093a807cd34a71cd082b8"}, - {file = "charset_normalizer-3.4.7-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:511ef87c8aec0783e08ac18565a16d435372bc1ac25a91e6ac7f5ef2b0bff790"}, - {file = "charset_normalizer-3.4.7-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:007d05ec7321d12a40227aae9e2bc6dca73f3cb21058999a1df9e193555a9dcc"}, - {file = "charset_normalizer-3.4.7-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cf29836da5119f3c8a8a70667b0ef5fdca3bb12f80fd06487cfa575b3909b393"}, - {file = "charset_normalizer-3.4.7-cp310-cp310-manylinux_2_31_armv7l.whl", hash = "sha256:12d8baf840cc7889b37c7c770f478adea7adce3dcb3944d02ec87508e2dcf153"}, - {file = "charset_normalizer-3.4.7-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d560742f3c0d62afaccf9f41fe485ed69bd7661a241f86a3ef0f0fb8b1a397af"}, - {file = "charset_normalizer-3.4.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b14b2d9dac08e28bb8046a1a0434b1750eb221c8f5b87a68f4fa11a6f97b5e34"}, - {file = "charset_normalizer-3.4.7-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:bc17a677b21b3502a21f66a8cc64f5bfad4df8a0b8434d661666f8ce90ac3af1"}, - {file = "charset_normalizer-3.4.7-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:750e02e074872a3fad7f233b47734166440af3cdea0add3e95163110816d6752"}, - {file = "charset_normalizer-3.4.7-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:4e5163c14bffd570ef2affbfdd77bba66383890797df43dc8b4cc7d6f500bf53"}, - {file = "charset_normalizer-3.4.7-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:6ed74185b2db44f41ef35fd1617c5888e59792da9bbc9190d6c7300617182616"}, - {file = "charset_normalizer-3.4.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:94e1885b270625a9a828c9793b4d52a64445299baa1fea5a173bf1d3dd9a1a5a"}, - {file = "charset_normalizer-3.4.7-cp310-cp310-win32.whl", hash = "sha256:6785f414ae0f3c733c437e0f3929197934f526d19dfaa75e18fdb4f94c6fb374"}, - {file = "charset_normalizer-3.4.7-cp310-cp310-win_amd64.whl", hash = "sha256:6696b7688f54f5af4462118f0bfa7c1621eeb87154f77fa04b9295ce7a8f2943"}, - {file = "charset_normalizer-3.4.7-cp310-cp310-win_arm64.whl", hash = "sha256:66671f93accb62ed07da56613636f3641f1a12c13046ce91ffc923721f23c008"}, - {file = "charset_normalizer-3.4.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7641bb8895e77f921102f72833904dcd9901df5d6d72a2ab8f31d04b7e51e4e7"}, - {file = "charset_normalizer-3.4.7-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:202389074300232baeb53ae2569a60901f7efadd4245cf3a3bf0617d60b439d7"}, - {file = "charset_normalizer-3.4.7-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:30b8d1d8c52a48c2c5690e152c169b673487a2a58de1ec7393196753063fcd5e"}, - {file = "charset_normalizer-3.4.7-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:532bc9bf33a68613fd7d65e4b1c71a6a38d7d42604ecf239c77392e9b4e8998c"}, - {file = "charset_normalizer-3.4.7-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2fe249cb4651fd12605b7288b24751d8bfd46d35f12a20b1ba33dea122e690df"}, - {file = "charset_normalizer-3.4.7-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:65bcd23054beab4d166035cabbc868a09c1a49d1efe458fe8e4361215df40265"}, - {file = "charset_normalizer-3.4.7-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:08e721811161356f97b4059a9ba7bafb23ea5ee2255402c42881c214e173c6b4"}, - {file = "charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e060d01aec0a910bdccb8be71faf34e7799ce36950f8294c8bf612cba65a2c9e"}, - {file = "charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:38c0109396c4cfc574d502df99742a45c72c08eff0a36158b6f04000043dbf38"}, - {file = "charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:1c2a768fdd44ee4a9339a9b0b130049139b8ce3c01d2ce09f67f5a68048d477c"}, - {file = "charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:1a87ca9d5df6fe460483d9a5bbf2b18f620cbed41b432e2bddb686228282d10b"}, - {file = "charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:d635aab80466bc95771bb78d5370e74d36d1fe31467b6b29b8b57b2a3cd7d22c"}, - {file = "charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ae196f021b5e7c78e918242d217db021ed2a6ace2bc6ae94c0fc596221c7f58d"}, - {file = "charset_normalizer-3.4.7-cp311-cp311-win32.whl", hash = "sha256:adb2597b428735679446b46c8badf467b4ca5f5056aae4d51a19f9570301b1ad"}, - {file = "charset_normalizer-3.4.7-cp311-cp311-win_amd64.whl", hash = "sha256:8e385e4267ab76874ae30db04c627faaaf0b509e1ccc11a95b3fc3e83f855c00"}, - {file = "charset_normalizer-3.4.7-cp311-cp311-win_arm64.whl", hash = "sha256:d4a48e5b3c2a489fae013b7589308a40146ee081f6f509e047e0e096084ceca1"}, - {file = "charset_normalizer-3.4.7-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:eca9705049ad3c7345d574e3510665cb2cf844c2f2dcfe675332677f081cbd46"}, - {file = "charset_normalizer-3.4.7-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6178f72c5508bfc5fd446a5905e698c6212932f25bcdd4b47a757a50605a90e2"}, - {file = "charset_normalizer-3.4.7-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e1421b502d83040e6d7fb2fb18dff63957f720da3d77b2fbd3187ceb63755d7b"}, - {file = "charset_normalizer-3.4.7-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:edac0f1ab77644605be2cbba52e6b7f630731fc42b34cb0f634be1a6eface56a"}, - {file = "charset_normalizer-3.4.7-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5649fd1c7bade02f320a462fdefd0b4bd3ce036065836d4f42e0de958038e116"}, - {file = "charset_normalizer-3.4.7-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:203104ed3e428044fd943bc4bf45fa73c0730391f9621e37fe39ecf477b128cb"}, - {file = "charset_normalizer-3.4.7-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:298930cec56029e05497a76988377cbd7457ba864beeea92ad7e844fe74cd1f1"}, - {file = "charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:708838739abf24b2ceb208d0e22403dd018faeef86ddac04319a62ae884c4f15"}, - {file = "charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:0f7eb884681e3938906ed0434f20c63046eacd0111c4ba96f27b76084cd679f5"}, - {file = "charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4dc1e73c36828f982bfe79fadf5919923f8a6f4df2860804db9a98c48824ce8d"}, - {file = "charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:aed52fea0513bac0ccde438c188c8a471c4e0f457c2dd20cdbf6ea7a450046c7"}, - {file = "charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:fea24543955a6a729c45a73fe90e08c743f0b3334bbf3201e6c4bc1b0c7fa464"}, - {file = "charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:bb6d88045545b26da47aa879dd4a89a71d1dce0f0e549b1abcb31dfe4a8eac49"}, - {file = "charset_normalizer-3.4.7-cp312-cp312-win32.whl", hash = "sha256:2257141f39fe65a3fdf38aeccae4b953e5f3b3324f4ff0daf9f15b8518666a2c"}, - {file = "charset_normalizer-3.4.7-cp312-cp312-win_amd64.whl", hash = "sha256:5ed6ab538499c8644b8a3e18debabcd7ce684f3fa91cf867521a7a0279cab2d6"}, - {file = "charset_normalizer-3.4.7-cp312-cp312-win_arm64.whl", hash = "sha256:56be790f86bfb2c98fb742ce566dfb4816e5a83384616ab59c49e0604d49c51d"}, - {file = "charset_normalizer-3.4.7-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f496c9c3cc02230093d8330875c4c3cdfc3b73612a5fd921c65d39cbcef08063"}, - {file = "charset_normalizer-3.4.7-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ea948db76d31190bf08bd371623927ee1339d5f2a0b4b1b4a4439a65298703c"}, - {file = "charset_normalizer-3.4.7-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a277ab8928b9f299723bc1a2dabb1265911b1a76341f90a510368ca44ad9ab66"}, - {file = "charset_normalizer-3.4.7-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3bec022aec2c514d9cf199522a802bd007cd588ab17ab2525f20f9c34d067c18"}, - {file = "charset_normalizer-3.4.7-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e044c39e41b92c845bc815e5ae4230804e8e7bc29e399b0437d64222d92809dd"}, - {file = "charset_normalizer-3.4.7-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:f495a1652cf3fbab2eb0639776dad966c2fb874d79d87ca07f9d5f059b8bd215"}, - {file = "charset_normalizer-3.4.7-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e712b419df8ba5e42b226c510472b37bd57b38e897d3eca5e8cfd410a29fa859"}, - {file = "charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7804338df6fcc08105c7745f1502ba68d900f45fd770d5bdd5288ddccb8a42d8"}, - {file = "charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:481551899c856c704d58119b5025793fa6730adda3571971af568f66d2424bb5"}, - {file = "charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f59099f9b66f0d7145115e6f80dd8b1d847176df89b234a5a6b3f00437aa0832"}, - {file = "charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:f59ad4c0e8f6bba240a9bb85504faa1ab438237199d4cce5f622761507b8f6a6"}, - {file = "charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:3dedcc22d73ec993f42055eff4fcfed9318d1eeb9a6606c55892a26964964e48"}, - {file = "charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:64f02c6841d7d83f832cd97ccf8eb8a906d06eb95d5276069175c696b024b60a"}, - {file = "charset_normalizer-3.4.7-cp313-cp313-win32.whl", hash = "sha256:4042d5c8f957e15221d423ba781e85d553722fc4113f523f2feb7b188cc34c5e"}, - {file = "charset_normalizer-3.4.7-cp313-cp313-win_amd64.whl", hash = "sha256:3946fa46a0cf3e4c8cb1cc52f56bb536310d34f25f01ca9b6c16afa767dab110"}, - {file = "charset_normalizer-3.4.7-cp313-cp313-win_arm64.whl", hash = "sha256:80d04837f55fc81da168b98de4f4b797ef007fc8a79ab71c6ec9bc4dd662b15b"}, - {file = "charset_normalizer-3.4.7-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:c36c333c39be2dbca264d7803333c896ab8fa7d4d6f0ab7edb7dfd7aea6e98c0"}, - {file = "charset_normalizer-3.4.7-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1c2aed2e5e41f24ea8ef1590b8e848a79b56f3a5564a65ceec43c9d692dc7d8a"}, - {file = "charset_normalizer-3.4.7-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:54523e136b8948060c0fa0bc7b1b50c32c186f2fceee897a495406bb6e311d2b"}, - {file = "charset_normalizer-3.4.7-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:715479b9a2802ecac752a3b0efa2b0b60285cf962ee38414211abdfccc233b41"}, - {file = "charset_normalizer-3.4.7-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bd6c2a1c7573c64738d716488d2cdd3c00e340e4835707d8fdb8dc1a66ef164e"}, - {file = "charset_normalizer-3.4.7-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:c45e9440fb78f8ddabcf714b68f936737a121355bf59f3907f4e17721b9d1aae"}, - {file = "charset_normalizer-3.4.7-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3534e7dcbdcf757da6b85a0bbf5b6868786d5982dd959b065e65481644817a18"}, - {file = "charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e8ac484bf18ce6975760921bb6148041faa8fef0547200386ea0b52b5d27bf7b"}, - {file = "charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:a5fe03b42827c13cdccd08e6c0247b6a6d4b5e3cdc53fd1749f5896adcdc2356"}, - {file = "charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:2d6eb928e13016cea4f1f21d1e10c1cebd5a421bc57ddf5b1142ae3f86824fab"}, - {file = "charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:e74327fb75de8986940def6e8dee4f127cc9752bee7355bb323cc5b2659b6d46"}, - {file = "charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:d6038d37043bced98a66e68d3aa2b6a35505dc01328cd65217cefe82f25def44"}, - {file = "charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7579e913a5339fb8fa133f6bbcfd8e6749696206cf05acdbdca71a1b436d8e72"}, - {file = "charset_normalizer-3.4.7-cp314-cp314-win32.whl", hash = "sha256:5b77459df20e08151cd6f8b9ef8ef1f961ef73d85c21a555c7eed5b79410ec10"}, - {file = "charset_normalizer-3.4.7-cp314-cp314-win_amd64.whl", hash = "sha256:92a0a01ead5e668468e952e4238cccd7c537364eb7d851ab144ab6627dbbe12f"}, - {file = "charset_normalizer-3.4.7-cp314-cp314-win_arm64.whl", hash = "sha256:67f6279d125ca0046a7fd386d01b311c6363844deac3e5b069b514ba3e63c246"}, - {file = "charset_normalizer-3.4.7-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:effc3f449787117233702311a1b7d8f59cba9ced946ba727bdc329ec69028e24"}, - {file = "charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fbccdc05410c9ee21bbf16a35f4c1d16123dcdeb8a1d38f33654fa21d0234f79"}, - {file = "charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:733784b6d6def852c814bce5f318d25da2ee65dd4839a0718641c696e09a2960"}, - {file = "charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a89c23ef8d2c6b27fd200a42aa4ac72786e7c60d40efdc76e6011260b6e949c4"}, - {file = "charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6c114670c45346afedc0d947faf3c7f701051d2518b943679c8ff88befe14f8e"}, - {file = "charset_normalizer-3.4.7-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:a180c5e59792af262bf263b21a3c49353f25945d8d9f70628e73de370d55e1e1"}, - {file = "charset_normalizer-3.4.7-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3c9a494bc5ec77d43cea229c4f6db1e4d8fe7e1bbffa8b6f0f0032430ff8ab44"}, - {file = "charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8d828b6667a32a728a1ad1d93957cdf37489c57b97ae6c4de2860fa749b8fc1e"}, - {file = "charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:cf1493cd8607bec4d8a7b9b004e699fcf8f9103a9284cc94962cb73d20f9d4a3"}, - {file = "charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:0c96c3b819b5c3e9e165495db84d41914d6894d55181d2d108cc1a69bfc9cce0"}, - {file = "charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:752a45dc4a6934060b3b0dab47e04edc3326575f82be64bc4fc293914566503e"}, - {file = "charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:8778f0c7a52e56f75d12dae53ae320fae900a8b9b4164b981b9c5ce059cd1fcb"}, - {file = "charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ce3412fbe1e31eb81ea42f4169ed94861c56e643189e1e75f0041f3fe7020abe"}, - {file = "charset_normalizer-3.4.7-cp314-cp314t-win32.whl", hash = "sha256:c03a41a8784091e67a39648f70c5f97b5b6a37f216896d44d2cdcb82615339a0"}, - {file = "charset_normalizer-3.4.7-cp314-cp314t-win_amd64.whl", hash = "sha256:03853ed82eeebbce3c2abfdbc98c96dc205f32a79627688ac9a27370ea61a49c"}, - {file = "charset_normalizer-3.4.7-cp314-cp314t-win_arm64.whl", hash = "sha256:c35abb8bfff0185efac5878da64c45dafd2b37fb0383add1be155a763c1f083d"}, - {file = "charset_normalizer-3.4.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e5f4d355f0a2b1a31bc3edec6795b46324349c9cb25eed068049e4f472fb4259"}, - {file = "charset_normalizer-3.4.7-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:16d971e29578a5e97d7117866d15889a4a07befe0e87e703ed63cd90cb348c01"}, - {file = "charset_normalizer-3.4.7-cp38-cp38-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:dca4bbc466a95ba9c0234ef56d7dd9509f63da22274589ebd4ed7f1f4d4c54e3"}, - {file = "charset_normalizer-3.4.7-cp38-cp38-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e80c8378d8f3d83cd3164da1ad2df9e37a666cdde7b1cb2298ed0b558064be30"}, - {file = "charset_normalizer-3.4.7-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:36836d6ff945a00b88ba1e4572d721e60b5b8c98c155d465f56ad19d68f23734"}, - {file = "charset_normalizer-3.4.7-cp38-cp38-manylinux_2_31_armv7l.whl", hash = "sha256:bd9b23791fe793e4968dba0c447e12f78e425c59fc0e3b97f6450f4781f3ee60"}, - {file = "charset_normalizer-3.4.7-cp38-cp38-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:aef65cd602a6d0e0ff6f9930fcb1c8fec60dd2cfcb6facaf4bdb0e5873042db0"}, - {file = "charset_normalizer-3.4.7-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:82b271f5137d07749f7bf32f70b17ab6eaabedd297e75dce75081a24f76eb545"}, - {file = "charset_normalizer-3.4.7-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:1efde3cae86c8c273f1eb3b287be7d8499420cf2fe7585c41d370d3e790054a5"}, - {file = "charset_normalizer-3.4.7-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:c593052c465475e64bbfe5dbd81680f64a67fdc752c56d7a0ae205dc8aeefe0f"}, - {file = "charset_normalizer-3.4.7-cp38-cp38-musllinux_1_2_riscv64.whl", hash = "sha256:af21eb4409a119e365397b2adbaca4c9ccab56543a65d5dbd9f920d6ac29f686"}, - {file = "charset_normalizer-3.4.7-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:84c018e49c3bf790f9c2771c45e9313a08c2c2a6342b162cd650258b57817706"}, - {file = "charset_normalizer-3.4.7-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:dd915403e231e6b1809fe9b6d9fc55cf8fb5e02765ac625d9cd623342a7905d7"}, - {file = "charset_normalizer-3.4.7-cp38-cp38-win32.whl", hash = "sha256:320ade88cfb846b8cd6b4ddf5ee9e80ee0c1f52401f2456b84ae1ae6a1a5f207"}, - {file = "charset_normalizer-3.4.7-cp38-cp38-win_amd64.whl", hash = "sha256:1dc8b0ea451d6e69735094606991f32867807881400f808a106ee1d963c46a83"}, - {file = "charset_normalizer-3.4.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:177a0ba5f0211d488e295aaf82707237e331c24788d8d76c96c5a41594723217"}, - {file = "charset_normalizer-3.4.7-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6e0d51f618228538a3e8f46bd246f87a6cd030565e015803691603f55e12afb5"}, - {file = "charset_normalizer-3.4.7-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:14265bfe1f09498b9d8ec91e9ec9fa52775edf90fcbde092b25f4a33d444fea9"}, - {file = "charset_normalizer-3.4.7-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:87fad7d9ba98c86bcb41b2dc8dbb326619be2562af1f8ff50776a39e55721c5a"}, - {file = "charset_normalizer-3.4.7-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f22dec1690b584cea26fade98b2435c132c1b5f68e39f5a0b7627cd7ae31f1dc"}, - {file = "charset_normalizer-3.4.7-cp39-cp39-manylinux_2_31_armv7l.whl", hash = "sha256:d61f00a0869d77422d9b2aba989e2d24afa6ffd552af442e0e58de4f35ea6d00"}, - {file = "charset_normalizer-3.4.7-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6370e8686f662e6a3941ee48ed4742317cafbe5707e36406e9df792cdb535776"}, - {file = "charset_normalizer-3.4.7-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a6c5863edfbe888d9eff9c8b8087354e27618d9da76425c119293f11712a6319"}, - {file = "charset_normalizer-3.4.7-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:ed065083d0898c9d5b4bbec7b026fd755ff7454e6e8b73a67f8c744b13986e24"}, - {file = "charset_normalizer-3.4.7-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:2cd4a60d0e2fb04537162c62bbbb4182f53541fe0ede35cdf270a1c1e723cc42"}, - {file = "charset_normalizer-3.4.7-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:813c0e0132266c08eb87469a642cb30aaff57c5f426255419572aaeceeaa7bf4"}, - {file = "charset_normalizer-3.4.7-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:07d9e39b01743c3717745f4c530a6349eadbfa043c7577eef86c502c15df2c67"}, - {file = "charset_normalizer-3.4.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c0f081d69a6e58272819b70288d3221a6ee64b98df852631c80f293514d3b274"}, - {file = "charset_normalizer-3.4.7-cp39-cp39-win32.whl", hash = "sha256:8751d2787c9131302398b11e6c8068053dcb55d5a8964e114b6e196cf16cb366"}, - {file = "charset_normalizer-3.4.7-cp39-cp39-win_amd64.whl", hash = "sha256:12a6fff75f6bc66711b73a2f0addfc4c8c15a20e805146a02d147a318962c444"}, - {file = "charset_normalizer-3.4.7-cp39-cp39-win_arm64.whl", hash = "sha256:bb8cc7534f51d9a017b93e3e85b260924f909601c3df002bcdb58ddb4dc41a5c"}, - {file = "charset_normalizer-3.4.7-py3-none-any.whl", hash = "sha256:3dce51d0f5e7951f8bb4900c257dad282f49190fdbebecd4ba99bcc41fef404d"}, - {file = "charset_normalizer-3.4.7.tar.gz", hash = "sha256:ae89db9e5f98a11a4bf50407d4363e7b09b31e55bc117b4f7d80aab97ba009e5"}, -] - -[[package]] -name = "click" -version = "8.3.2" -description = "Composable command line interface toolkit" -optional = false -python-versions = ">=3.10" -groups = ["main"] -files = [ - {file = "click-8.3.2-py3-none-any.whl", hash = "sha256:1924d2c27c5653561cd2cae4548d1406039cb79b858b747cfea24924bbc1616d"}, - {file = "click-8.3.2.tar.gz", hash = "sha256:14162b8b3b3550a7d479eafa77dfd3c38d9dc8951f6f69c78913a8f9a7540fd5"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "platform_system == \"Windows\""} - -[[package]] -name = "colorama" -version = "0.4.6" -description = "Cross-platform colored terminal text." -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -groups = ["main", "dev"] -files = [ - {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, - {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, -] -markers = {main = "platform_system == \"Windows\"", dev = "sys_platform == \"win32\""} - -[[package]] -name = "coverage" -version = "7.13.5" -description = "Code coverage measurement for Python" -optional = false -python-versions = ">=3.10" -groups = ["dev"] -files = [ - {file = "coverage-7.13.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e0723d2c96324561b9aa76fb982406e11d93cdb388a7a7da2b16e04719cf7ca5"}, - {file = "coverage-7.13.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:52f444e86475992506b32d4e5ca55c24fc88d73bcbda0e9745095b28ef4dc0cf"}, - {file = "coverage-7.13.5-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:704de6328e3d612a8f6c07000a878ff38181ec3263d5a11da1db294fa6a9bdf8"}, - {file = "coverage-7.13.5-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a1a6d79a14e1ec1832cabc833898636ad5f3754a678ef8bb4908515208bf84f4"}, - {file = "coverage-7.13.5-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:79060214983769c7ba3f0cee10b54c97609dca4d478fa1aa32b914480fd5738d"}, - {file = "coverage-7.13.5-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:356e76b46783a98c2a2fe81ec79df4883a1e62895ea952968fb253c114e7f930"}, - {file = "coverage-7.13.5-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0cef0cdec915d11254a7f549c1170afecce708d30610c6abdded1f74e581666d"}, - {file = "coverage-7.13.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:dc022073d063b25a402454e5712ef9e007113e3a676b96c5f29b2bda29352f40"}, - {file = "coverage-7.13.5-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:9b74db26dfea4f4e50d48a4602207cd1e78be33182bc9cbf22da94f332f99878"}, - {file = "coverage-7.13.5-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ad146744ca4fd09b50c482650e3c1b1f4dfa1d4792e0a04a369c7f23336f0400"}, - {file = "coverage-7.13.5-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:c555b48be1853fe3997c11c4bd521cdd9a9612352de01fa4508f16ec341e6fe0"}, - {file = "coverage-7.13.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7034b5c56a58ae5e85f23949d52c14aca2cfc6848a31764995b7de88f13a1ea0"}, - {file = "coverage-7.13.5-cp310-cp310-win32.whl", hash = "sha256:eb7fdf1ef130660e7415e0253a01a7d5a88c9c4d158bcf75cbbd922fd65a5b58"}, - {file = "coverage-7.13.5-cp310-cp310-win_amd64.whl", hash = "sha256:3e1bb5f6c78feeb1be3475789b14a0f0a5b47d505bfc7267126ccbd50289999e"}, - {file = "coverage-7.13.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:66a80c616f80181f4d643b0f9e709d97bcea413ecd9631e1dedc7401c8e6695d"}, - {file = "coverage-7.13.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:145ede53ccbafb297c1c9287f788d1bc3efd6c900da23bf6931b09eafc931587"}, - {file = "coverage-7.13.5-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:0672854dc733c342fa3e957e0605256d2bf5934feeac328da9e0b5449634a642"}, - {file = "coverage-7.13.5-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:ec10e2a42b41c923c2209b846126c6582db5e43a33157e9870ba9fb70dc7854b"}, - {file = "coverage-7.13.5-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:be3d4bbad9d4b037791794ddeedd7d64a56f5933a2c1373e18e9e568b9141686"}, - {file = "coverage-7.13.5-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4d2afbc5cc54d286bfb54541aa50b64cdb07a718227168c87b9e2fb8f25e1743"}, - {file = "coverage-7.13.5-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3ad050321264c49c2fa67bb599100456fc51d004b82534f379d16445da40fb75"}, - {file = "coverage-7.13.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7300c8a6d13335b29bb76d7651c66af6bd8658517c43499f110ddc6717bfc209"}, - {file = "coverage-7.13.5-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:eb07647a5738b89baab047f14edd18ded523de60f3b30e75c2acc826f79c839a"}, - {file = "coverage-7.13.5-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:9adb6688e3b53adffefd4a52d72cbd8b02602bfb8f74dcd862337182fd4d1a4e"}, - {file = "coverage-7.13.5-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:7c8d4bc913dd70b93488d6c496c77f3aff5ea99a07e36a18f865bca55adef8bd"}, - {file = "coverage-7.13.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0e3c426ffc4cd952f54ee9ffbdd10345709ecc78a3ecfd796a57236bfad0b9b8"}, - {file = "coverage-7.13.5-cp311-cp311-win32.whl", hash = "sha256:259b69bb83ad9894c4b25be2528139eecba9a82646ebdda2d9db1ba28424a6bf"}, - {file = "coverage-7.13.5-cp311-cp311-win_amd64.whl", hash = "sha256:258354455f4e86e3e9d0d17571d522e13b4e1e19bf0f8596bcf9476d61e7d8a9"}, - {file = "coverage-7.13.5-cp311-cp311-win_arm64.whl", hash = "sha256:bff95879c33ec8da99fc9b6fe345ddb5be6414b41d6d1ad1c8f188d26f36e028"}, - {file = "coverage-7.13.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:460cf0114c5016fa841214ff5564aa4864f11948da9440bc97e21ad1f4ba1e01"}, - {file = "coverage-7.13.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0e223ce4b4ed47f065bfb123687686512e37629be25cc63728557ae7db261422"}, - {file = "coverage-7.13.5-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:6e3370441f4513c6252bf042b9c36d22491142385049243253c7e48398a15a9f"}, - {file = "coverage-7.13.5-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:03ccc709a17a1de074fb1d11f217342fb0d2b1582ed544f554fc9fc3f07e95f5"}, - {file = "coverage-7.13.5-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3f4818d065964db3c1c66dc0fbdac5ac692ecbc875555e13374fdbe7eedb4376"}, - {file = "coverage-7.13.5-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:012d5319e66e9d5a218834642d6c35d265515a62f01157a45bcc036ecf947256"}, - {file = "coverage-7.13.5-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8dd02af98971bdb956363e4827d34425cb3df19ee550ef92855b0acb9c7ce51c"}, - {file = "coverage-7.13.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f08fd75c50a760c7eb068ae823777268daaf16a80b918fa58eea888f8e3919f5"}, - {file = "coverage-7.13.5-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:843ea8643cf967d1ac7e8ecd4bb00c99135adf4816c0c0593fdcc47b597fcf09"}, - {file = "coverage-7.13.5-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:9d44d7aa963820b1b971dbecd90bfe5fe8f81cff79787eb6cca15750bd2f79b9"}, - {file = "coverage-7.13.5-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:7132bed4bd7b836200c591410ae7d97bf7ae8be6fc87d160b2bd881df929e7bf"}, - {file = "coverage-7.13.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a698e363641b98843c517817db75373c83254781426e94ada3197cabbc2c919c"}, - {file = "coverage-7.13.5-cp312-cp312-win32.whl", hash = "sha256:bdba0a6b8812e8c7df002d908a9a2ea3c36e92611b5708633c50869e6d922fdf"}, - {file = "coverage-7.13.5-cp312-cp312-win_amd64.whl", hash = "sha256:d2c87e0c473a10bffe991502eac389220533024c8082ec1ce849f4218dded810"}, - {file = "coverage-7.13.5-cp312-cp312-win_arm64.whl", hash = "sha256:bf69236a9a81bdca3bff53796237aab096cdbf8d78a66ad61e992d9dac7eb2de"}, - {file = "coverage-7.13.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5ec4af212df513e399cf11610cc27063f1586419e814755ab362e50a85ea69c1"}, - {file = "coverage-7.13.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:941617e518602e2d64942c88ec8499f7fbd49d3f6c4327d3a71d43a1973032f3"}, - {file = "coverage-7.13.5-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:da305e9937617ee95c2e39d8ff9f040e0487cbf1ac174f777ed5eddd7a7c1f26"}, - {file = "coverage-7.13.5-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:78e696e1cc714e57e8b25760b33a8b1026b7048d270140d25dafe1b0a1ee05a3"}, - {file = "coverage-7.13.5-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:02ca0eed225b2ff301c474aeeeae27d26e2537942aa0f87491d3e147e784a82b"}, - {file = "coverage-7.13.5-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:04690832cbea4e4663d9149e05dba142546ca05cb1848816760e7f58285c970a"}, - {file = "coverage-7.13.5-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0590e44dd2745c696a778f7bab6aa95256de2cbc8b8cff4f7db8ff09813d6969"}, - {file = "coverage-7.13.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d7cfad2d6d81dd298ab6b89fe72c3b7b05ec7544bdda3b707ddaecff8d25c161"}, - {file = "coverage-7.13.5-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:e092b9499de38ae0fbfbc603a74660eb6ff3e869e507b50d85a13b6db9863e15"}, - {file = "coverage-7.13.5-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:48c39bc4a04d983a54a705a6389512883d4a3b9862991b3617d547940e9f52b1"}, - {file = "coverage-7.13.5-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:2d3807015f138ffea1ed9afeeb8624fd781703f2858b62a8dd8da5a0994c57b6"}, - {file = "coverage-7.13.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ee2aa19e03161671ec964004fb74b2257805d9710bf14a5c704558b9d8dbaf17"}, - {file = "coverage-7.13.5-cp313-cp313-win32.whl", hash = "sha256:ce1998c0483007608c8382f4ff50164bfc5bd07a2246dd272aa4043b75e61e85"}, - {file = "coverage-7.13.5-cp313-cp313-win_amd64.whl", hash = "sha256:631efb83f01569670a5e866ceb80fe483e7c159fac6f167e6571522636104a0b"}, - {file = "coverage-7.13.5-cp313-cp313-win_arm64.whl", hash = "sha256:f4cd16206ad171cbc2470dbea9103cf9a7607d5fe8c242fdf1edf36174020664"}, - {file = "coverage-7.13.5-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0428cbef5783ad91fe240f673cc1f76b25e74bbfe1a13115e4aa30d3f538162d"}, - {file = "coverage-7.13.5-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e0b216a19534b2427cc201a26c25da4a48633f29a487c61258643e89d28200c0"}, - {file = "coverage-7.13.5-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:972a9cd27894afe4bc2b1480107054e062df08e671df7c2f18c205e805ccd806"}, - {file = "coverage-7.13.5-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:4b59148601efcd2bac8c4dbf1f0ad6391693ccf7a74b8205781751637076aee3"}, - {file = "coverage-7.13.5-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:505d7083c8b0c87a8fa8c07370c285847c1f77739b22e299ad75a6af6c32c5c9"}, - {file = "coverage-7.13.5-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:60365289c3741e4db327e7baff2a4aaacf22f788e80fa4683393891b70a89fbd"}, - {file = "coverage-7.13.5-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1b88c69c8ef5d4b6fe7dea66d6636056a0f6a7527c440e890cf9259011f5e606"}, - {file = "coverage-7.13.5-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:5b13955d31d1633cf9376908089b7cebe7d15ddad7aeaabcbe969a595a97e95e"}, - {file = "coverage-7.13.5-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:f70c9ab2595c56f81a89620e22899eea8b212a4041bd728ac6f4a28bf5d3ddd0"}, - {file = "coverage-7.13.5-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:084b84a8c63e8d6fc7e3931b316a9bcafca1458d753c539db82d31ed20091a87"}, - {file = "coverage-7.13.5-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:ad14385487393e386e2ea988b09d62dd42c397662ac2dabc3832d71253eee479"}, - {file = "coverage-7.13.5-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:7f2c47b36fe7709a6e83bfadf4eefb90bd25fbe4014d715224c4316f808e59a2"}, - {file = "coverage-7.13.5-cp313-cp313t-win32.whl", hash = "sha256:67e9bc5449801fad0e5dff329499fb090ba4c5800b86805c80617b4e29809b2a"}, - {file = "coverage-7.13.5-cp313-cp313t-win_amd64.whl", hash = "sha256:da86cdcf10d2519e10cabb8ac2de03da1bcb6e4853790b7fbd48523332e3a819"}, - {file = "coverage-7.13.5-cp313-cp313t-win_arm64.whl", hash = "sha256:0ecf12ecb326fe2c339d93fc131816f3a7367d223db37817208905c89bded911"}, - {file = "coverage-7.13.5-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:fbabfaceaeb587e16f7008f7795cd80d20ec548dc7f94fbb0d4ec2e038ce563f"}, - {file = "coverage-7.13.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:9bb2a28101a443669a423b665939381084412b81c3f8c0fcfbac57f4e30b5b8e"}, - {file = "coverage-7.13.5-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:bd3a2fbc1c6cccb3c5106140d87cc6a8715110373ef42b63cf5aea29df8c217a"}, - {file = "coverage-7.13.5-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:6c36ddb64ed9d7e496028d1d00dfec3e428e0aabf4006583bb1839958d280510"}, - {file = "coverage-7.13.5-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:380e8e9084d8eb38db3a9176a1a4f3c0082c3806fa0dc882d1d87abc3c789247"}, - {file = "coverage-7.13.5-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e808af52a0513762df4d945ea164a24b37f2f518cbe97e03deaa0ee66139b4d6"}, - {file = "coverage-7.13.5-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e301d30dd7e95ae068671d746ba8c34e945a82682e62918e41b2679acd2051a0"}, - {file = "coverage-7.13.5-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:800bc829053c80d240a687ceeb927a94fd108bbdc68dfbe505d0d75ab578a882"}, - {file = "coverage-7.13.5-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:0b67af5492adb31940ee418a5a655c28e48165da5afab8c7fa6fd72a142f8740"}, - {file = "coverage-7.13.5-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:c9136ff29c3a91e25b1d1552b5308e53a1e0653a23e53b6366d7c2dcbbaf8a16"}, - {file = "coverage-7.13.5-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:cff784eef7f0b8f6cb28804fbddcfa99f89efe4cc35fb5627e3ac58f91ed3ac0"}, - {file = "coverage-7.13.5-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:68a4953be99b17ac3c23b6efbc8a38330d99680c9458927491d18700ef23ded0"}, - {file = "coverage-7.13.5-cp314-cp314-win32.whl", hash = "sha256:35a31f2b1578185fbe6aa2e74cea1b1d0bbf4c552774247d9160d29b80ed56cc"}, - {file = "coverage-7.13.5-cp314-cp314-win_amd64.whl", hash = "sha256:2aa055ae1857258f9e0045be26a6d62bdb47a72448b62d7b55f4820f361a2633"}, - {file = "coverage-7.13.5-cp314-cp314-win_arm64.whl", hash = "sha256:1b11eef33edeae9d142f9b4358edb76273b3bfd30bc3df9a4f95d0e49caf94e8"}, - {file = "coverage-7.13.5-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:10a0c37f0b646eaff7cce1874c31d1f1ccb297688d4c747291f4f4c70741cc8b"}, - {file = "coverage-7.13.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b5db73ba3c41c7008037fa731ad5459fc3944cb7452fc0aa9f822ad3533c583c"}, - {file = "coverage-7.13.5-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:750db93a81e3e5a9831b534be7b1229df848b2e125a604fe6651e48aa070e5f9"}, - {file = "coverage-7.13.5-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9ddb4f4a5479f2539644be484da179b653273bca1a323947d48ab107b3ed1f29"}, - {file = "coverage-7.13.5-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8a7a2049c14f413163e2bdabd37e41179b1d1ccb10ffc6ccc4b7a718429c607"}, - {file = "coverage-7.13.5-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e1c85e0b6c05c592ea6d8768a66a254bfb3874b53774b12d4c89c481eb78cb90"}, - {file = "coverage-7.13.5-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:777c4d1eff1b67876139d24288aaf1817f6c03d6bae9c5cc8d27b83bcfe38fe3"}, - {file = "coverage-7.13.5-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:6697e29b93707167687543480a40f0db8f356e86d9f67ddf2e37e2dfd91a9dab"}, - {file = "coverage-7.13.5-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:8fdf453a942c3e4d99bd80088141c4c6960bb232c409d9c3558e2dbaa3998562"}, - {file = "coverage-7.13.5-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:32ca0c0114c9834a43f045a87dcebd69d108d8ffb666957ea65aa132f50332e2"}, - {file = "coverage-7.13.5-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:8769751c10f339021e2638cd354e13adeac54004d1941119b2c96fe5276d45ea"}, - {file = "coverage-7.13.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cec2d83125531bd153175354055cdb7a09987af08a9430bd173c937c6d0fba2a"}, - {file = "coverage-7.13.5-cp314-cp314t-win32.whl", hash = "sha256:0cd9ed7a8b181775459296e402ca4fb27db1279740a24e93b3b41942ebe4b215"}, - {file = "coverage-7.13.5-cp314-cp314t-win_amd64.whl", hash = "sha256:301e3b7dfefecaca37c9f1aa6f0049b7d4ab8dd933742b607765d757aca77d43"}, - {file = "coverage-7.13.5-cp314-cp314t-win_arm64.whl", hash = "sha256:9dacc2ad679b292709e0f5fc1ac74a6d4d5562e424058962c7bb0c658ad25e45"}, - {file = "coverage-7.13.5-py3-none-any.whl", hash = "sha256:34b02417cf070e173989b3db962f7ed56d2f644307b2cf9d5a0f258e13084a61"}, - {file = "coverage-7.13.5.tar.gz", hash = "sha256:c81f6515c4c40141f83f502b07bbfa5c240ba25bbe73da7b33f1e5b6120ff179"}, -] - -[package.extras] -toml = ["tomli ; python_full_version <= \"3.11.0a6\""] - -[[package]] -name = "flake8" -version = "7.3.0" -description = "the modular source code checker: pep8 pyflakes and co" -optional = false -python-versions = ">=3.9" -groups = ["dev"] -files = [ - {file = "flake8-7.3.0-py2.py3-none-any.whl", hash = "sha256:b9696257b9ce8beb888cdbe31cf885c90d31928fe202be0889a7cdafad32f01e"}, - {file = "flake8-7.3.0.tar.gz", hash = "sha256:fe044858146b9fc69b551a4b490d69cf960fcb78ad1edcb84e7fbb1b4a8e3872"}, -] - -[package.dependencies] -mccabe = ">=0.7.0,<0.8.0" -pycodestyle = ">=2.14.0,<2.15.0" -pyflakes = ">=3.4.0,<3.5.0" - -[[package]] -name = "flask" -version = "3.1.3" -description = "A simple framework for building complex web applications." -optional = false -python-versions = ">=3.9" -groups = ["main"] -files = [ - {file = "flask-3.1.3-py3-none-any.whl", hash = "sha256:f4bcbefc124291925f1a26446da31a5178f9483862233b23c0c96a20701f670c"}, - {file = "flask-3.1.3.tar.gz", hash = "sha256:0ef0e52b8a9cd932855379197dd8f94047b359ca0a78695144304cb45f87c9eb"}, -] - -[package.dependencies] -blinker = ">=1.9.0" -click = ">=8.1.3" -itsdangerous = ">=2.2.0" -jinja2 = ">=3.1.2" -markupsafe = ">=2.1.1" -werkzeug = ">=3.1.0" - -[package.extras] -async = ["asgiref (>=3.2)"] -dotenv = ["python-dotenv"] - -[[package]] -name = "gunicorn" -version = "25.3.0" -description = "WSGI HTTP Server for UNIX" -optional = false -python-versions = ">=3.10" -groups = ["main"] -files = [ - {file = "gunicorn-25.3.0-py3-none-any.whl", hash = "sha256:cacea387dab08cd6776501621c295a904fe8e3b7aae9a1a3cbb26f4e7ed54660"}, - {file = "gunicorn-25.3.0.tar.gz", hash = "sha256:f74e1b2f9f76f6cd1ca01198968bd2dd65830edc24b6e8e4d78de8320e2fe889"}, -] - -[package.dependencies] -packaging = "*" - -[package.extras] -eventlet = ["eventlet (>=0.40.3)"] -fast = ["gunicorn_h1c (>=0.6.3)"] -gevent = ["gevent (>=24.10.1)"] -http2 = ["h2 (>=4.1.0)"] -setproctitle = ["setproctitle"] -testing = ["coverage", "eventlet (>=0.40.3)", "gevent (>=24.10.1)", "h2 (>=4.1.0)", "httpx[http2]", "pytest", "pytest-asyncio", "pytest-cov", "uvloop (>=0.19.0)"] -tornado = ["tornado (>=6.5.0)"] - -[[package]] -name = "idna" -version = "3.11" -description = "Internationalized Domain Names in Applications (IDNA)" -optional = false -python-versions = ">=3.8" -groups = ["main"] -files = [ - {file = "idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea"}, - {file = "idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902"}, -] - -[package.extras] -all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] - -[[package]] -name = "iniconfig" -version = "2.3.0" -description = "brain-dead simple config-ini parsing" -optional = false -python-versions = ">=3.10" -groups = ["dev"] -files = [ - {file = "iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12"}, - {file = "iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730"}, -] - -[[package]] -name = "itsdangerous" -version = "2.2.0" -description = "Safely pass data to untrusted environments and back." -optional = false -python-versions = ">=3.8" -groups = ["main"] -files = [ - {file = "itsdangerous-2.2.0-py3-none-any.whl", hash = "sha256:c6242fc49e35958c8b15141343aa660db5fc54d4f13a1db01a3f5891b98700ef"}, - {file = "itsdangerous-2.2.0.tar.gz", hash = "sha256:e0050c0b7da1eea53ffaf149c0cfbb5c6e2e2b69c4bef22c81fa6eb73e5f6173"}, -] - -[[package]] -name = "jinja2" -version = "3.1.6" -description = "A very fast and expressive template engine." -optional = false -python-versions = ">=3.7" -groups = ["main"] -files = [ - {file = "jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67"}, - {file = "jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d"}, -] - -[package.dependencies] -MarkupSafe = ">=2.0" - -[package.extras] -i18n = ["Babel (>=2.7)"] - -[[package]] -name = "markupsafe" -version = "3.0.3" -description = "Safely add untrusted strings to HTML/XML markup." -optional = false -python-versions = ">=3.9" -groups = ["main"] -files = [ - {file = "markupsafe-3.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f981d352f04553a7171b8e44369f2af4055f888dfb147d55e42d29e29e74559"}, - {file = "markupsafe-3.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e1c1493fb6e50ab01d20a22826e57520f1284df32f2d8601fdd90b6304601419"}, - {file = "markupsafe-3.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1ba88449deb3de88bd40044603fafffb7bc2b055d626a330323a9ed736661695"}, - {file = "markupsafe-3.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f42d0984e947b8adf7dd6dde396e720934d12c506ce84eea8476409563607591"}, - {file = "markupsafe-3.0.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c0c0b3ade1c0b13b936d7970b1d37a57acde9199dc2aecc4c336773e1d86049c"}, - {file = "markupsafe-3.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0303439a41979d9e74d18ff5e2dd8c43ed6c6001fd40e5bf2e43f7bd9bbc523f"}, - {file = "markupsafe-3.0.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:d2ee202e79d8ed691ceebae8e0486bd9a2cd4794cec4824e1c99b6f5009502f6"}, - {file = "markupsafe-3.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:177b5253b2834fe3678cb4a5f0059808258584c559193998be2601324fdeafb1"}, - {file = "markupsafe-3.0.3-cp310-cp310-win32.whl", hash = "sha256:2a15a08b17dd94c53a1da0438822d70ebcd13f8c3a95abe3a9ef9f11a94830aa"}, - {file = "markupsafe-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:c4ffb7ebf07cfe8931028e3e4c85f0357459a3f9f9490886198848f4fa002ec8"}, - {file = "markupsafe-3.0.3-cp310-cp310-win_arm64.whl", hash = "sha256:e2103a929dfa2fcaf9bb4e7c091983a49c9ac3b19c9061b6d5427dd7d14d81a1"}, - {file = "markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad"}, - {file = "markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a"}, - {file = "markupsafe-3.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50"}, - {file = "markupsafe-3.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0bf2a864d67e76e5c9a34dc26ec616a66b9888e25e7b9460e1c76d3293bd9dbf"}, - {file = "markupsafe-3.0.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc51efed119bc9cfdf792cdeaa4d67e8f6fcccab66ed4bfdd6bde3e59bfcbb2f"}, - {file = "markupsafe-3.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:068f375c472b3e7acbe2d5318dea141359e6900156b5b2ba06a30b169086b91a"}, - {file = "markupsafe-3.0.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:7be7b61bb172e1ed687f1754f8e7484f1c8019780f6f6b0786e76bb01c2ae115"}, - {file = "markupsafe-3.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a"}, - {file = "markupsafe-3.0.3-cp311-cp311-win32.whl", hash = "sha256:0db14f5dafddbb6d9208827849fad01f1a2609380add406671a26386cdf15a19"}, - {file = "markupsafe-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:de8a88e63464af587c950061a5e6a67d3632e36df62b986892331d4620a35c01"}, - {file = "markupsafe-3.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:3b562dd9e9ea93f13d53989d23a7e775fdfd1066c33494ff43f5418bc8c58a5c"}, - {file = "markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e"}, - {file = "markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce"}, - {file = "markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d"}, - {file = "markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d"}, - {file = "markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a"}, - {file = "markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b"}, - {file = "markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f"}, - {file = "markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b"}, - {file = "markupsafe-3.0.3-cp312-cp312-win32.whl", hash = "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d"}, - {file = "markupsafe-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c"}, - {file = "markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f"}, - {file = "markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795"}, - {file = "markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219"}, - {file = "markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6"}, - {file = "markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676"}, - {file = "markupsafe-3.0.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9"}, - {file = "markupsafe-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1"}, - {file = "markupsafe-3.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc"}, - {file = "markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12"}, - {file = "markupsafe-3.0.3-cp313-cp313-win32.whl", hash = "sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed"}, - {file = "markupsafe-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5"}, - {file = "markupsafe-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485"}, - {file = "markupsafe-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73"}, - {file = "markupsafe-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37"}, - {file = "markupsafe-3.0.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19"}, - {file = "markupsafe-3.0.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025"}, - {file = "markupsafe-3.0.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6"}, - {file = "markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f"}, - {file = "markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb"}, - {file = "markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009"}, - {file = "markupsafe-3.0.3-cp313-cp313t-win32.whl", hash = "sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354"}, - {file = "markupsafe-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218"}, - {file = "markupsafe-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287"}, - {file = "markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe"}, - {file = "markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026"}, - {file = "markupsafe-3.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737"}, - {file = "markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97"}, - {file = "markupsafe-3.0.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d"}, - {file = "markupsafe-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda"}, - {file = "markupsafe-3.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf"}, - {file = "markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe"}, - {file = "markupsafe-3.0.3-cp314-cp314-win32.whl", hash = "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9"}, - {file = "markupsafe-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581"}, - {file = "markupsafe-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4"}, - {file = "markupsafe-3.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab"}, - {file = "markupsafe-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175"}, - {file = "markupsafe-3.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634"}, - {file = "markupsafe-3.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50"}, - {file = "markupsafe-3.0.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e"}, - {file = "markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5"}, - {file = "markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523"}, - {file = "markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc"}, - {file = "markupsafe-3.0.3-cp314-cp314t-win32.whl", hash = "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d"}, - {file = "markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9"}, - {file = "markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa"}, - {file = "markupsafe-3.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:15d939a21d546304880945ca1ecb8a039db6b4dc49b2c5a400387cdae6a62e26"}, - {file = "markupsafe-3.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f71a396b3bf33ecaa1626c255855702aca4d3d9fea5e051b41ac59a9c1c41edc"}, - {file = "markupsafe-3.0.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0f4b68347f8c5eab4a13419215bdfd7f8c9b19f2b25520968adfad23eb0ce60c"}, - {file = "markupsafe-3.0.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e8fc20152abba6b83724d7ff268c249fa196d8259ff481f3b1476383f8f24e42"}, - {file = "markupsafe-3.0.3-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:949b8d66bc381ee8b007cd945914c721d9aba8e27f71959d750a46f7c282b20b"}, - {file = "markupsafe-3.0.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:3537e01efc9d4dccdf77221fb1cb3b8e1a38d5428920e0657ce299b20324d758"}, - {file = "markupsafe-3.0.3-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:591ae9f2a647529ca990bc681daebdd52c8791ff06c2bfa05b65163e28102ef2"}, - {file = "markupsafe-3.0.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a320721ab5a1aba0a233739394eb907f8c8da5c98c9181d1161e77a0c8e36f2d"}, - {file = "markupsafe-3.0.3-cp39-cp39-win32.whl", hash = "sha256:df2449253ef108a379b8b5d6b43f4b1a8e81a061d6537becd5582fba5f9196d7"}, - {file = "markupsafe-3.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:7c3fb7d25180895632e5d3148dbdc29ea38ccb7fd210aa27acbd1201a1902c6e"}, - {file = "markupsafe-3.0.3-cp39-cp39-win_arm64.whl", hash = "sha256:38664109c14ffc9e7437e86b4dceb442b0096dfe3541d7864d9cbe1da4cf36c8"}, - {file = "markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698"}, -] - -[[package]] -name = "mccabe" -version = "0.7.0" -description = "McCabe checker, plugin for flake8" -optional = false -python-versions = ">=3.6" -groups = ["dev"] -files = [ - {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, - {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, -] - -[[package]] -name = "packaging" -version = "26.0" -description = "Core utilities for Python packages" -optional = false -python-versions = ">=3.8" -groups = ["main", "dev"] -files = [ - {file = "packaging-26.0-py3-none-any.whl", hash = "sha256:b36f1fef9334a5588b4166f8bcd26a14e521f2b55e6b9de3aaa80d3ff7a37529"}, - {file = "packaging-26.0.tar.gz", hash = "sha256:00243ae351a257117b6a241061796684b084ed1c516a08c48a3f7e147a9d80b4"}, -] - -[[package]] -name = "pep8-naming" -version = "0.15.1" -description = "Check PEP-8 naming conventions, plugin for flake8" -optional = false -python-versions = ">=3.9" -groups = ["dev"] -files = [ - {file = "pep8_naming-0.15.1-py3-none-any.whl", hash = "sha256:eb63925e7fd9e028c7f7ee7b1e413ec03d1ee5de0e627012102ee0222c273c86"}, - {file = "pep8_naming-0.15.1.tar.gz", hash = "sha256:f6f4a499aba2deeda93c1f26ccc02f3da32b035c8b2db9696b730ef2c9639d29"}, -] - -[package.dependencies] -flake8 = ">=5.0.0" - -[[package]] -name = "pluggy" -version = "1.6.0" -description = "plugin and hook calling mechanisms for python" -optional = false -python-versions = ">=3.9" -groups = ["dev"] -files = [ - {file = "pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746"}, - {file = "pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3"}, -] - -[package.extras] -dev = ["pre-commit", "tox"] -testing = ["coverage", "pytest", "pytest-benchmark"] - -[[package]] -name = "prometheus-client" -version = "0.23.1" -description = "Python client for the Prometheus monitoring system." -optional = false -python-versions = ">=3.9" -groups = ["main"] -files = [ - {file = "prometheus_client-0.23.1-py3-none-any.whl", hash = "sha256:dd1913e6e76b59cfe44e7a4b83e01afc9873c1bdfd2ed8739f1e76aeca115f99"}, - {file = "prometheus_client-0.23.1.tar.gz", hash = "sha256:6ae8f9081eaaaf153a2e959d2e6c4f4fb57b12ef76c8c7980202f1e57b48b2ce"}, -] - -[package.extras] -twisted = ["twisted"] - -[[package]] -name = "pycodestyle" -version = "2.14.0" -description = "Python style guide checker" -optional = false -python-versions = ">=3.9" -groups = ["dev"] -files = [ - {file = "pycodestyle-2.14.0-py2.py3-none-any.whl", hash = "sha256:dd6bf7cb4ee77f8e016f9c8e74a35ddd9f67e1d5fd4184d86c3b98e07099f42d"}, - {file = "pycodestyle-2.14.0.tar.gz", hash = "sha256:c4b5b517d278089ff9d0abdec919cd97262a3367449ea1c8b49b91529167b783"}, -] - -[[package]] -name = "pyflakes" -version = "3.4.0" -description = "passive checker of Python programs" -optional = false -python-versions = ">=3.9" -groups = ["dev"] -files = [ - {file = "pyflakes-3.4.0-py2.py3-none-any.whl", hash = "sha256:f742a7dbd0d9cb9ea41e9a24a918996e8170c799fa528688d40dd582c8265f4f"}, - {file = "pyflakes-3.4.0.tar.gz", hash = "sha256:b24f96fafb7d2ab0ec5075b7350b3d2d2218eab42003821c06344973d3ea2f58"}, -] - -[[package]] -name = "pygments" -version = "2.20.0" -description = "Pygments is a syntax highlighting package written in Python." -optional = false -python-versions = ">=3.9" -groups = ["dev"] -files = [ - {file = "pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176"}, - {file = "pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f"}, -] - -[package.extras] -windows-terminal = ["colorama (>=0.4.6)"] - -[[package]] -name = "pytest" -version = "9.0.3" -description = "pytest: simple powerful testing with Python" -optional = false -python-versions = ">=3.10" -groups = ["dev"] -files = [ - {file = "pytest-9.0.3-py3-none-any.whl", hash = "sha256:2c5efc453d45394fdd706ade797c0a81091eccd1d6e4bccfcd476e2b8e0ab5d9"}, - {file = "pytest-9.0.3.tar.gz", hash = "sha256:b86ada508af81d19edeb213c681b1d48246c1a91d304c6c81a427674c17eb91c"}, -] - -[package.dependencies] -colorama = {version = ">=0.4", markers = "sys_platform == \"win32\""} -iniconfig = ">=1.0.1" -packaging = ">=22" -pluggy = ">=1.5,<2" -pygments = ">=2.7.2" - -[package.extras] -dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "requests", "setuptools", "xmlschema"] - -[[package]] -name = "pytest-cov" -version = "7.1.0" -description = "Pytest plugin for measuring coverage." -optional = false -python-versions = ">=3.9" -groups = ["dev"] -files = [ - {file = "pytest_cov-7.1.0-py3-none-any.whl", hash = "sha256:a0461110b7865f9a271aa1b51e516c9a95de9d696734a2f71e3e78f46e1d4678"}, - {file = "pytest_cov-7.1.0.tar.gz", hash = "sha256:30674f2b5f6351aa09702a9c8c364f6a01c27aae0c1366ae8016160d1efc56b2"}, -] - -[package.dependencies] -coverage = {version = ">=7.10.6", extras = ["toml"]} -pluggy = ">=1.2" -pytest = ">=7" - -[package.extras] -testing = ["process-tests", "pytest-xdist", "virtualenv"] - -[[package]] -name = "requests" -version = "2.33.1" -description = "Python HTTP for Humans." -optional = false -python-versions = ">=3.10" -groups = ["main"] -files = [ - {file = "requests-2.33.1-py3-none-any.whl", hash = "sha256:4e6d1ef462f3626a1f0a0a9c42dd93c63bad33f9f1c1937509b8c5c8718ab56a"}, - {file = "requests-2.33.1.tar.gz", hash = "sha256:18817f8c57c6263968bc123d237e3b8b08ac046f5456bd1e307ee8f4250d3517"}, -] - -[package.dependencies] -certifi = ">=2023.5.7" -charset_normalizer = ">=2,<4" -idna = ">=2.5,<4" -urllib3 = ">=1.26,<3" - -[package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7)"] -use-chardet-on-py3 = ["chardet (>=3.0.2,<8)"] - -[[package]] -name = "urllib3" -version = "2.6.3" -description = "HTTP library with thread-safe connection pooling, file post, and more." -optional = false -python-versions = ">=3.9" -groups = ["main"] -files = [ - {file = "urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4"}, - {file = "urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed"}, -] - -[package.extras] -brotli = ["brotli (>=1.2.0) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=1.2.0.0) ; platform_python_implementation != \"CPython\""] -h2 = ["h2 (>=4,<5)"] -socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] -zstd = ["backports-zstd (>=1.0.0) ; python_version < \"3.14\""] - -[[package]] -name = "werkzeug" -version = "3.1.8" -description = "The comprehensive WSGI web application library." -optional = false -python-versions = ">=3.9" -groups = ["main"] -files = [ - {file = "werkzeug-3.1.8-py3-none-any.whl", hash = "sha256:63a77fb8892bf28ebc3178683445222aa500e48ebad5ec77b0ad80f8726b1f50"}, - {file = "werkzeug-3.1.8.tar.gz", hash = "sha256:9bad61a4268dac112f1c5cd4630a56ede601b6ed420300677a869083d70a4c44"}, -] - -[package.dependencies] -markupsafe = ">=2.1.1" - -[package.extras] -watchdog = ["watchdog (>=2.3)"] - -[metadata] -lock-version = "2.1" -python-versions = ">=3.14" -content-hash = "978605bae0c54f50d967c46bf36e71be1c8baa8f5deab0c54397546aaa573a3a" diff --git a/app_python/pyproject.toml b/app_python/pyproject.toml index 43c22bd9cd..8d596ef368 100644 --- a/app_python/pyproject.toml +++ b/app_python/pyproject.toml @@ -8,23 +8,19 @@ authors = [ readme = "README.md" requires-python = ">=3.14" dependencies = [ - "flask (>=3.1.3,<4.0.0)", - "requests (>=2.32.5,<3.0.0)", - "gunicorn (>=25.1.0,<26.0.0)", - "prometheus-client (==0.23.1)" + "flask>=3.1.3,<4.0.0", + "requests>=2.32.5,<3.0.0", + "gunicorn>=25.1.0,<26.0.0", + "prometheus-client==0.23.1", ] [dependency-groups] dev = [ - "pytest (>=9.0.2,<10.0.0)", - "pytest-cov (>=7.0.0,<8.0.0)", - "flake8 (>=7.3.0,<8.0.0)", - "pep8-naming (>=0.15.1,<0.16.0)" + "pytest>=9.0.2,<10.0.0", + "pytest-cov>=7.0.0,<8.0.0", + "flake8>=7.3.0,<8.0.0", + "pep8-naming>=0.15.1,<0.16.0", ] -[tool.poetry] -packages = [{ include = "src" }] - -[build-system] -requires = ["poetry-core>=2.0.0,<3.0.0"] -build-backend = "poetry.core.masonry.api" +[tool.uv] +package = false diff --git a/app_python/uv.lock b/app_python/uv.lock new file mode 100644 index 0000000000..2809d77e65 --- /dev/null +++ b/app_python/uv.lock @@ -0,0 +1,410 @@ +version = 1 +revision = 3 +requires-python = ">=3.14" + +[[package]] +name = "blinker" +version = "1.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/21/28/9b3f50ce0e048515135495f198351908d99540d69bfdc8c1d15b73dc55ce/blinker-1.9.0.tar.gz", hash = "sha256:b4ce2265a7abece45e7cc896e98dbebe6cead56bcf805a3d23136d145f5445bf", size = 22460, upload-time = "2024-11-08T17:25:47.436Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/cb/f2ad4230dc2eb1a74edf38f1a38b9b52277f75bef262d8908e60d957e13c/blinker-1.9.0-py3-none-any.whl", hash = "sha256:ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc", size = 8458, upload-time = "2024-11-08T17:25:46.184Z" }, +] + +[[package]] +name = "certifi" +version = "2026.4.22" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/25/ee/6caf7a40c36a1220410afe15a1cc64993a1f864871f698c0f93acb72842a/certifi-2026.4.22.tar.gz", hash = "sha256:8d455352a37b71bf76a79caa83a3d6c25afee4a385d632127b6afb3963f1c580", size = 137077, upload-time = "2026-04-22T11:26:11.191Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl", hash = "sha256:3cb2210c8f88ba2318d29b0388d1023c8492ff72ecdde4ebdaddbb13a31b1c4a", size = 135707, upload-time = "2026-04-22T11:26:09.372Z" }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/a1/67fe25fac3c7642725500a3f6cfe5821ad557c3abb11c9d20d12c7008d3e/charset_normalizer-3.4.7.tar.gz", hash = "sha256:ae89db9e5f98a11a4bf50407d4363e7b09b31e55bc117b4f7d80aab97ba009e5", size = 144271, upload-time = "2026-04-02T09:28:39.342Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/97/c8/c67cb8c70e19ef1960b97b22ed2a1567711de46c4ddf19799923adc836c2/charset_normalizer-3.4.7-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:c36c333c39be2dbca264d7803333c896ab8fa7d4d6f0ab7edb7dfd7aea6e98c0", size = 309234, upload-time = "2026-04-02T09:27:07.194Z" }, + { url = "https://files.pythonhosted.org/packages/99/85/c091fdee33f20de70d6c8b522743b6f831a2f1cd3ff86de4c6a827c48a76/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1c2aed2e5e41f24ea8ef1590b8e848a79b56f3a5564a65ceec43c9d692dc7d8a", size = 208042, upload-time = "2026-04-02T09:27:08.749Z" }, + { url = "https://files.pythonhosted.org/packages/87/1c/ab2ce611b984d2fd5d86a5a8a19c1ae26acac6bad967da4967562c75114d/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:54523e136b8948060c0fa0bc7b1b50c32c186f2fceee897a495406bb6e311d2b", size = 228706, upload-time = "2026-04-02T09:27:09.951Z" }, + { url = "https://files.pythonhosted.org/packages/a8/29/2b1d2cb00bf085f59d29eb773ce58ec2d325430f8c216804a0a5cd83cbca/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:715479b9a2802ecac752a3b0efa2b0b60285cf962ee38414211abdfccc233b41", size = 224727, upload-time = "2026-04-02T09:27:11.175Z" }, + { url = "https://files.pythonhosted.org/packages/47/5c/032c2d5a07fe4d4855fea851209cca2b6f03ebeb6d4e3afdb3358386a684/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bd6c2a1c7573c64738d716488d2cdd3c00e340e4835707d8fdb8dc1a66ef164e", size = 215882, upload-time = "2026-04-02T09:27:12.446Z" }, + { url = "https://files.pythonhosted.org/packages/2c/c2/356065d5a8b78ed04499cae5f339f091946a6a74f91e03476c33f0ab7100/charset_normalizer-3.4.7-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:c45e9440fb78f8ddabcf714b68f936737a121355bf59f3907f4e17721b9d1aae", size = 200860, upload-time = "2026-04-02T09:27:13.721Z" }, + { url = "https://files.pythonhosted.org/packages/0c/cd/a32a84217ced5039f53b29f460962abb2d4420def55afabe45b1c3c7483d/charset_normalizer-3.4.7-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3534e7dcbdcf757da6b85a0bbf5b6868786d5982dd959b065e65481644817a18", size = 211564, upload-time = "2026-04-02T09:27:15.272Z" }, + { url = "https://files.pythonhosted.org/packages/44/86/58e6f13ce26cc3b8f4a36b94a0f22ae2f00a72534520f4ae6857c4b81f89/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e8ac484bf18ce6975760921bb6148041faa8fef0547200386ea0b52b5d27bf7b", size = 211276, upload-time = "2026-04-02T09:27:16.834Z" }, + { url = "https://files.pythonhosted.org/packages/8f/fe/d17c32dc72e17e155e06883efa84514ca375f8a528ba2546bee73fc4df81/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:a5fe03b42827c13cdccd08e6c0247b6a6d4b5e3cdc53fd1749f5896adcdc2356", size = 201238, upload-time = "2026-04-02T09:27:18.229Z" }, + { url = "https://files.pythonhosted.org/packages/6a/29/f33daa50b06525a237451cdb6c69da366c381a3dadcd833fa5676bc468b3/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:2d6eb928e13016cea4f1f21d1e10c1cebd5a421bc57ddf5b1142ae3f86824fab", size = 230189, upload-time = "2026-04-02T09:27:19.445Z" }, + { url = "https://files.pythonhosted.org/packages/b6/6e/52c84015394a6a0bdcd435210a7e944c5f94ea1055f5cc5d56c5fe368e7b/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:e74327fb75de8986940def6e8dee4f127cc9752bee7355bb323cc5b2659b6d46", size = 211352, upload-time = "2026-04-02T09:27:20.79Z" }, + { url = "https://files.pythonhosted.org/packages/8c/d7/4353be581b373033fb9198bf1da3cf8f09c1082561e8e922aa7b39bf9fe8/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:d6038d37043bced98a66e68d3aa2b6a35505dc01328cd65217cefe82f25def44", size = 227024, upload-time = "2026-04-02T09:27:22.063Z" }, + { url = "https://files.pythonhosted.org/packages/30/45/99d18aa925bd1740098ccd3060e238e21115fffbfdcb8f3ece837d0ace6c/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7579e913a5339fb8fa133f6bbcfd8e6749696206cf05acdbdca71a1b436d8e72", size = 217869, upload-time = "2026-04-02T09:27:23.486Z" }, + { url = "https://files.pythonhosted.org/packages/5c/05/5ee478aa53f4bb7996482153d4bfe1b89e0f087f0ab6b294fcf92d595873/charset_normalizer-3.4.7-cp314-cp314-win32.whl", hash = "sha256:5b77459df20e08151cd6f8b9ef8ef1f961ef73d85c21a555c7eed5b79410ec10", size = 148541, upload-time = "2026-04-02T09:27:25.146Z" }, + { url = "https://files.pythonhosted.org/packages/48/77/72dcb0921b2ce86420b2d79d454c7022bf5be40202a2a07906b9f2a35c97/charset_normalizer-3.4.7-cp314-cp314-win_amd64.whl", hash = "sha256:92a0a01ead5e668468e952e4238cccd7c537364eb7d851ab144ab6627dbbe12f", size = 159634, upload-time = "2026-04-02T09:27:26.642Z" }, + { url = "https://files.pythonhosted.org/packages/c6/a3/c2369911cd72f02386e4e340770f6e158c7980267da16af8f668217abaa0/charset_normalizer-3.4.7-cp314-cp314-win_arm64.whl", hash = "sha256:67f6279d125ca0046a7fd386d01b311c6363844deac3e5b069b514ba3e63c246", size = 148384, upload-time = "2026-04-02T09:27:28.271Z" }, + { url = "https://files.pythonhosted.org/packages/94/09/7e8a7f73d24dba1f0035fbbf014d2c36828fc1bf9c88f84093e57d315935/charset_normalizer-3.4.7-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:effc3f449787117233702311a1b7d8f59cba9ced946ba727bdc329ec69028e24", size = 330133, upload-time = "2026-04-02T09:27:29.474Z" }, + { url = "https://files.pythonhosted.org/packages/8d/da/96975ddb11f8e977f706f45cddd8540fd8242f71ecdb5d18a80723dcf62c/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fbccdc05410c9ee21bbf16a35f4c1d16123dcdeb8a1d38f33654fa21d0234f79", size = 216257, upload-time = "2026-04-02T09:27:30.793Z" }, + { url = "https://files.pythonhosted.org/packages/e5/e8/1d63bf8ef2d388e95c64b2098f45f84758f6d102a087552da1485912637b/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:733784b6d6def852c814bce5f318d25da2ee65dd4839a0718641c696e09a2960", size = 234851, upload-time = "2026-04-02T09:27:32.44Z" }, + { url = "https://files.pythonhosted.org/packages/9b/40/e5ff04233e70da2681fa43969ad6f66ca5611d7e669be0246c4c7aaf6dc8/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a89c23ef8d2c6b27fd200a42aa4ac72786e7c60d40efdc76e6011260b6e949c4", size = 233393, upload-time = "2026-04-02T09:27:34.03Z" }, + { url = "https://files.pythonhosted.org/packages/be/c1/06c6c49d5a5450f76899992f1ee40b41d076aee9279b49cf9974d2f313d5/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6c114670c45346afedc0d947faf3c7f701051d2518b943679c8ff88befe14f8e", size = 223251, upload-time = "2026-04-02T09:27:35.369Z" }, + { url = "https://files.pythonhosted.org/packages/2b/9f/f2ff16fb050946169e3e1f82134d107e5d4ae72647ec8a1b1446c148480f/charset_normalizer-3.4.7-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:a180c5e59792af262bf263b21a3c49353f25945d8d9f70628e73de370d55e1e1", size = 206609, upload-time = "2026-04-02T09:27:36.661Z" }, + { url = "https://files.pythonhosted.org/packages/69/d5/a527c0cd8d64d2eab7459784fb4169a0ac76e5a6fc5237337982fd61347e/charset_normalizer-3.4.7-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3c9a494bc5ec77d43cea229c4f6db1e4d8fe7e1bbffa8b6f0f0032430ff8ab44", size = 220014, upload-time = "2026-04-02T09:27:38.019Z" }, + { url = "https://files.pythonhosted.org/packages/7e/80/8a7b8104a3e203074dc9aa2c613d4b726c0e136bad1cc734594b02867972/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8d828b6667a32a728a1ad1d93957cdf37489c57b97ae6c4de2860fa749b8fc1e", size = 218979, upload-time = "2026-04-02T09:27:39.37Z" }, + { url = "https://files.pythonhosted.org/packages/02/9a/b759b503d507f375b2b5c153e4d2ee0a75aa215b7f2489cf314f4541f2c0/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:cf1493cd8607bec4d8a7b9b004e699fcf8f9103a9284cc94962cb73d20f9d4a3", size = 209238, upload-time = "2026-04-02T09:27:40.722Z" }, + { url = "https://files.pythonhosted.org/packages/c2/4e/0f3f5d47b86bdb79256e7290b26ac847a2832d9a4033f7eb2cd4bcf4bb5b/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:0c96c3b819b5c3e9e165495db84d41914d6894d55181d2d108cc1a69bfc9cce0", size = 236110, upload-time = "2026-04-02T09:27:42.33Z" }, + { url = "https://files.pythonhosted.org/packages/96/23/bce28734eb3ed2c91dcf93abeb8a5cf393a7b2749725030bb630e554fdd8/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:752a45dc4a6934060b3b0dab47e04edc3326575f82be64bc4fc293914566503e", size = 219824, upload-time = "2026-04-02T09:27:43.924Z" }, + { url = "https://files.pythonhosted.org/packages/2c/6f/6e897c6984cc4d41af319b077f2f600fc8214eb2fe2d6bcb79141b882400/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:8778f0c7a52e56f75d12dae53ae320fae900a8b9b4164b981b9c5ce059cd1fcb", size = 233103, upload-time = "2026-04-02T09:27:45.348Z" }, + { url = "https://files.pythonhosted.org/packages/76/22/ef7bd0fe480a0ae9b656189ec00744b60933f68b4f42a7bb06589f6f576a/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ce3412fbe1e31eb81ea42f4169ed94861c56e643189e1e75f0041f3fe7020abe", size = 225194, upload-time = "2026-04-02T09:27:46.706Z" }, + { url = "https://files.pythonhosted.org/packages/c5/a7/0e0ab3e0b5bc1219bd80a6a0d4d72ca74d9250cb2382b7c699c147e06017/charset_normalizer-3.4.7-cp314-cp314t-win32.whl", hash = "sha256:c03a41a8784091e67a39648f70c5f97b5b6a37f216896d44d2cdcb82615339a0", size = 159827, upload-time = "2026-04-02T09:27:48.053Z" }, + { url = "https://files.pythonhosted.org/packages/7a/1d/29d32e0fb40864b1f878c7f5a0b343ae676c6e2b271a2d55cc3a152391da/charset_normalizer-3.4.7-cp314-cp314t-win_amd64.whl", hash = "sha256:03853ed82eeebbce3c2abfdbc98c96dc205f32a79627688ac9a27370ea61a49c", size = 174168, upload-time = "2026-04-02T09:27:49.795Z" }, + { url = "https://files.pythonhosted.org/packages/de/32/d92444ad05c7a6e41fb2036749777c163baf7a0301a040cb672d6b2b1ae9/charset_normalizer-3.4.7-cp314-cp314t-win_arm64.whl", hash = "sha256:c35abb8bfff0185efac5878da64c45dafd2b37fb0383add1be155a763c1f083d", size = 153018, upload-time = "2026-04-02T09:27:51.116Z" }, + { url = "https://files.pythonhosted.org/packages/db/8f/61959034484a4a7c527811f4721e75d02d653a35afb0b6054474d8185d4c/charset_normalizer-3.4.7-py3-none-any.whl", hash = "sha256:3dce51d0f5e7951f8bb4900c257dad282f49190fdbebecd4ba99bcc41fef404d", size = 61958, upload-time = "2026-04-02T09:28:37.794Z" }, +] + +[[package]] +name = "click" +version = "8.3.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bb/63/f9e1ea081ce35720d8b92acde70daaedace594dc93b693c869e0d5910718/click-8.3.3.tar.gz", hash = "sha256:398329ad4837b2ff7cbe1dd166a4c0f8900c3ca3a218de04466f38f6497f18a2", size = 328061, upload-time = "2026-04-22T15:11:27.506Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl", hash = "sha256:a2bf429bb3033c89fa4936ffb35d5cb471e3719e1f3c8a7c3fff0b8314305613", size = 110502, upload-time = "2026-04-22T15:11:25.044Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "coverage" +version = "7.14.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/23/7f/d0720730a397a999ffc0fd3f5bebef347338e3a47b727da66fbb228e2ff2/coverage-7.14.0.tar.gz", hash = "sha256:057a6af2f160a85384cde4ab36f0d2777bae1057bae255f95413cdd382aa5c74", size = 919489, upload-time = "2026-05-10T18:02:31.397Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1c/18/b9a6586d73992807c26f9a5f274131be3d76b56b18a82b9392e2a25d2e45/coverage-7.14.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:9aed9fa983514ca032790f3fe0d1c0e42ca7e16b42432af1706b50a9a46bef5d", size = 220036, upload-time = "2026-05-10T18:01:33.057Z" }, + { url = "https://files.pythonhosted.org/packages/f3/9b/4165a1d56ddc302a0e2d518fd9d412a4fd0b57562618c78c5f21c57194f5/coverage-7.14.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ba3b8390db29296dbbf49e91b6fe08f990743a90c8f447ba4c2ffc29670dfa63", size = 220368, upload-time = "2026-05-10T18:01:34.705Z" }, + { url = "https://files.pythonhosted.org/packages/69/aa/c12e52a5ba148d9995229d557e3be6e554fe469addc0e9241b2f0956d8ea/coverage-7.14.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3a5d8e876dfa2f102e970b183863d6dedd023d3c0eeca1fe7a9787bc5f28b212", size = 251417, upload-time = "2026-05-10T18:01:36.949Z" }, + { url = "https://files.pythonhosted.org/packages/d7/51/ec641c26e6dca1b25a7d2035ba6ecb7c884ef1a100a9e42fbe4ce4405139/coverage-7.14.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:5ebb8f4614a3787d567e610bbfdf96a4798dd69a1afb1bd8ad228d4111fe6ff3", size = 253924, upload-time = "2026-05-10T18:01:38.985Z" }, + { url = "https://files.pythonhosted.org/packages/33/c4/59c3de0bd1b538824173fd518fed51c1ce740ca5ed68e74545983f4053a9/coverage-7.14.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b9bf47223dd8db3d4c4b2e443b02bace480d428f0822c3f991600448a176c97", size = 255269, upload-time = "2026-05-10T18:01:40.957Z" }, + { url = "https://files.pythonhosted.org/packages/7b/a9/36dfa153a62040296f6e7febfdb20a5720622f6ef5a81a41e8237b9a5344/coverage-7.14.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3485a836550b303d006d57cc06e3d5afaabc642c77050b7c985a97b13e3776b8", size = 257583, upload-time = "2026-05-10T18:01:42.607Z" }, + { url = "https://files.pythonhosted.org/packages/26/7b/cc2c048d4114d9ab1c2409e9ee365e5ae10736df6dffcfc9444effa6c708/coverage-7.14.0-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3e7e88110bae996d199d1693ca8ec3fd52441d426401ae963437598667b4c5eb", size = 251434, upload-time = "2026-05-10T18:01:44.537Z" }, + { url = "https://files.pythonhosted.org/packages/ee/df/6770eaa576e604575e9a78055313250faef5faa84bd6f71a39fece519c43/coverage-7.14.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:15228a6800ce7bdf1b74800595e56db7138cecb338fdbf044806e10dcf182dfe", size = 253280, upload-time = "2026-05-10T18:01:46.175Z" }, + { url = "https://files.pythonhosted.org/packages/ad/9e/1c0264514a3f98259a6d64765a397b2c8373e3ba59ee722a4802d3ec0c61/coverage-7.14.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:9d26ac7f5398bafc5b57421ad994e8a4749e8a7a0e62d05ec7d53014d5963bfa", size = 251241, upload-time = "2026-05-10T18:01:48.732Z" }, + { url = "https://files.pythonhosted.org/packages/64/16/4efdf3e3c4079cdbf0ece56a2fea872df9e8a3e15a13a0af4400e1075944/coverage-7.14.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:2fb73254ff43c911c967a899e1359bc5049b4b115d6e8fbdde4937d0a2246cd5", size = 255516, upload-time = "2026-05-10T18:01:50.819Z" }, + { url = "https://files.pythonhosted.org/packages/93/69/b1de96346603881b3d1bc8d6447c83200e1c9700ffbaff926ba01ff5724c/coverage-7.14.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:454a380af72c6adada298ed270d38c7a391288198dbfb8467f786f588751a90c", size = 251059, upload-time = "2026-05-10T18:01:52.773Z" }, + { url = "https://files.pythonhosted.org/packages/a4/66/2881853e0363a5e0a724d1103e53650795367471b6afb234f8b49e713bc6/coverage-7.14.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:65c86fb646d2bd2972e96bd1a8b45817ed907cee68655d6295fe7ec031d04cca", size = 252716, upload-time = "2026-05-10T18:01:54.506Z" }, + { url = "https://files.pythonhosted.org/packages/55/5c/0d3305d002c41dcde873dbe456491e663dc55152ca526b630b5c47efd62f/coverage-7.14.0-cp314-cp314-win32.whl", hash = "sha256:6a6516b02a6101398e19a3f44820f69bab2590697f7def4331f668b14adaf828", size = 222788, upload-time = "2026-05-10T18:01:56.487Z" }, + { url = "https://files.pythonhosted.org/packages/f9/58/6e1b8f52fdc3184b47dc5037f5070d83a3d11042db1594b02d2a44d786c8/coverage-7.14.0-cp314-cp314-win_amd64.whl", hash = "sha256:45e0f79d8351fa76e256716df91eab12890d32678b9590df7ae1042e4bd4cf5d", size = 223600, upload-time = "2026-05-10T18:01:58.497Z" }, + { url = "https://files.pythonhosted.org/packages/00/70/a18c408e674bc26281cadaedc7351f929bd2094e191e4b15271c30b084cc/coverage-7.14.0-cp314-cp314-win_arm64.whl", hash = "sha256:4b899594a8b2d81e5cc064a0d7f9cac2081fed91049456cae7676787e41549c9", size = 222168, upload-time = "2026-05-10T18:02:00.411Z" }, + { url = "https://files.pythonhosted.org/packages/3d/89/2681f071d238b62aff8dfc2ab44fc24cfdb38d1c01f391a80522ff5d3a16/coverage-7.14.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:f580f8c80acd94ac72e863efe2cab791d8c38d153e0b463b92dfa000d5c84cd1", size = 220766, upload-time = "2026-05-10T18:02:02.313Z" }, + { url = "https://files.pythonhosted.org/packages/bd/c7/c987babafd9207ffa1995e1ef1f9b26762cf4963aa768a66b6f0501e4616/coverage-7.14.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a2bd259c442cd43c49b30fbafc51776eb19ea396faf159d26a83e6a0a5f13b0c", size = 221035, upload-time = "2026-05-10T18:02:04.017Z" }, + { url = "https://files.pythonhosted.org/packages/5a/e9/d6a5ac3b333088143d6fc877d398a9a674dc03124a2f776e131f03864823/coverage-7.14.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:a706b908dfa85538863504c624b237a3cc34232bf403c057414ebfdb3b4d9f84", size = 262405, upload-time = "2026-05-10T18:02:05.915Z" }, + { url = "https://files.pythonhosted.org/packages/38/b1/e70838d29a7c08e22d44398a46db90815bbcbf28de06992bd9210d1a8d8e/coverage-7.14.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7333cd944ee4393b9b3d3c1b598c936d4fc8d70573a4c7dacfec5590dd50e436", size = 264530, upload-time = "2026-05-10T18:02:07.582Z" }, + { url = "https://files.pythonhosted.org/packages/6b/73/5c31ef97763288d03d9995152b96d5475b527c63d91c84b01caea894b83a/coverage-7.14.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0f162bc9a15b82d947b02651b0c7e1609d6f7a8735ca330cfadec8481dd97d5a", size = 266932, upload-time = "2026-05-10T18:02:09.401Z" }, + { url = "https://files.pythonhosted.org/packages/e1/76/dd56d80f29c5f05b4d76f7e7c6d47cafacae017189c75c5759d24f9ff0cc/coverage-7.14.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:362cb78e01a5dc82009d88004cf60f2e6b6d6fcbfdec05b05af73b0abf40118f", size = 268062, upload-time = "2026-05-10T18:02:11.399Z" }, + { url = "https://files.pythonhosted.org/packages/6e/c7/27ba85cd5b95614f159ff93ebff1901584a8d192e2e5e24c4943a7453f59/coverage-7.14.0-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:acebd068fca5512c3a6fde9c045f901613478781a73f0e82b307b214daef23fb", size = 261504, upload-time = "2026-05-10T18:02:13.257Z" }, + { url = "https://files.pythonhosted.org/packages/13/2e/e8149f60ab5d5684c6eee881bdf34b127115cddbb958b196768dd9d63473/coverage-7.14.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:29fe3da551dface75deb2ccbf87b6b66e2e7ef38f6d89050b428be94afff3490", size = 264398, upload-time = "2026-05-10T18:02:15.063Z" }, + { url = "https://files.pythonhosted.org/packages/d9/7f/1261b025285323225f4b4abffa5a643649dfd67e25ddca7ebcbdea3b7cb3/coverage-7.14.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:b4cc4fce8672fffcb09b0eafc167b396b3ba53c4a7230f54b7aaffbf6c835fa9", size = 262000, upload-time = "2026-05-10T18:02:16.756Z" }, + { url = "https://files.pythonhosted.org/packages/d3/dc/829c54f60b9d08389439c00f813c752781c496fc5788c78d8006db4b4f2b/coverage-7.14.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:5d4a51aad8ba8bdcd2b8bd8f03d4aca19693fa2327a3470e4718a25b03481020", size = 265732, upload-time = "2026-05-10T18:02:18.817Z" }, + { url = "https://files.pythonhosted.org/packages/ed/b0/70bd1419941652fa062689cba9c3eeafb8f5e6fbb890bce41c3bdda5dbd6/coverage-7.14.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:9f323af3e1e4f68b60b7b247e37b8515563a61375518fa59de1af48ba28a3db6", size = 260847, upload-time = "2026-05-10T18:02:20.528Z" }, + { url = "https://files.pythonhosted.org/packages/f2/73/be40b2390656c654d35ea0015ea7ba3d945769cf80790ad5e0bb2d56d2ba/coverage-7.14.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:1a0abc7342ea9711c469dd8b821c6c311e6bc6aac1442e5fbd6b27fae0a8f3db", size = 263166, upload-time = "2026-05-10T18:02:22.337Z" }, + { url = "https://files.pythonhosted.org/packages/29/55/4a643f712fcf7cf2881f8ec1e0ccb7b164aff3108f69b51801246c8799f2/coverage-7.14.0-cp314-cp314t-win32.whl", hash = "sha256:a9f864ef57b7172e2db87a096642dd51e179e085ab6b2c371c29e885f65c8fb2", size = 223573, upload-time = "2026-05-10T18:02:24.11Z" }, + { url = "https://files.pythonhosted.org/packages/27/96/3acae5da0953be042c0b4dea6d6789d2f080701c77b88e44d5bd41b9219b/coverage-7.14.0-cp314-cp314t-win_amd64.whl", hash = "sha256:29943e552fdc08e082eb51400fb2f58e118a83b5542bd06531214e084399b644", size = 224680, upload-time = "2026-05-10T18:02:25.896Z" }, + { url = "https://files.pythonhosted.org/packages/93/3d/6ab5d2dd8325d838737c6f8d83d62eb6230e0d70b87b51b57bbfd08fa767/coverage-7.14.0-cp314-cp314t-win_arm64.whl", hash = "sha256:742a73ea621953b012f2c4c2219b512180dd84489acf5b1596b0aafc55b9100b", size = 222703, upload-time = "2026-05-10T18:02:27.822Z" }, + { url = "https://files.pythonhosted.org/packages/61/e8/cb8e80d6f9f55b99588625062822bf946cf03ed06315df4bd8397f5632a1/coverage-7.14.0-py3-none-any.whl", hash = "sha256:8de5b61163aee3d05c8a2beab6f47913df7981dad1baf82c414d99158c286ab1", size = 211764, upload-time = "2026-05-10T18:02:29.538Z" }, +] + +[[package]] +name = "devops-info-service" +version = "1.12.0" +source = { virtual = "." } +dependencies = [ + { name = "flask" }, + { name = "gunicorn" }, + { name = "prometheus-client" }, + { name = "requests" }, +] + +[package.dev-dependencies] +dev = [ + { name = "flake8" }, + { name = "pep8-naming" }, + { name = "pytest" }, + { name = "pytest-cov" }, +] + +[package.metadata] +requires-dist = [ + { name = "flask", specifier = ">=3.1.3,<4.0.0" }, + { name = "gunicorn", specifier = ">=25.1.0,<26.0.0" }, + { name = "prometheus-client", specifier = "==0.23.1" }, + { name = "requests", specifier = ">=2.32.5,<3.0.0" }, +] + +[package.metadata.requires-dev] +dev = [ + { name = "flake8", specifier = ">=7.3.0,<8.0.0" }, + { name = "pep8-naming", specifier = ">=0.15.1,<0.16.0" }, + { name = "pytest", specifier = ">=9.0.2,<10.0.0" }, + { name = "pytest-cov", specifier = ">=7.0.0,<8.0.0" }, +] + +[[package]] +name = "flake8" +version = "7.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mccabe" }, + { name = "pycodestyle" }, + { name = "pyflakes" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9b/af/fbfe3c4b5a657d79e5c47a2827a362f9e1b763336a52f926126aa6dc7123/flake8-7.3.0.tar.gz", hash = "sha256:fe044858146b9fc69b551a4b490d69cf960fcb78ad1edcb84e7fbb1b4a8e3872", size = 48326, upload-time = "2025-06-20T19:31:35.838Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9f/56/13ab06b4f93ca7cac71078fbe37fcea175d3216f31f85c3168a6bbd0bb9a/flake8-7.3.0-py2.py3-none-any.whl", hash = "sha256:b9696257b9ce8beb888cdbe31cf885c90d31928fe202be0889a7cdafad32f01e", size = 57922, upload-time = "2025-06-20T19:31:34.425Z" }, +] + +[[package]] +name = "flask" +version = "3.1.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "blinker" }, + { name = "click" }, + { name = "itsdangerous" }, + { name = "jinja2" }, + { name = "markupsafe" }, + { name = "werkzeug" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/26/00/35d85dcce6c57fdc871f3867d465d780f302a175ea360f62533f12b27e2b/flask-3.1.3.tar.gz", hash = "sha256:0ef0e52b8a9cd932855379197dd8f94047b359ca0a78695144304cb45f87c9eb", size = 759004, upload-time = "2026-02-19T05:00:57.678Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/9c/34f6962f9b9e9c71f6e5ed806e0d0ff03c9d1b0b2340088a0cf4bce09b18/flask-3.1.3-py3-none-any.whl", hash = "sha256:f4bcbefc124291925f1a26446da31a5178f9483862233b23c0c96a20701f670c", size = 103424, upload-time = "2026-02-19T05:00:56.027Z" }, +] + +[[package]] +name = "gunicorn" +version = "25.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c4/f4/e78fa054248fab913e2eab0332c6c2cb07421fca1ce56d8fe43b6aef57a4/gunicorn-25.3.0.tar.gz", hash = "sha256:f74e1b2f9f76f6cd1ca01198968bd2dd65830edc24b6e8e4d78de8320e2fe889", size = 634883, upload-time = "2026-03-27T00:00:26.092Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/43/c8/8aaf447698c4d59aa853fd318eed300b5c9e44459f242ab8ead6c9c09792/gunicorn-25.3.0-py3-none-any.whl", hash = "sha256:cacea387dab08cd6776501621c295a904fe8e3b7aae9a1a3cbb26f4e7ed54660", size = 208403, upload-time = "2026-03-27T00:00:27.386Z" }, +] + +[[package]] +name = "idna" +version = "3.15" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/82/77/7b3966d0b9d1d31a36ddf1746926a11dface89a83409bf1483f0237aa758/idna-3.15.tar.gz", hash = "sha256:ca962446ea538f7092a95e057da437618e886f4d349216d2b1e294abfdb65fdc", size = 199245, upload-time = "2026-05-12T22:45:57.011Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/23/408243171aa9aaba178d3e2559159c24c1171a641aa83b67bdd3394ead8e/idna-3.15-py3-none-any.whl", hash = "sha256:048adeaf8c2d788c40fee287673ccaa74c24ffd8dcf09ffa555a2fbb59f10ac8", size = 72340, upload-time = "2026-05-12T22:45:55.733Z" }, +] + +[[package]] +name = "iniconfig" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, +] + +[[package]] +name = "itsdangerous" +version = "2.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9c/cb/8ac0172223afbccb63986cc25049b154ecfb5e85932587206f42317be31d/itsdangerous-2.2.0.tar.gz", hash = "sha256:e0050c0b7da1eea53ffaf149c0cfbb5c6e2e2b69c4bef22c81fa6eb73e5f6173", size = 54410, upload-time = "2024-04-16T21:28:15.614Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/96/92447566d16df59b2a776c0fb82dbc4d9e07cd95062562af01e408583fc4/itsdangerous-2.2.0-py3-none-any.whl", hash = "sha256:c6242fc49e35958c8b15141343aa660db5fc54d4f13a1db01a3f5891b98700ef", size = 16234, upload-time = "2024-04-16T21:28:14.499Z" }, +] + +[[package]] +name = "jinja2" +version = "3.1.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, +] + +[[package]] +name = "markupsafe" +version = "3.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313, upload-time = "2025-09-27T18:37:40.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/33/8a/8e42d4838cd89b7dde187011e97fe6c3af66d8c044997d2183fbd6d31352/markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe", size = 11619, upload-time = "2025-09-27T18:37:06.342Z" }, + { url = "https://files.pythonhosted.org/packages/b5/64/7660f8a4a8e53c924d0fa05dc3a55c9cee10bbd82b11c5afb27d44b096ce/markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026", size = 12029, upload-time = "2025-09-27T18:37:07.213Z" }, + { url = "https://files.pythonhosted.org/packages/da/ef/e648bfd021127bef5fa12e1720ffed0c6cbb8310c8d9bea7266337ff06de/markupsafe-3.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737", size = 24408, upload-time = "2025-09-27T18:37:09.572Z" }, + { url = "https://files.pythonhosted.org/packages/41/3c/a36c2450754618e62008bf7435ccb0f88053e07592e6028a34776213d877/markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97", size = 23005, upload-time = "2025-09-27T18:37:10.58Z" }, + { url = "https://files.pythonhosted.org/packages/bc/20/b7fdf89a8456b099837cd1dc21974632a02a999ec9bf7ca3e490aacd98e7/markupsafe-3.0.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d", size = 22048, upload-time = "2025-09-27T18:37:11.547Z" }, + { url = "https://files.pythonhosted.org/packages/9a/a7/591f592afdc734f47db08a75793a55d7fbcc6902a723ae4cfbab61010cc5/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda", size = 23821, upload-time = "2025-09-27T18:37:12.48Z" }, + { url = "https://files.pythonhosted.org/packages/7d/33/45b24e4f44195b26521bc6f1a82197118f74df348556594bd2262bda1038/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf", size = 21606, upload-time = "2025-09-27T18:37:13.485Z" }, + { url = "https://files.pythonhosted.org/packages/ff/0e/53dfaca23a69fbfbbf17a4b64072090e70717344c52eaaaa9c5ddff1e5f0/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe", size = 23043, upload-time = "2025-09-27T18:37:14.408Z" }, + { url = "https://files.pythonhosted.org/packages/46/11/f333a06fc16236d5238bfe74daccbca41459dcd8d1fa952e8fbd5dccfb70/markupsafe-3.0.3-cp314-cp314-win32.whl", hash = "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9", size = 14747, upload-time = "2025-09-27T18:37:15.36Z" }, + { url = "https://files.pythonhosted.org/packages/28/52/182836104b33b444e400b14f797212f720cbc9ed6ba34c800639d154e821/markupsafe-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581", size = 15341, upload-time = "2025-09-27T18:37:16.496Z" }, + { url = "https://files.pythonhosted.org/packages/6f/18/acf23e91bd94fd7b3031558b1f013adfa21a8e407a3fdb32745538730382/markupsafe-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4", size = 14073, upload-time = "2025-09-27T18:37:17.476Z" }, + { url = "https://files.pythonhosted.org/packages/3c/f0/57689aa4076e1b43b15fdfa646b04653969d50cf30c32a102762be2485da/markupsafe-3.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab", size = 11661, upload-time = "2025-09-27T18:37:18.453Z" }, + { url = "https://files.pythonhosted.org/packages/89/c3/2e67a7ca217c6912985ec766c6393b636fb0c2344443ff9d91404dc4c79f/markupsafe-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175", size = 12069, upload-time = "2025-09-27T18:37:19.332Z" }, + { url = "https://files.pythonhosted.org/packages/f0/00/be561dce4e6ca66b15276e184ce4b8aec61fe83662cce2f7d72bd3249d28/markupsafe-3.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634", size = 25670, upload-time = "2025-09-27T18:37:20.245Z" }, + { url = "https://files.pythonhosted.org/packages/50/09/c419f6f5a92e5fadde27efd190eca90f05e1261b10dbd8cbcb39cd8ea1dc/markupsafe-3.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50", size = 23598, upload-time = "2025-09-27T18:37:21.177Z" }, + { url = "https://files.pythonhosted.org/packages/22/44/a0681611106e0b2921b3033fc19bc53323e0b50bc70cffdd19f7d679bb66/markupsafe-3.0.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e", size = 23261, upload-time = "2025-09-27T18:37:22.167Z" }, + { url = "https://files.pythonhosted.org/packages/5f/57/1b0b3f100259dc9fffe780cfb60d4be71375510e435efec3d116b6436d43/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5", size = 24835, upload-time = "2025-09-27T18:37:23.296Z" }, + { url = "https://files.pythonhosted.org/packages/26/6a/4bf6d0c97c4920f1597cc14dd720705eca0bf7c787aebc6bb4d1bead5388/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523", size = 22733, upload-time = "2025-09-27T18:37:24.237Z" }, + { url = "https://files.pythonhosted.org/packages/14/c7/ca723101509b518797fedc2fdf79ba57f886b4aca8a7d31857ba3ee8281f/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc", size = 23672, upload-time = "2025-09-27T18:37:25.271Z" }, + { url = "https://files.pythonhosted.org/packages/fb/df/5bd7a48c256faecd1d36edc13133e51397e41b73bb77e1a69deab746ebac/markupsafe-3.0.3-cp314-cp314t-win32.whl", hash = "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d", size = 14819, upload-time = "2025-09-27T18:37:26.285Z" }, + { url = "https://files.pythonhosted.org/packages/1a/8a/0402ba61a2f16038b48b39bccca271134be00c5c9f0f623208399333c448/markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9", size = 15426, upload-time = "2025-09-27T18:37:27.316Z" }, + { url = "https://files.pythonhosted.org/packages/70/bc/6f1c2f612465f5fa89b95bead1f44dcb607670fd42891d8fdcd5d039f4f4/markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa", size = 14146, upload-time = "2025-09-27T18:37:28.327Z" }, +] + +[[package]] +name = "mccabe" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/ff/0ffefdcac38932a54d2b5eed4e0ba8a408f215002cd178ad1df0f2806ff8/mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325", size = 9658, upload-time = "2022-01-24T01:14:51.113Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/27/1a/1f68f9ba0c207934b35b86a8ca3aad8395a3d6dd7921c0686e23853ff5a9/mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e", size = 7350, upload-time = "2022-01-24T01:14:49.62Z" }, +] + +[[package]] +name = "packaging" +version = "26.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/f1/e7a6dd94a8d4a5626c03e4e99c87f241ba9e350cd9e6d75123f992427270/packaging-26.2.tar.gz", hash = "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661", size = 228134, upload-time = "2026-04-24T20:15:23.917Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl", hash = "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e", size = 100195, upload-time = "2026-04-24T20:15:22.081Z" }, +] + +[[package]] +name = "pep8-naming" +version = "0.15.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "flake8" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8d/59/c32862134635ba231d45f1711035550dc38246396c27269a4cde4bfe18d2/pep8_naming-0.15.1.tar.gz", hash = "sha256:f6f4a499aba2deeda93c1f26ccc02f3da32b035c8b2db9696b730ef2c9639d29", size = 17640, upload-time = "2025-05-05T20:43:12.555Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a6/78/25281540f1121acaa78926f599a17ce102b8971bc20b096fa7fb6b5b59c1/pep8_naming-0.15.1-py3-none-any.whl", hash = "sha256:eb63925e7fd9e028c7f7ee7b1e413ec03d1ee5de0e627012102ee0222c273c86", size = 9561, upload-time = "2025-05-05T20:43:11.626Z" }, +] + +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, +] + +[[package]] +name = "prometheus-client" +version = "0.23.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/23/53/3edb5d68ecf6b38fcbcc1ad28391117d2a322d9a1a3eff04bfdb184d8c3b/prometheus_client-0.23.1.tar.gz", hash = "sha256:6ae8f9081eaaaf153a2e959d2e6c4f4fb57b12ef76c8c7980202f1e57b48b2ce", size = 80481, upload-time = "2025-09-18T20:47:25.043Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b8/db/14bafcb4af2139e046d03fd00dea7873e48eafe18b7d2797e73d6681f210/prometheus_client-0.23.1-py3-none-any.whl", hash = "sha256:dd1913e6e76b59cfe44e7a4b83e01afc9873c1bdfd2ed8739f1e76aeca115f99", size = 61145, upload-time = "2025-09-18T20:47:23.875Z" }, +] + +[[package]] +name = "pycodestyle" +version = "2.14.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/11/e0/abfd2a0d2efe47670df87f3e3a0e2edda42f055053c85361f19c0e2c1ca8/pycodestyle-2.14.0.tar.gz", hash = "sha256:c4b5b517d278089ff9d0abdec919cd97262a3367449ea1c8b49b91529167b783", size = 39472, upload-time = "2025-06-20T18:49:48.75Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d7/27/a58ddaf8c588a3ef080db9d0b7e0b97215cee3a45df74f3a94dbbf5c893a/pycodestyle-2.14.0-py2.py3-none-any.whl", hash = "sha256:dd6bf7cb4ee77f8e016f9c8e74a35ddd9f67e1d5fd4184d86c3b98e07099f42d", size = 31594, upload-time = "2025-06-20T18:49:47.491Z" }, +] + +[[package]] +name = "pyflakes" +version = "3.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/45/dc/fd034dc20b4b264b3d015808458391acbf9df40b1e54750ef175d39180b1/pyflakes-3.4.0.tar.gz", hash = "sha256:b24f96fafb7d2ab0ec5075b7350b3d2d2218eab42003821c06344973d3ea2f58", size = 64669, upload-time = "2025-06-20T18:45:27.834Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c2/2f/81d580a0fb83baeb066698975cb14a618bdbed7720678566f1b046a95fe8/pyflakes-3.4.0-py2.py3-none-any.whl", hash = "sha256:f742a7dbd0d9cb9ea41e9a24a918996e8170c799fa528688d40dd582c8265f4f", size = 63551, upload-time = "2025-06-20T18:45:26.937Z" }, +] + +[[package]] +name = "pygments" +version = "2.20.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" }, +] + +[[package]] +name = "pytest" +version = "9.0.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7d/0d/549bd94f1a0a402dc8cf64563a117c0f3765662e2e668477624baeec44d5/pytest-9.0.3.tar.gz", hash = "sha256:b86ada508af81d19edeb213c681b1d48246c1a91d304c6c81a427674c17eb91c", size = 1572165, upload-time = "2026-04-07T17:16:18.027Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl", hash = "sha256:2c5efc453d45394fdd706ade797c0a81091eccd1d6e4bccfcd476e2b8e0ab5d9", size = 375249, upload-time = "2026-04-07T17:16:16.13Z" }, +] + +[[package]] +name = "pytest-cov" +version = "7.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "coverage" }, + { name = "pluggy" }, + { name = "pytest" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/51/a849f96e117386044471c8ec2bd6cfebacda285da9525c9106aeb28da671/pytest_cov-7.1.0.tar.gz", hash = "sha256:30674f2b5f6351aa09702a9c8c364f6a01c27aae0c1366ae8016160d1efc56b2", size = 55592, upload-time = "2026-03-21T20:11:16.284Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9d/7a/d968e294073affff457b041c2be9868a40c1c71f4a35fcc1e45e5493067b/pytest_cov-7.1.0-py3-none-any.whl", hash = "sha256:a0461110b7865f9a271aa1b51e516c9a95de9d696734a2f71e3e78f46e1d4678", size = 22876, upload-time = "2026-03-21T20:11:14.438Z" }, +] + +[[package]] +name = "requests" +version = "2.34.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ac/c3/e2a2b89f2d3e2179abd6d00ebd70bff6273f37fb3e0cc209f48b39d00cbf/requests-2.34.2.tar.gz", hash = "sha256:f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed", size = 142856, upload-time = "2026-05-14T19:25:27.735Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl", hash = "sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0", size = 73075, upload-time = "2026-05-14T19:25:26.443Z" }, +] + +[[package]] +name = "urllib3" +version = "2.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/53/0c/06f8b233b8fd13b9e5ee11424ef85419ba0d8ba0b3138bf360be2ff56953/urllib3-2.7.0.tar.gz", hash = "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c", size = 433602, upload-time = "2026-05-07T16:13:18.596Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl", hash = "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897", size = 131087, upload-time = "2026-05-07T16:13:17.151Z" }, +] + +[[package]] +name = "werkzeug" +version = "3.1.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/dd/b2/381be8cfdee792dd117872481b6e378f85c957dd7c5bca38897b08f765fd/werkzeug-3.1.8.tar.gz", hash = "sha256:9bad61a4268dac112f1c5cd4630a56ede601b6ed420300677a869083d70a4c44", size = 875852, upload-time = "2026-04-02T18:49:14.268Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/93/8c/2e650f2afeb7ee576912636c23ddb621c91ac6a98e66dc8d29c3c69446e1/werkzeug-3.1.8-py3-none-any.whl", hash = "sha256:63a77fb8892bf28ebc3178683445222aa500e48ebad5ec77b0ad80f8726b1f50", size = 226459, upload-time = "2026-04-02T18:49:12.72Z" }, +] From 317742820088935840987debb78e6d6a540e8578 Mon Sep 17 00:00:00 2001 From: LocalT0aster <90502400+LocalT0aster@users.noreply.github.com> Date: Fri, 15 May 2026 05:25:53 +0300 Subject: [PATCH 19/21] nix: add reproducible python build module nix: preserve app runtime environment overrides nix: move flake into nix folder Co-authored-by: OpenAI Codex --- nix/devshell.nix | 20 +++++++ nix/docker.nix | 34 ++++++++++++ nix/flake.lock | 27 ++++++++++ nix/flake.nix | 70 +++++++++++++++++++++++++ nix/package.nix | 133 +++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 284 insertions(+) create mode 100644 nix/devshell.nix create mode 100644 nix/docker.nix create mode 100644 nix/flake.lock create mode 100644 nix/flake.nix create mode 100644 nix/package.nix diff --git a/nix/devshell.nix b/nix/devshell.nix new file mode 100644 index 0000000000..4c5c555f5f --- /dev/null +++ b/nix/devshell.nix @@ -0,0 +1,20 @@ +{ + mkShell, + python314, + uv, + curl, + docker, + jq, +}: + +mkShell { + packages = [ + python314 + uv + curl + docker + jq + ]; + + UV_PYTHON = "${python314}/bin/python3.14"; +} diff --git a/nix/docker.nix b/nix/docker.nix new file mode 100644 index 0000000000..415ecad132 --- /dev/null +++ b/nix/docker.nix @@ -0,0 +1,34 @@ +{ + dockerTools, + appPackage, +}: + +dockerTools.buildLayeredImage { + name = "devops-info-service-nix"; + tag = "lab18"; + created = "1970-01-01T00:00:01Z"; + + contents = [ + appPackage + dockerTools.fakeNss + ]; + + extraCommands = '' + mkdir -p data tmp + chmod 0777 data tmp + ''; + + config = { + Cmd = [ "${appPackage}/bin/devops-info-service" ]; + Env = [ + "HOST=0.0.0.0" + "PORT=5000" + "PYTHONDONTWRITEBYTECODE=1" + ]; + ExposedPorts = { + "5000/tcp" = { }; + }; + WorkingDir = "/"; + User = "65534:65534"; + }; +} diff --git a/nix/flake.lock b/nix/flake.lock new file mode 100644 index 0000000000..986f6955db --- /dev/null +++ b/nix/flake.lock @@ -0,0 +1,27 @@ +{ + "nodes": { + "nixpkgs": { + "locked": { + "lastModified": 1778430510, + "narHash": "sha256-Ti+ZBvW6yrWWAg2szExVTwCd4qOJ3KlVr1tFHfyfi8Q=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "8fd9daa3db09ced9700431c5b7ad0e8ba199b575", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-25.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/nix/flake.nix b/nix/flake.nix new file mode 100644 index 0000000000..7ea1519947 --- /dev/null +++ b/nix/flake.nix @@ -0,0 +1,70 @@ +{ + description = "DevOps Core reproducible builds"; + + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.11"; + }; + + outputs = + { self, nixpkgs }: + let + lib = nixpkgs.lib; + systems = [ "x86_64-linux" ]; + forAllSystems = lib.genAttrs systems; + pkgsFor = system: import nixpkgs { inherit system; }; + in + { + packages = forAllSystems ( + system: + let + pkgs = pkgsFor system; + appPackage = pkgs.callPackage ./package.nix { + appSrc = ../app_python; + }; + in + { + default = appPackage; + devops-info-service = appPackage; + dockerImage = pkgs.callPackage ./docker.nix { + inherit appPackage; + }; + } + ); + + apps = forAllSystems (system: { + default = { + type = "app"; + program = "${self.packages.${system}.default}/bin/devops-info-service"; + }; + }); + + checks = forAllSystems (system: { + default = self.packages.${system}.default; + }); + + devShells = forAllSystems (system: { + default = (pkgsFor system).callPackage ./devshell.nix { }; + }); + + formatter = forAllSystems ( + system: + let + pkgs = pkgsFor system; + in + pkgs.writeShellApplication { + name = "format-nix"; + runtimeInputs = [ pkgs.nixfmt-rfc-style ]; + text = '' + if [ "$#" -eq 0 ]; then + if [ -f flake.nix ] && [ -f package.nix ]; then + set -- flake.nix *.nix + else + set -- nix/flake.nix nix/*.nix + fi + fi + exec nixfmt "$@" + ''; + } + ); + }; +} diff --git a/nix/package.nix b/nix/package.nix new file mode 100644 index 0000000000..7f816cd1bc --- /dev/null +++ b/nix/package.nix @@ -0,0 +1,133 @@ +{ + lib, + stdenvNoCC, + python314, + appSrc ? ../app_python, +}: + +let + python = python314.override { + packageOverrides = + pyFinal: pyPrev: + let + isRuntimeOnlyInput = + input: + let + name = input.name or input.pname or ""; + dropPatterns = [ + "astor" + "cryptography-vectors" + "flaky" + "freezegun" + "gevent" + "ipython" + "jedi" + "lxml" + "mypy" + "parso" + "pytest" + "sphinx" + "watchdog" + "xdist" + ]; + in + !(lib.any (pattern: lib.hasInfix pattern name) dropPatterns); + + withoutChecks = + pkg: + pkg.overridePythonAttrs (old: { + doCheck = false; + build-system = lib.filter isRuntimeOnlyInput (old.build-system or [ ]); + checkInputs = [ ]; + nativeCheckInputs = [ ]; + nativeBuildInputs = lib.filter isRuntimeOnlyInput (old.nativeBuildInputs or [ ]); + }); + + runtimePackage = + pkg: deps: + (withoutChecks pkg).overridePythonAttrs (_old: { + dependencies = deps; + propagatedBuildInputs = deps; + }); + in + { + blinker = runtimePackage pyPrev.blinker [ ]; + click = runtimePackage pyPrev.click [ ]; + flask = runtimePackage pyPrev.flask [ + pyFinal.blinker + pyFinal.click + pyFinal.itsdangerous + pyFinal.jinja2 + pyFinal.werkzeug + ]; + gunicorn = runtimePackage pyPrev.gunicorn [ pyFinal.packaging ]; + idna = runtimePackage pyPrev.idna [ ]; + itsdangerous = runtimePackage pyPrev.itsdangerous [ ]; + jinja2 = runtimePackage pyPrev.jinja2 [ pyFinal.markupsafe ]; + markupsafe = runtimePackage pyPrev.markupsafe [ ]; + packaging = runtimePackage pyPrev.packaging [ ]; + prometheus-client = runtimePackage pyPrev.prometheus-client [ ]; + werkzeug = runtimePackage pyPrev.werkzeug [ pyFinal.markupsafe ]; + }; + }; + + pythonEnv = python.withPackages (ps: [ + ps.flask + ps.gunicorn + ps.prometheus-client + ]); + + cleanAppSrc = lib.cleanSourceWith { + src = appSrc; + filter = + path: type: + let + rel = lib.removePrefix ((toString appSrc) + "/") (toString path); + in + rel == "README.md" + || rel == "gunicorn.conf.py" + || rel == "pyproject.toml" + || rel == "uv.lock" + || rel == "src" + || lib.hasPrefix "src/" rel; + }; +in +stdenvNoCC.mkDerivation { + pname = "devops-info-service"; + version = "1.12.0"; + + src = cleanAppSrc; + + dontBuild = true; + + installPhase = '' + runHook preInstall + + app_dir="$out/share/devops-info-service" + mkdir -p "$app_dir" "$out/bin" + cp -r src gunicorn.conf.py pyproject.toml uv.lock README.md "$app_dir/" + + cat > "$out/bin/devops-info-service" < Date: Fri, 15 May 2026 05:25:53 +0300 Subject: [PATCH 20/21] ci (snyk still doesn't support uv for some reason) ci: scan uv dependencies with snyk ci: run snyk against uv virtualenv ci: tolerate snyk scanner errors for uv export ci: scan uv dependencies through generated requirements ci: pin uv setup default version Co-authored-by: OpenAI Codex --- .github/actions/python-setup/action.yml | 22 +++---- .github/workflows/python-ci.yml | 4 +- .github/workflows/python-snyk.yml | 28 +++++++- .gitignore | 3 + app_python/pyproject.toml | 1 - app_python/requirements.txt | 11 ++++ app_python/uv.lock | 85 ------------------------- 7 files changed, 50 insertions(+), 104 deletions(-) create mode 100644 app_python/requirements.txt diff --git a/.github/actions/python-setup/action.yml b/.github/actions/python-setup/action.yml index df80ebed36..ddd420a3c7 100644 --- a/.github/actions/python-setup/action.yml +++ b/.github/actions/python-setup/action.yml @@ -9,7 +9,7 @@ inputs: uv-version: description: uv version to install required: false - default: "0.9.30" + default: "0.11.14" working-directory: description: Project directory containing pyproject.toml required: false @@ -21,7 +21,7 @@ inputs: install-args: description: Extra arguments passed to uv sync required: false - default: "--frozen" + default: "--locked" runs: using: composite @@ -31,19 +31,13 @@ runs: with: python-version: ${{ inputs.python-version }} - - name: Install uv - shell: bash - run: python -m pip install --upgrade "uv==${{ inputs.uv-version }}" - - - name: Cache uv dependencies - uses: actions/cache@v5 + - name: Setup uv + uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0 with: - path: | - ~/.cache/uv - ${{ inputs.working-directory }}/.venv - key: ${{ runner.os }}-py${{ inputs.python-version }}-uv${{ inputs.uv-version }}-${{ hashFiles(inputs.lockfile-path) }} - restore-keys: | - ${{ runner.os }}-py${{ inputs.python-version }}-uv${{ inputs.uv-version }}- + version: ${{ inputs.uv-version }} + python-version: ${{ inputs.python-version }} + enable-cache: true + cache-dependency-glob: ${{ inputs.lockfile-path }} - name: Install dependencies shell: bash diff --git a/.github/workflows/python-ci.yml b/.github/workflows/python-ci.yml index c6f7c29752..3cdc67a861 100644 --- a/.github/workflows/python-ci.yml +++ b/.github/workflows/python-ci.yml @@ -20,7 +20,7 @@ jobs: fail-fast: false matrix: python-version: [3.14] - uv-version: [0.9.30] + uv-version: [0.11.14] os: [ubuntu-latest] runs-on: ${{ matrix.os }} defaults: @@ -35,7 +35,7 @@ jobs: uv-version: ${{ matrix.uv-version }} working-directory: app_python lockfile-path: app_python/uv.lock - install-args: --frozen + install-args: --locked - name: Lint with flake8 run: uv run flake8 src tests - name: Test using pytest with coverage report diff --git a/.github/workflows/python-snyk.yml b/.github/workflows/python-snyk.yml index e389c1065c..2d67ef2be7 100644 --- a/.github/workflows/python-snyk.yml +++ b/.github/workflows/python-snyk.yml @@ -24,9 +24,28 @@ jobs: - uses: actions/checkout@v6 - name: Setup Python tooling and dependencies uses: ./.github/actions/python-setup + with: + uv-version: 0.11.14 + install-args: --locked --no-dev - name: Setup Snyk CLI uses: snyk/actions/setup@master - - name: Run Snyk dependency scan (or skip) + - name: Verify Snyk requirements export + run: | + uv export \ + --locked \ + --no-dev \ + --no-annotate \ + --no-header \ + --no-hashes \ + --format requirements.txt \ + --output-file /tmp/snyk-requirements.txt \ + > /dev/null + diff -u requirements.txt /tmp/snyk-requirements.txt + - name: Prepare Snyk scan environment + run: | + uv venv --seed .snyk-venv + uv pip install --python .snyk-venv/bin/python -r requirements.txt + - name: Run Snyk dependency scan env: SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }} run: | @@ -34,4 +53,9 @@ jobs: echo "SNYK_TOKEN secret not set; skipping Snyk dependency scan." exit 0 fi - snyk test --severity-threshold=medium --fail-on=upgradable + snyk test \ + --file=requirements.txt \ + --package-manager=pip \ + --command=.snyk-venv/bin/python \ + --severity-threshold=medium \ + --fail-on=upgradable diff --git a/.gitignore b/.gitignore index 6d94dd134e..225230c620 100644 --- a/.gitignore +++ b/.gitignore @@ -26,6 +26,9 @@ __pycache__/ *.py[cod] .pytest_cache/ .mypy_cache/ +app_python/.venv/ +app_python/.snyk-venv/ +app_python/test-results/ # IDE .vscode/ diff --git a/app_python/pyproject.toml b/app_python/pyproject.toml index 8d596ef368..4c14219924 100644 --- a/app_python/pyproject.toml +++ b/app_python/pyproject.toml @@ -9,7 +9,6 @@ readme = "README.md" requires-python = ">=3.14" dependencies = [ "flask>=3.1.3,<4.0.0", - "requests>=2.32.5,<3.0.0", "gunicorn>=25.1.0,<26.0.0", "prometheus-client==0.23.1", ] diff --git a/app_python/requirements.txt b/app_python/requirements.txt new file mode 100644 index 0000000000..36e54767a0 --- /dev/null +++ b/app_python/requirements.txt @@ -0,0 +1,11 @@ +blinker==1.9.0 +click==8.3.3 +colorama==0.4.6 ; sys_platform == 'win32' +flask==3.1.3 +gunicorn==25.3.0 +itsdangerous==2.2.0 +jinja2==3.1.6 +markupsafe==3.0.3 +packaging==26.2 +prometheus-client==0.23.1 +werkzeug==3.1.8 diff --git a/app_python/uv.lock b/app_python/uv.lock index 2809d77e65..409352f765 100644 --- a/app_python/uv.lock +++ b/app_python/uv.lock @@ -11,56 +11,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/10/cb/f2ad4230dc2eb1a74edf38f1a38b9b52277f75bef262d8908e60d957e13c/blinker-1.9.0-py3-none-any.whl", hash = "sha256:ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc", size = 8458, upload-time = "2024-11-08T17:25:46.184Z" }, ] -[[package]] -name = "certifi" -version = "2026.4.22" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/25/ee/6caf7a40c36a1220410afe15a1cc64993a1f864871f698c0f93acb72842a/certifi-2026.4.22.tar.gz", hash = "sha256:8d455352a37b71bf76a79caa83a3d6c25afee4a385d632127b6afb3963f1c580", size = 137077, upload-time = "2026-04-22T11:26:11.191Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl", hash = "sha256:3cb2210c8f88ba2318d29b0388d1023c8492ff72ecdde4ebdaddbb13a31b1c4a", size = 135707, upload-time = "2026-04-22T11:26:09.372Z" }, -] - -[[package]] -name = "charset-normalizer" -version = "3.4.7" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e7/a1/67fe25fac3c7642725500a3f6cfe5821ad557c3abb11c9d20d12c7008d3e/charset_normalizer-3.4.7.tar.gz", hash = "sha256:ae89db9e5f98a11a4bf50407d4363e7b09b31e55bc117b4f7d80aab97ba009e5", size = 144271, upload-time = "2026-04-02T09:28:39.342Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/97/c8/c67cb8c70e19ef1960b97b22ed2a1567711de46c4ddf19799923adc836c2/charset_normalizer-3.4.7-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:c36c333c39be2dbca264d7803333c896ab8fa7d4d6f0ab7edb7dfd7aea6e98c0", size = 309234, upload-time = "2026-04-02T09:27:07.194Z" }, - { url = "https://files.pythonhosted.org/packages/99/85/c091fdee33f20de70d6c8b522743b6f831a2f1cd3ff86de4c6a827c48a76/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1c2aed2e5e41f24ea8ef1590b8e848a79b56f3a5564a65ceec43c9d692dc7d8a", size = 208042, upload-time = "2026-04-02T09:27:08.749Z" }, - { url = "https://files.pythonhosted.org/packages/87/1c/ab2ce611b984d2fd5d86a5a8a19c1ae26acac6bad967da4967562c75114d/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:54523e136b8948060c0fa0bc7b1b50c32c186f2fceee897a495406bb6e311d2b", size = 228706, upload-time = "2026-04-02T09:27:09.951Z" }, - { url = "https://files.pythonhosted.org/packages/a8/29/2b1d2cb00bf085f59d29eb773ce58ec2d325430f8c216804a0a5cd83cbca/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:715479b9a2802ecac752a3b0efa2b0b60285cf962ee38414211abdfccc233b41", size = 224727, upload-time = "2026-04-02T09:27:11.175Z" }, - { url = "https://files.pythonhosted.org/packages/47/5c/032c2d5a07fe4d4855fea851209cca2b6f03ebeb6d4e3afdb3358386a684/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bd6c2a1c7573c64738d716488d2cdd3c00e340e4835707d8fdb8dc1a66ef164e", size = 215882, upload-time = "2026-04-02T09:27:12.446Z" }, - { url = "https://files.pythonhosted.org/packages/2c/c2/356065d5a8b78ed04499cae5f339f091946a6a74f91e03476c33f0ab7100/charset_normalizer-3.4.7-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:c45e9440fb78f8ddabcf714b68f936737a121355bf59f3907f4e17721b9d1aae", size = 200860, upload-time = "2026-04-02T09:27:13.721Z" }, - { url = "https://files.pythonhosted.org/packages/0c/cd/a32a84217ced5039f53b29f460962abb2d4420def55afabe45b1c3c7483d/charset_normalizer-3.4.7-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3534e7dcbdcf757da6b85a0bbf5b6868786d5982dd959b065e65481644817a18", size = 211564, upload-time = "2026-04-02T09:27:15.272Z" }, - { url = "https://files.pythonhosted.org/packages/44/86/58e6f13ce26cc3b8f4a36b94a0f22ae2f00a72534520f4ae6857c4b81f89/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e8ac484bf18ce6975760921bb6148041faa8fef0547200386ea0b52b5d27bf7b", size = 211276, upload-time = "2026-04-02T09:27:16.834Z" }, - { url = "https://files.pythonhosted.org/packages/8f/fe/d17c32dc72e17e155e06883efa84514ca375f8a528ba2546bee73fc4df81/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:a5fe03b42827c13cdccd08e6c0247b6a6d4b5e3cdc53fd1749f5896adcdc2356", size = 201238, upload-time = "2026-04-02T09:27:18.229Z" }, - { url = "https://files.pythonhosted.org/packages/6a/29/f33daa50b06525a237451cdb6c69da366c381a3dadcd833fa5676bc468b3/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:2d6eb928e13016cea4f1f21d1e10c1cebd5a421bc57ddf5b1142ae3f86824fab", size = 230189, upload-time = "2026-04-02T09:27:19.445Z" }, - { url = "https://files.pythonhosted.org/packages/b6/6e/52c84015394a6a0bdcd435210a7e944c5f94ea1055f5cc5d56c5fe368e7b/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:e74327fb75de8986940def6e8dee4f127cc9752bee7355bb323cc5b2659b6d46", size = 211352, upload-time = "2026-04-02T09:27:20.79Z" }, - { url = "https://files.pythonhosted.org/packages/8c/d7/4353be581b373033fb9198bf1da3cf8f09c1082561e8e922aa7b39bf9fe8/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:d6038d37043bced98a66e68d3aa2b6a35505dc01328cd65217cefe82f25def44", size = 227024, upload-time = "2026-04-02T09:27:22.063Z" }, - { url = "https://files.pythonhosted.org/packages/30/45/99d18aa925bd1740098ccd3060e238e21115fffbfdcb8f3ece837d0ace6c/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7579e913a5339fb8fa133f6bbcfd8e6749696206cf05acdbdca71a1b436d8e72", size = 217869, upload-time = "2026-04-02T09:27:23.486Z" }, - { url = "https://files.pythonhosted.org/packages/5c/05/5ee478aa53f4bb7996482153d4bfe1b89e0f087f0ab6b294fcf92d595873/charset_normalizer-3.4.7-cp314-cp314-win32.whl", hash = "sha256:5b77459df20e08151cd6f8b9ef8ef1f961ef73d85c21a555c7eed5b79410ec10", size = 148541, upload-time = "2026-04-02T09:27:25.146Z" }, - { url = "https://files.pythonhosted.org/packages/48/77/72dcb0921b2ce86420b2d79d454c7022bf5be40202a2a07906b9f2a35c97/charset_normalizer-3.4.7-cp314-cp314-win_amd64.whl", hash = "sha256:92a0a01ead5e668468e952e4238cccd7c537364eb7d851ab144ab6627dbbe12f", size = 159634, upload-time = "2026-04-02T09:27:26.642Z" }, - { url = "https://files.pythonhosted.org/packages/c6/a3/c2369911cd72f02386e4e340770f6e158c7980267da16af8f668217abaa0/charset_normalizer-3.4.7-cp314-cp314-win_arm64.whl", hash = "sha256:67f6279d125ca0046a7fd386d01b311c6363844deac3e5b069b514ba3e63c246", size = 148384, upload-time = "2026-04-02T09:27:28.271Z" }, - { url = "https://files.pythonhosted.org/packages/94/09/7e8a7f73d24dba1f0035fbbf014d2c36828fc1bf9c88f84093e57d315935/charset_normalizer-3.4.7-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:effc3f449787117233702311a1b7d8f59cba9ced946ba727bdc329ec69028e24", size = 330133, upload-time = "2026-04-02T09:27:29.474Z" }, - { url = "https://files.pythonhosted.org/packages/8d/da/96975ddb11f8e977f706f45cddd8540fd8242f71ecdb5d18a80723dcf62c/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fbccdc05410c9ee21bbf16a35f4c1d16123dcdeb8a1d38f33654fa21d0234f79", size = 216257, upload-time = "2026-04-02T09:27:30.793Z" }, - { url = "https://files.pythonhosted.org/packages/e5/e8/1d63bf8ef2d388e95c64b2098f45f84758f6d102a087552da1485912637b/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:733784b6d6def852c814bce5f318d25da2ee65dd4839a0718641c696e09a2960", size = 234851, upload-time = "2026-04-02T09:27:32.44Z" }, - { url = "https://files.pythonhosted.org/packages/9b/40/e5ff04233e70da2681fa43969ad6f66ca5611d7e669be0246c4c7aaf6dc8/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a89c23ef8d2c6b27fd200a42aa4ac72786e7c60d40efdc76e6011260b6e949c4", size = 233393, upload-time = "2026-04-02T09:27:34.03Z" }, - { url = "https://files.pythonhosted.org/packages/be/c1/06c6c49d5a5450f76899992f1ee40b41d076aee9279b49cf9974d2f313d5/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6c114670c45346afedc0d947faf3c7f701051d2518b943679c8ff88befe14f8e", size = 223251, upload-time = "2026-04-02T09:27:35.369Z" }, - { url = "https://files.pythonhosted.org/packages/2b/9f/f2ff16fb050946169e3e1f82134d107e5d4ae72647ec8a1b1446c148480f/charset_normalizer-3.4.7-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:a180c5e59792af262bf263b21a3c49353f25945d8d9f70628e73de370d55e1e1", size = 206609, upload-time = "2026-04-02T09:27:36.661Z" }, - { url = "https://files.pythonhosted.org/packages/69/d5/a527c0cd8d64d2eab7459784fb4169a0ac76e5a6fc5237337982fd61347e/charset_normalizer-3.4.7-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3c9a494bc5ec77d43cea229c4f6db1e4d8fe7e1bbffa8b6f0f0032430ff8ab44", size = 220014, upload-time = "2026-04-02T09:27:38.019Z" }, - { url = "https://files.pythonhosted.org/packages/7e/80/8a7b8104a3e203074dc9aa2c613d4b726c0e136bad1cc734594b02867972/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8d828b6667a32a728a1ad1d93957cdf37489c57b97ae6c4de2860fa749b8fc1e", size = 218979, upload-time = "2026-04-02T09:27:39.37Z" }, - { url = "https://files.pythonhosted.org/packages/02/9a/b759b503d507f375b2b5c153e4d2ee0a75aa215b7f2489cf314f4541f2c0/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:cf1493cd8607bec4d8a7b9b004e699fcf8f9103a9284cc94962cb73d20f9d4a3", size = 209238, upload-time = "2026-04-02T09:27:40.722Z" }, - { url = "https://files.pythonhosted.org/packages/c2/4e/0f3f5d47b86bdb79256e7290b26ac847a2832d9a4033f7eb2cd4bcf4bb5b/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:0c96c3b819b5c3e9e165495db84d41914d6894d55181d2d108cc1a69bfc9cce0", size = 236110, upload-time = "2026-04-02T09:27:42.33Z" }, - { url = "https://files.pythonhosted.org/packages/96/23/bce28734eb3ed2c91dcf93abeb8a5cf393a7b2749725030bb630e554fdd8/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:752a45dc4a6934060b3b0dab47e04edc3326575f82be64bc4fc293914566503e", size = 219824, upload-time = "2026-04-02T09:27:43.924Z" }, - { url = "https://files.pythonhosted.org/packages/2c/6f/6e897c6984cc4d41af319b077f2f600fc8214eb2fe2d6bcb79141b882400/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:8778f0c7a52e56f75d12dae53ae320fae900a8b9b4164b981b9c5ce059cd1fcb", size = 233103, upload-time = "2026-04-02T09:27:45.348Z" }, - { url = "https://files.pythonhosted.org/packages/76/22/ef7bd0fe480a0ae9b656189ec00744b60933f68b4f42a7bb06589f6f576a/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ce3412fbe1e31eb81ea42f4169ed94861c56e643189e1e75f0041f3fe7020abe", size = 225194, upload-time = "2026-04-02T09:27:46.706Z" }, - { url = "https://files.pythonhosted.org/packages/c5/a7/0e0ab3e0b5bc1219bd80a6a0d4d72ca74d9250cb2382b7c699c147e06017/charset_normalizer-3.4.7-cp314-cp314t-win32.whl", hash = "sha256:c03a41a8784091e67a39648f70c5f97b5b6a37f216896d44d2cdcb82615339a0", size = 159827, upload-time = "2026-04-02T09:27:48.053Z" }, - { url = "https://files.pythonhosted.org/packages/7a/1d/29d32e0fb40864b1f878c7f5a0b343ae676c6e2b271a2d55cc3a152391da/charset_normalizer-3.4.7-cp314-cp314t-win_amd64.whl", hash = "sha256:03853ed82eeebbce3c2abfdbc98c96dc205f32a79627688ac9a27370ea61a49c", size = 174168, upload-time = "2026-04-02T09:27:49.795Z" }, - { url = "https://files.pythonhosted.org/packages/de/32/d92444ad05c7a6e41fb2036749777c163baf7a0301a040cb672d6b2b1ae9/charset_normalizer-3.4.7-cp314-cp314t-win_arm64.whl", hash = "sha256:c35abb8bfff0185efac5878da64c45dafd2b37fb0383add1be155a763c1f083d", size = 153018, upload-time = "2026-04-02T09:27:51.116Z" }, - { url = "https://files.pythonhosted.org/packages/db/8f/61959034484a4a7c527811f4721e75d02d653a35afb0b6054474d8185d4c/charset_normalizer-3.4.7-py3-none-any.whl", hash = "sha256:3dce51d0f5e7951f8bb4900c257dad282f49190fdbebecd4ba99bcc41fef404d", size = 61958, upload-time = "2026-04-02T09:28:37.794Z" }, -] - [[package]] name = "click" version = "8.3.3" @@ -129,7 +79,6 @@ dependencies = [ { name = "flask" }, { name = "gunicorn" }, { name = "prometheus-client" }, - { name = "requests" }, ] [package.dev-dependencies] @@ -145,7 +94,6 @@ requires-dist = [ { name = "flask", specifier = ">=3.1.3,<4.0.0" }, { name = "gunicorn", specifier = ">=25.1.0,<26.0.0" }, { name = "prometheus-client", specifier = "==0.23.1" }, - { name = "requests", specifier = ">=2.32.5,<3.0.0" }, ] [package.metadata.requires-dev] @@ -199,15 +147,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/43/c8/8aaf447698c4d59aa853fd318eed300b5c9e44459f242ab8ead6c9c09792/gunicorn-25.3.0-py3-none-any.whl", hash = "sha256:cacea387dab08cd6776501621c295a904fe8e3b7aae9a1a3cbb26f4e7ed54660", size = 208403, upload-time = "2026-03-27T00:00:27.386Z" }, ] -[[package]] -name = "idna" -version = "3.15" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/82/77/7b3966d0b9d1d31a36ddf1746926a11dface89a83409bf1483f0237aa758/idna-3.15.tar.gz", hash = "sha256:ca962446ea538f7092a95e057da437618e886f4d349216d2b1e294abfdb65fdc", size = 199245, upload-time = "2026-05-12T22:45:57.011Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d2/23/408243171aa9aaba178d3e2559159c24c1171a641aa83b67bdd3394ead8e/idna-3.15-py3-none-any.whl", hash = "sha256:048adeaf8c2d788c40fee287673ccaa74c24ffd8dcf09ffa555a2fbb59f10ac8", size = 72340, upload-time = "2026-05-12T22:45:55.733Z" }, -] - [[package]] name = "iniconfig" version = "2.3.0" @@ -373,30 +312,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/9d/7a/d968e294073affff457b041c2be9868a40c1c71f4a35fcc1e45e5493067b/pytest_cov-7.1.0-py3-none-any.whl", hash = "sha256:a0461110b7865f9a271aa1b51e516c9a95de9d696734a2f71e3e78f46e1d4678", size = 22876, upload-time = "2026-03-21T20:11:14.438Z" }, ] -[[package]] -name = "requests" -version = "2.34.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "certifi" }, - { name = "charset-normalizer" }, - { name = "idna" }, - { name = "urllib3" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ac/c3/e2a2b89f2d3e2179abd6d00ebd70bff6273f37fb3e0cc209f48b39d00cbf/requests-2.34.2.tar.gz", hash = "sha256:f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed", size = 142856, upload-time = "2026-05-14T19:25:27.735Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl", hash = "sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0", size = 73075, upload-time = "2026-05-14T19:25:26.443Z" }, -] - -[[package]] -name = "urllib3" -version = "2.7.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/53/0c/06f8b233b8fd13b9e5ee11424ef85419ba0d8ba0b3138bf360be2ff56953/urllib3-2.7.0.tar.gz", hash = "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c", size = 433602, upload-time = "2026-05-07T16:13:18.596Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl", hash = "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897", size = 131087, upload-time = "2026-05-07T16:13:17.151Z" }, -] - [[package]] name = "werkzeug" version = "3.1.8" From a08cd2050e94237fe8fb69120f0252e5bf6b127b Mon Sep 17 00:00:00 2001 From: LocalT0aster <90502400+LocalT0aster@users.noreply.github.com> Date: Fri, 15 May 2026 05:25:53 +0300 Subject: [PATCH 21/21] docs writing docs: add lab18 nix reproducibility report docs: report table formatting docs: refresh uv and nix lab18 evidence docs: refresh nix paths after readme update docs: use nix directory for flake commands Co-authored-by: OpenAI Codex --- README.md | 8 ++ app_python/README.md | 13 +- labs/submission18.md | 5 + nix/README.md | 309 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 332 insertions(+), 3 deletions(-) create mode 100644 labs/submission18.md create mode 100644 nix/README.md diff --git a/README.md b/README.md index 4b917a299c..739ea9b677 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,14 @@ Master **production-grade DevOps practices** through hands-on labs. Build, conta 3. **Start with Lab 1** and progress sequentially 4. **Submit PRs** for each lab (details below) +## Module Directories + +- `app_python/`: Python DevOps Info Service. +- `app_go/`: Go DevOps Info Service. +- `k8s/`: Kubernetes, Helm, GitOps, rollout, storage, and monitoring labs. +- `edge-api/`: Lab 17 Cloudflare Workers API. +- `nix/`: Lab 18 reproducible builds with Nix, uv, flakes, and `dockerTools`. + --- ## Course Roadmap diff --git a/app_python/README.md b/app_python/README.md index a172eb1b79..cafc1986ef 100644 --- a/app_python/README.md +++ b/app_python/README.md @@ -14,7 +14,13 @@ Small Flask web service that reports service metadata, system information, runti ## Installation ```bash -uv sync +uv sync --locked +``` + +`uv.lock` is the source of truth for Python dependencies. `requirements.txt` is generated from it for Snyk's pip-compatible scan path and should be refreshed with: + +```bash +uv export --locked --no-dev --no-annotate --no-header --no-hashes --format requirements.txt --output-file requirements.txt > /dev/null ``` ### Docker @@ -29,8 +35,9 @@ uv sync ``` The Docker build installs dependencies with: ```bash - uv sync --frozen --no-dev --no-install-project + uv sync --locked --no-dev --no-install-project ``` + The image uses the pinned uv binary image and runs as `appuser` with `HOME=/home/appuser`. ## Running the Application @@ -86,7 +93,7 @@ For Lab 12, run the monitoring stack with a writable `/data` volume for the Pyth The project uses `pytest` for unit tests. ```bash -uv sync +uv sync --locked uv run pytest --cov=src --cov-report=term-missing ``` diff --git a/labs/submission18.md b/labs/submission18.md new file mode 100644 index 0000000000..6707349319 --- /dev/null +++ b/labs/submission18.md @@ -0,0 +1,5 @@ +# Lab 18 Submission + +The Lab 18 reproducible-build implementation and report are kept in [`../nix/README.md`](../nix/README.md). + +This compatibility file exists because the lab handout asks for `labs/submission18.md`, while this repository keeps each major tool area in its own module directory. diff --git a/nix/README.md b/nix/README.md new file mode 100644 index 0000000000..c4d3d495d3 --- /dev/null +++ b/nix/README.md @@ -0,0 +1,309 @@ +# Lab 18 - Reproducible Builds with Nix + +This module contains the Lab 18 reproducible-build work. The implementation keeps the repository DRY: the flake in `nix/` packages the real `app_python/` source instead of copying it into a lab folder. + +## Summary + +- Python packaging moved from Poetry to uv while keeping Python 3.14. +- Nix uses stable `nixos-25.11`, pinned in `nix/flake.lock`. +- The Nix implementation lives entirely in `nix/`: + - `flake.nix` wires the package, Docker image, app, checks, formatter, and dev shell. + - `package.nix` builds the Flask app with `python314`. + - `docker.nix` builds a reproducible image with `dockerTools`. + - `devshell.nix` provides Python 3.14, uv, Docker, curl, and jq. + +The active app keeps its Python dependency graph in `app_python/uv.lock`. `app_python/requirements.txt` is generated from that lock file only for Snyk's pip-compatible scanner path; `uv.lock` remains the source of truth. The Nix runtime closure intentionally includes the packages imported by the Flask service: `flask`, `gunicorn`, and `prometheus-client`. + +## Why Nix + +uv is a much better Python workflow than Poetry here: it is fast, simple, and not tied to Poetry's project model. It still resolves from Python package indexes and produces an application-level lock file. + +Nix locks the system-level build closure: Python itself, build hooks, runtime libraries, and the Docker image construction tools. That is the main reproducibility difference. The uv Docker image is convenient, but its `python:3.14-alpine` base tag can move. The Nix image records the full nixpkgs revision and uses deterministic image metadata. + +## Commands + +```bash +cd nix +nix develop +cd ../app_python +uv sync --locked +uv export --locked --no-dev --no-annotate --no-header --no-hashes --format requirements.txt --output-file /tmp/lab18-requirements.txt >/dev/null +diff -u requirements.txt /tmp/lab18-requirements.txt +uv run flake8 src tests +uv run pytest --cov=src --cov-report=term-missing +``` + +```bash +cd nix +nix flake check +nix build .#default +nix run .#default +nix build .#dockerImage +docker load < result +``` + +## Evidence + +

+uv local workflow + +```text +$ cd nix + +$ nix develop -c bash <<'BASH' +cd ../app_python +uv --version +uv run python --version +uv lock --check +uv export --locked --no-dev --no-annotate --no-header --no-hashes --format requirements.txt --output-file /tmp/lab18-requirements.txt >/dev/null +diff -u requirements.txt /tmp/lab18-requirements.txt +uv sync --locked +uv run flake8 src tests +uv run pytest --cov=src --cov-report=term-missing +BASH + +uv 0.9.30 +Python 3.14.3 +Resolved 23 packages in 0.54ms +Resolved 23 packages in 0.50ms +Resolved 23 packages in 0.52ms +Audited 21 packages in 0.13ms +============================= test session starts ============================== +platform linux -- Python 3.14.3, pytest-9.0.3, pluggy-1.6.0 +rootdir: /home/t0ast/Repos/DevOps-Core-S26/app_python +configfile: pyproject.toml +plugins: cov-7.1.0 +collected 19 items + +tests/test_endpoints.py ........... [ 57%] +tests/test_logging_utils.py . [ 63%] +tests/test_metrics.py .. [ 73%] +tests/test_unit_helpers.py ..... [100%] + +================================ tests coverage ================================ +_______________ coverage: platform linux, python 3.14.3-final-0 ________________ + +Name Stmts Miss Cover Missing +----------------------------------------------------- +src/flask_instance.py 12 0 100% +src/logging_utils.py 42 8 81% 21-27, 51 +src/main.py 10 0 100% +src/metrics.py 45 1 98% 95 +src/router.py 118 7 94% 141-146, 149-153, 165-169 +----------------------------------------------------- +TOTAL 227 16 93% +============================== 19 passed in 0.11s ============================== +``` + +
+ +
+Nix package and runtime + +```text +$ cd nix + +$ nix flake metadata --json | jq '{description, resolved: .locks.nodes.nixpkgs.locked}' +{ + "description": "DevOps Core reproducible builds", + "resolved": { + "lastModified": 1778430510, + "narHash": "sha256-Ti+ZBvW6yrWWAg2szExVTwCd4qOJ3KlVr1tFHfyfi8Q=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "8fd9daa3db09ced9700431c5b7ad0e8ba199b575", + "type": "github" + } +} + +$ nix flake check +evaluating flake... +checking flake output 'packages'... +checking derivation packages.x86_64-linux.default... +derivation evaluated to /nix/store/l19j81jw8kywfwiv1nbcppzw6z492lp0-devops-info-service-1.12.0.drv +checking derivation packages.x86_64-linux.devops-info-service... +derivation evaluated to /nix/store/l19j81jw8kywfwiv1nbcppzw6z492lp0-devops-info-service-1.12.0.drv +checking derivation packages.x86_64-linux.dockerImage... +derivation evaluated to /nix/store/dfh47gscdprzlalzfpngjggmlqr0c2x3-devops-info-service-nix.tar.gz.drv +checking flake output 'apps'... +checking app 'apps.x86_64-linux.default'... +warning: app 'apps.x86_64-linux.default' lacks attribute 'meta' +checking flake output 'checks'... +checking derivation checks.x86_64-linux.default... +derivation evaluated to /nix/store/l19j81jw8kywfwiv1nbcppzw6z492lp0-devops-info-service-1.12.0.drv +checking flake output 'devShells'... +checking derivation devShells.x86_64-linux.default... +derivation evaluated to /nix/store/qmsav41in4f6c269s4yaimqc3m0ag1ba-nix-shell.drv +checking flake output 'formatter'... +checking derivation formatter.x86_64-linux... +derivation evaluated to /nix/store/ds5xf6q419g1wq2kz63g3j020jd50j2y-format-nix.drv +running 1 flake checks... + +$ bash <<'BASH' +first=$(nix build .#default --no-link --print-out-paths) +second=$(nix build .#default --no-link --print-out-paths) +printf 'first=%s\nsecond=%s\n' "$first" "$second" +test "$first" = "$second" +BASH +first=/nix/store/x0manjqw974f50rw4z6mg0szvlda5s2p-devops-info-service-1.12.0 +second=/nix/store/x0manjqw974f50rw4z6mg0szvlda5s2p-devops-info-service-1.12.0 + +$ nix path-info -Sh .#default +/nix/store/x0manjqw974f50rw4z6mg0szvlda5s2p-devops-info-service-1.12.0 191.4 MiB + +$ nix path-info -rSh .#default | tail -n 5 +/nix/store/x9ydb0ljg6ahf8vzpyigzpy65w1ixpz0-python3.14-prometheus-client-0.22.1 181.6 MiB +/nix/store/z5sbbpr4izvdkck38bkr50k9h1k0p7hc-python3.14-click-8.2.1 182.3 MiB +/nix/store/xn69ihhpqffawlricm0vk3i7b370hhpn-python3.14-flask-3.1.2 188.6 MiB +/nix/store/93a9sdlhq8az8mwavchm7ibmp2r584jb-python3-3.14.3-env 191.3 MiB +/nix/store/x0manjqw974f50rw4z6mg0szvlda5s2p-devops-info-service-1.12.0 191.4 MiB + +$ bash <<'BASH' +app=$(nix build .#default --no-link --print-out-paths) +HOST=127.0.0.1 PORT=5018 "$app/bin/devops-info-service" > /tmp/lab18/nix-app.log 2>&1 & +app_pid=$! +for attempt in 1 2 3 4 5 6 7 8 9 10; do + response=$(curl -fsS 127.0.0.1:5018/health) && { + printf '%s\n' "$response" | jq . + break + } + sleep 1 +done +kill "$app_pid" +wait "$app_pid" || true +sed -n '1,12p' /tmp/lab18/nix-app.log +BASH +curl: (7) Failed to connect to 127.0.0.1 port 5018 after 13 ms: Could not connect to server +{ + "status": "healthy", + "timestamp": "2026-05-15T01:45:39.019501+00:00", + "uptime_seconds": 0 +} +[2026-05-15 04:45:38 +0300] [450876] [INFO] Starting gunicorn 23.0.0 +[2026-05-15 04:45:38 +0300] [450876] [INFO] Using worker: sync +[2026-05-15 04:45:38 +0300] [450881] [INFO] Booting worker with pid: 450881 +{"timestamp":"2026-05-15T01:45:38.124618Z","level":"INFO","logger":"devops_info_service","message":"application initialized","event":"startup","host":"127.0.0.1","port":5018,"debug":false} +{"timestamp":"[15/May/2026:04:45:39 +0300]","level":"INFO","logger":"gunicorn.access","client_ip":"127.0.0.1","method":"GET","path":"/health","query":"","status_code":200,"response_bytes":"87","request_time_us":1887,"user_agent":"curl/8.20.0"} +[2026-05-15 04:45:39 +0300] [450876] [INFO] Handling signal: term +[2026-05-15 04:45:39 +0300] [450881] [INFO] Worker exiting (pid: 450881) +[2026-05-15 04:45:39 +0300] [450876] [INFO] Shutting down: Master +``` + +
+ +
+Docker comparison + +```text +$ docker version --format '{{.Server.Version}}' +29.4.3 + +$ DOCKER_BUILDKIT=1 docker build -t devops-app-py:uv-lab18 app_python + +$ bash <<'BASH' +docker run --rm -d --name lab18-uv-app -p 5019:5000 devops-app-py:uv-lab18 +docker exec lab18-uv-app sh -c 'printf "HOME=%s\n" "$HOME" && id && test -w /home/appuser && test -w /data' +for attempt in 1 2 3 4 5 6 7 8 9 10; do + response=$(curl -fsS 127.0.0.1:5019/health) && { + printf '%s\n' "$response" | jq . + break + } + sleep 1 +done +docker logs lab18-uv-app | sed -n '1,8p' +docker stop lab18-uv-app +BASH +ae0f7839d5c1350ec44e5fbc77404de8609958abb03832dbf9be28fe23533466 +HOME=/home/appuser +uid=100(appuser) gid=101(appgroup) groups=101(appgroup),101(appgroup) +{ + "status": "healthy", + "timestamp": "2026-05-15T01:46:04.435915+00:00", + "uptime_seconds": 0 +} +[2026-05-15 01:46:03 +0000] [1] [INFO] Starting gunicorn 25.3.0 +[2026-05-15 01:46:03 +0000] [1] [INFO] Listening at: http://0.0.0.0:5000 (1) +[2026-05-15 01:46:03 +0000] [1] [INFO] Using worker: sync +[2026-05-15 01:46:03 +0000] [14] [INFO] Booting worker with pid: 14 +[2026-05-15 01:46:04 +0000] [1] [INFO] Control socket listening at /home/appuser/.gunicorn/gunicorn.ctl +{"timestamp":"2026-05-15T01:46:04.082192Z","level":"INFO","logger":"devops_info_service","message":"application initialized","event":"startup","host":"0.0.0.0","port":5000,"debug":false} +{"timestamp":"[15/May/2026:01:46:04 +0000]","level":"INFO","logger":"gunicorn.access","client_ip":"172.17.0.1","method":"GET","path":"/health","query":"","status_code":200,"response_bytes":"87","request_time_us":9213,"user_agent":"curl/8.20.0"} +lab18-uv-app + +$ nix build .#dockerImage + +$ docker load < result +Loaded image: devops-info-service-nix:lab18 + +$ bash <<'BASH' +docker run --rm -d --name lab18-nix-app -p 5020:5000 devops-info-service-nix:lab18 +for attempt in 1 2 3 4 5 6 7 8 9 10; do + response=$(curl -fsS 127.0.0.1:5020/health) && { + printf '%s\n' "$response" | jq . + break + } + sleep 1 +done +docker logs lab18-nix-app | sed -n '1,8p' +docker stop lab18-nix-app +BASH +8faa6ce8669dd235be4e882523567d8b51830f4f32c6a295b0edadee35c27809 +{ + "status": "healthy", + "timestamp": "2026-05-15T01:46:17.547776+00:00", + "uptime_seconds": 0 +} +[2026-05-15 01:46:16 +0000] [1] [INFO] Starting gunicorn 23.0.0 +[2026-05-15 01:46:16 +0000] [1] [INFO] Listening at: http://0.0.0.0:5000 (1) +[2026-05-15 01:46:16 +0000] [1] [INFO] Using worker: sync +[2026-05-15 01:46:16 +0000] [7] [INFO] Booting worker with pid: 7 +{"timestamp":"2026-05-15T01:46:16.649812Z","level":"INFO","logger":"devops_info_service","message":"application initialized","event":"startup","host":"0.0.0.0","port":5000,"debug":false} +{"timestamp":"[15/May/2026:01:46:17 +0000]","level":"INFO","logger":"gunicorn.access","client_ip":"172.17.0.1","method":"GET","path":"/health","query":"","status_code":200,"response_bytes":"87","request_time_us":1815,"user_agent":"curl/8.20.0"} +lab18-nix-app + +$ docker image inspect devops-app-py:uv-lab18 devops-info-service-nix:lab18 | jq '.[] | {repoTags: .RepoTags, id: .Id, created: .Created, size: .Size}' +{ + "repoTags": [ + "devops-app-py:uv-lab18", + "devops-info-service:uv-fixed" + ], + "id": "sha256:6559ec88f61e401b41cd8123f19da3fb84d90a124f0de705d115a7f1f30905cd", + "created": "2026-05-15T04:43:29.572991821+03:00", + "size": 120461874 +} +{ + "repoTags": [ + "devops-info-service-nix:lab18" + ], + "id": "sha256:5a01bf71a8a11af7336d34f9e9e4148ea266900345b8259d6f1a78ad5bc49462", + "created": "1970-01-01T00:00:01Z", + "size": 198565103 +} +``` + +
+ +## Comparison + +| Area | uv / Docker | Nix / dockerTools | +| ------------------- | ---------------------------------------- | ------------------------------------------------------- | +| Python dependencies | `uv.lock` pins Python packages from PyPI | nixpkgs pin locks Python packages and build tools | +| Python runtime | `python:3.14-alpine` image tag | `python314` from pinned `nixos-25.11` | +| Image timestamp | Build-time timestamp | Fixed `1970-01-01T00:00:01Z` | +| Rebuild identity | Can change when base image tag changes | Same flake input and source produce the same store path | +| Workflow | Better for day-to-day Python development | Better for full closure reproducibility | + +## Helm Pinning Comparison + +Lab 10 Helm values pin the application image tag, for example `image.tag: "1.12"`. That is useful deployment intent, but it does not prove what Python interpreter, package resolver, base image, or build tools produced the image. A mutable registry tag can also be pushed again. + +The Lab 18 flake pins nixpkgs by Git revision and NAR hash. That locks Python 3.14, package definitions, build hooks, and `dockerTools`. Helm still remains useful after the image exists, but the flake is the stronger build provenance layer. + +## Final State + +- `uv sync`, `flake8`, and `pytest` pass on Python 3.14. +- `nix flake check` passes from `nix/`. +- Repeated `nix build .#default` from `nix/` returns the same store path. +- The Nix-built app responds healthy on `127.0.0.1:5018`. +- Both the uv Docker image and the Nix Docker image respond healthy. +- The Nix image uses deterministic image metadata; the traditional Docker image records the build time.

KP4Vn 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 RclC5eyIaoI7%TtGzW}K~3LyXh literal 0 HcmV?d00001 diff --git a/edge-api/docs/img/lab17_cloudflare_deployments.png b/edge-api/docs/img/lab17_cloudflare_deployments.png new file mode 100644 index 0000000000000000000000000000000000000000..72b370258a3890e051f81c49de1ee45e7d16565c GIT binary patch literal 38607 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 C?WlDC literal 0 HcmV?d00001 diff --git a/edge-api/docs/img/lab17_cloudflare_metrics_or_logs.png b/edge-api/docs/img/lab17_cloudflare_metrics_or_logs.png new file mode 100644 index 0000000000000000000000000000000000000000..f8fce5649bb865ddf6b2fe4c43fc1c91b62adcc4 GIT binary patch literal 90345 zcmc$`bx>U27Vn9>6WoFaclQJh?hxD>2p$OTgy8N@0zndjJA}pw?$WrsJ2Wzf-+lMp z``#ZjH8nLer;5Y`{f5Vg$3*7ODs1TJvVzNYg-F5dp#I#J|TAQaogxt;4kR^^%s2@ zLEg@4Cl}yrjF+!nEk0RUIl@>;tFdtrD1P`31M?b2L0U@7)A(=+IayN%+IJSVoE07( z82*QaztSV}PkzZhi}8U~vGT#4`aCPY)Q`507l$!({9YG*1-|JQ|P zFw7el5&oa+6(YUpfBn61muZdqKZViAsG?%y{^w%ye((98XT#;kH9Oz^*VB=?c$EM3 zu*PNbDb9Z$PWWE@CG5YRekJyQ{^|;ME5DE*ifPRY)mDQO_VoXhOrZWthwYb9OMT0~ zTA{`0b%L0%s#k3p0c`*cXO?deL`av(#*o_P(rX8;$Z!{I=m9lE3w5&KFlk#PWc#p* zL^fTj*+(z=uZsT+X=Mm!a6^7tooELQcq9&V@i*77*_4fYS2?D9u)wtdR2BtU6{k(E+7|2G>V|#~I|xMPgstmlBGAT*dO_ zu-I6|XFDOy)ra?1DP}szreP#UWR_k$yiVIPLdV$kZ%HQqLs;hZbT=u#l{=?=ad>){9eD-r=nS6HJvRZGUYX5ZMi6pn$yFmk> zmYOxxH37^8Ywv9y3#K9M#m}LO7~6EeuNZeM7j_rx)0O3+csEvsrqix zuSr#hgbX4F{HQ!#h(EmD$qO(HE>OaMwqF0cMH(xBMeH z=$FEm86#f>bS5x#HuWF*-eo)VMw5`xi-mh#Q|SyIL*-{HSuBf>8;2Z)JoT5?i-ktz zaUQG?^xMQMwJ;F#7KSo-mLk3zwYa}`*TU(ixu%6CJ?`IB{p%GDDr7nJ%`cz1@|V6_ z%3aB1$4C?PNv89cB~tW+e0dd7>f57wk$5_Wa?`m9f2M?9P;Ckd!_#c)@V5-8Hi3ZO zd%rwQ{q6T#GBG7=C zZN0{?)YLbLZ(>8Wq+E`lKbm76{iNw}`fme}Oh@%FWomTxP!&&1d=sFW@%xKh)j8OR zJ&7`NO+ChDTWV{(jqu;*qo1R}_xYTcOkQfEVbH1?{{PYrc~!gZX+RHaMh`2%Pw#6| zHV5(oo@_&qFslQe?ih!4Xnq{DoV3-rZ1iqjq3iVe$lJcG2fv52K7Oa=)N{&k}iETYAyU1~4!Q=fw#qo1j7mNJZpG%h@FI>#*yn7?Fp` za3NGGfOdWBy_KSS7{$>R{y2O#R-#UOBPK}MNU$GDpje7A ziS^A-&~}2(0B``mhy<2BEf&0Xa()~C@wUBw`>8bckL6Byw}rurt&b#&Ks1j5ri5zd zZ;dR#!X4}sPJEX^Cz@5-`5wjosj8+U1bJcE=fpu(;<47~Q$KzEviAW5sOfHf)5VC$ z64*NDvreRLso`aeitrwt$WiU2eS07*Fk0etXd??robf2KQuas>QcO)*Dzc)jiI`1ii<55HgY?^*s@6~yXFB*RLyk1P zwxw&Pvoaq=Mh~0D$Di|B3m}c9pi$qH?FjlpQ+!IzBBd(ET+hz!p^Oc<_sW^PRfy<> zb3mmx9a|2oqmHWjC~b|uef(WBB79umfkaja`Prxr%c$t7lq(7mzuQdWzOfG8>^Z0a zJ1(_&V5gk!LTZYYbA+d{gm?3K4G6-nj}}@2P}d)TIpkP0rfcH275s(Fp;mohM`7Ey z>l+R}C1sGP2@)ZP@gXP%cQ;GW<-46Bj-kVHYm-Ag1jMc&d&)<}ydj2$xkEnk?$8bg zW$W#Shv6fjD=WLOB^HnHBji@|q>qcT95dZ!=|trGp+^mlNVuqf-YR<{sO!3lo{IIw zQJpyYh5-YqztsGBQncn{@_Ul)Z29V;07fKur9AN^dPYHi716V9J#N7=tv=&wS81=l zdcbmpzrsdpTypNhyl#ibE`%^=BVm#@!p=v8TZ1CgcgkCiKLQ0tE$P~z#%a_6E2daA zoPo;GckuAsZ@AoV>G0BMXqnPlry&(GOO%y!Q3iQ8?y~&t;kp5`1I}`o?XW+=9R3<$ z;+_RB5XWF(d^cm?`>+fBb5#IgAyK((+JUd3nBj-M5jI}>Ai&j976utyVO~@JfwGUQ z#0Zg+^cxksaf9WDLq|wA_P?`&u7+TjeLk3}?`Oy=^!l-QrW=JV@+k@9n5&OG2^6)i z4a7TXRt!uo)7rWzsE4A!{B;aCTkw7MOT^25#~P*4;_k2j7?Q=`b1sWGWoPo<(WHC> zz{F)E6Lu@PI$D_h04&DKCXGxKG%C;4pel|&Zf4$Ic~ZW^Rai>!v|O;(Kl~+ zv+d;VE90;QS78JqsaU_sJ>Fc5N-U5$wW`M#w5D;GPzpc`t6gGOQ{PwR(PE3=niAb! z6Hi~QM{zV~AR}yqSk+xCy;lw|P(c-W zw)M+fAdUcQ{@X?yyp5&2iB{8KMmZUL$}p!C(KQ#FVuA%flE<{!m7Uz`g_NCpfeBGP zi+%j-U0FN&^H=$Pb?FeVX(_yM)(zkysE#VTuvn7py-qujm+ZLrGfg$C ze@G1YoGduD4ExUbwL7}r zbS{g1V41bTz{|H$rUZe2~KD-JzZ=}aGMrwDc%fDwO6=sT)sYerG4NNq zs0<#4#djJCjxDCd2j{ptdo1b^`eBztsudnb&N}hjB0d{X9|puK$KvmEk5F`Uv-jZ* z9xZ*IH9D@To}!{14$(7?V`^jddFPz>Nhyc;)wYkuwNMdB(8xq=G}d?fO1C%;vZr)L z6bZ9V1l^Nz@YB6xR^^WDav1KpQe6>ck?1)oIm=;)^p>B*bB3S@Rfngft+!kMI;1E z&vh8^%kgvd{q-2G_AczNAp=c;qXQnRh8p^BSfPGhyJDAYY=nMfcU&%?ZRkcJ z)W73*!}5Nr^>z!F-oc{lXx&l6iujg$t2e5&2DQQ1Z z`CY2(LdMM)oc})Sv&0QBgk!NtsZ-rjSFXyrF(93zc26+9anc`x^O+Sr|OjEM?xC@tT#^5Vc#aik{|;WT^7iFdi<#2x>Zh32nTxWa^i% za-n}$Fv<9%m*ms}BU1y_f3k|63`ayCnB$PIUEp<7f9rlk$d|MlKBx6{47NoeyJbT$ zJR?Czl=6f7j`04$o;Ely`jYXlOnlf@IZ6@NdG=#=I0+4Fn6z5r6%#65wGKT|*ZWYv zwK&ya0faFdgv#!HPE^rgxn$U2wXUz2uC&x|$Bb_;;6N ztO&&5`9sxU8()98fDZbdH&ng?c>V~OcgphY)h1o$2Em&T49RAs?;eUMx6YoQPM!@z z!V(};0S}aPa`*%TPd7wi8*}pYqPS8Pcn<#CW;jx+*CLowi8Y60q;*rDjnhvQa(WKb zcFue>ch2;0v!Gt0;m}grIdC>DkC1@))s*J(T)wY!nVM_~k&v}ZG(zZ|f5vJH;vj91 z4S0p;x5-aDXxA+51J^W_jJ z>Mf=Uj0>R>iMzCokkJlF9C4PT^ntf{5sz}*Z_a$ipS~aAW_xKGx3ElC^$9Ud3(=&w z?U2WLhq~hf&qtlS6Pe`5+5sB&&#FYc)FeLKtKc~pZv#0KxV(P8d49T)AQ~#>$icpB zQ4zb+nl;IfQLx{>-H225arrcV-62TwY^{Hz75*F7q5%7?Ndz&@BR0}IZWJzvd#ylI zE(J95vEw5$WnM~9!=-?&>V-F*0&#n4No%?ZHEqYZ6LyW!Obi3!_TtBx+BOK|bHvl| z?*&!tt##J@=3PnO#nQ&p?ki zyilK9$RDcAM^UlNG0%@%=3Fk~w>^g&HhK_}%Wn`L3C0C(q10<(yM|jbg*@7N{W}k8 z=D#GA{IE6K0kM^##rv&ZweySI4OAYMgsx6A_GhZv!J%`}-O5$QNP@QEPaJ z#YmJWD`k0jM1x7xf(;Sicct+W&I?$)OpGP8!vqg~@G;D~Ibh|$;=Iq+uf$qb!DCd_>^r)ysa$5HXAp0`(29i91bny2~oTKFHi!?8pMZ+3TLd_5>{ z8A0R`JTvq;sp zZ*>KvK?bri_(OwXhu|5%@DJ9f6H!ocvA;!Mw!ZgcqKf{w<8xtzGKL33S2A=q$R&4<&=Hk{n~V${ zh#O-#RXmMEP%N_R(tQ=76|0Lw&ImhjHguM0zv+hqt3*oXYr@$QB8yreNSuJZPX=fE z@bzJ2>JJ?P$sGkDbZJy{UBJvi{hH@9VVq00x{0ejCr|LomrrSjVrW*+u7{meqy4AE zF#^{nIADEe@Pz>M5%3D`G4BRkfi>BbKeFR#?S^d?Vv*q;<%*>cxT^Gyaw8o(7r!%` zOsL!wYljeoe+mt3PP$o5M>n>k9l9Ar$P3|?UuwsIAEBbNZ?DQ#c+{AFutyu9yu}m> z(_C?JG+U{D7ScT@8^b-d!Ufi5vPk{6jg14ufZyo3REAK2jPn7`&-6QEk2fn4I?stE z7D#Y?s#a^hUD1@n8bE{twi9r%{}fF(6J|DVl$@s3M+xPD04wx-MCjpoYD-ksXi$>$ zv@JrB>ec^PpzhtVBSJgm0(Rd5o}XOexC+t)!%hz3$xYR8Lo73f2Tk#jfm1t1!y?P zt>pN3-0kF@)E78;4D-!42I+TSGzK-|#4)ycq^FyFn+GY^NIdZ^SoVC$a&;FtXibHv z$CWLD9;b(7uLTT_f_GQs9PDO3zpIhsA%^zZ$CQ(0T+I*I&&{%&NVxTM(yLbJjWB2E z#0+0AP1!$4fJBze>)m>Y{~BP&FesAFuw}7&`PV`?CWmB=aFmOjj}nxk9|!GIo@Jj$ zd!~rk_!jCzAd^gZtfAjmL7ro{g*D2Rj7wMC58UYfz3>Du3&_^SIF|Vq@{(cssECOw zY_RxG4Ee(`5O{=aV#L7>N<@*f;CBe{sGRER;}KT_WVWQ&e@KGltusck#3fJ>gPXKS z{kOvcTA4u}fh!ScSy)1vFdgD%$sAJ167Y24XsMF$5om1<;8Ttc=4*6VHaP1ov(k9C zeymd==W!XL9$D*)1+L$*>gjYMs~nUvMJpWG-A;eQ$IjuTQ-+bfg&5{e5IFBt5PBcZ zq#>(U$6NL~oj!FKmh5-oqaPc;5y0ZK@-ER5q@A%zI8t4SIi=V?EcP8Xo2ln<CI=rGO-$DrXL2Hj4+4a!iBKej#_zRDz4)rT;e}chp31?|OF#%u8qtD#f{JDTqvCHMl|(xCv^z$kB@RxA*8>{NgCf6t@R-0fdtvy&7@lHaBo81L&(d^66VG($I+R`KJz{mC9fv_nm}zC;oQ zUycMT?p8Qlm`XWUIMTRFO@4kbU!c<#8%Wen#y1J`hD^nsDwrXe$J6~Vgi3m?pQI^y zS*5F>gE{(86iADfT@77YxuKQSF8nxAqyeEuX%%y2eTnCf2#k z<#kvpe>-w|NxPeO2XZ4tIUBu0;z3?er=ymaq&u*~r8U>-B+xZf->!1AsrX^AJ=<`T zc(v9PH>#;Fu9JQ!4DM*tY(8p?^Mnt1|Jcr-OV;ZD8n41G`&YV&b_UqS3JwmPD2q>i zmwBqfuHKTwuWWZEW?#ly)H1lcgJngA!*IkN6XfQsj198Ecoe?BFO7F@{L~29g34AL zNp)@|osDOZ0eQctrl$5!CLGs%Sv6y2&?S)HItQwz8XEf=EF3Jt)nAMvW|X$?C=A5% z(rWD}UpV37S5XR#^ex!KXO%wt#dA(hKQs?M!GZmSesR(&ceM&AU!s%crtbnH+oDiNj)BnG}pR9-`0FWlh3%6W6vFdz_&qSfo`K7+rx*{wkt z4P)Ab0XCG^rgfG%{koEE;H-Swjf-k*9!%@oy_j>*<1b*~k?)i7M&& z-u28i{-tju%$bx7XmsapSR=amm^@8l*+yz=DIV@R zS<&{lS9QejlMG_TOJW#LaVfR@;x7D&jGOHj@pftDCI8>^#dGv@t!pXY5M)@hS&~;e z(ryI$fUtpraou#g9<^j~*^uFtfPHr;;?)#>fnY)lu~xYfLu1-bi#U1aUdXS5Sg~{l zF1T?Tv}_H4t3D*zXizr}-)OFzFk+tNTPKgEEyW=E7Y~njbsp|%T}sN5 zq^TDk_M2&YUOQERRR)7hSYAS^rHh~3M8$=2XzHB)5Z&pZJDotIDYg`yFk~x+cX;!U zf+y#2Gz>8`h?T2ibV|713YA6{O+!8GapHgBwS7k>X6kZ#J0~O~6K|8pXSV23Pc*$x9}l@5nKwc_hqMR^PP|bU?W#!^ogH z-k}F9oJW%!GMXvAex19Uk>+kZgUzQ|NENyXhaRJZ(0?MrSU1(yYZ+(g&*kTARY7E~ zfv>`JE;FPxEX00C4VdOfGt$Wt2o(bA%Quz=i8zLuuhU`rFVi_r7UjkIp`5>k8v~k* zCArPOChS`^{`~|JieFcHXEmP$ET0kZt?BF=acFWXBfsZJR)@^)2x~uiT=Beh4SgK3 z;gCR!J{kDSQM9M41Cx8+;nE&n)s1U4lo*_Mm#hHHrCW$^q|nU2S%A{1kcf2cloFil zhL^L$DvNkxF3R#8m*b|LW~uJir7j(aEbQHtaI@l@y@7Mx^&s}!Yvv<}bcEs(Xplqs zphAYIo9`)H0PjGdAqN~sOjiRXah6?73To&$;A8OL9*Dl%f}cHE^(I&n;P-h%t~q(; zJ*aZIG~f0o?9(|K_SYMy0J$T_;XjN{ky#WB>K@g7(+?2_c54iyyksO`4WIWbPqzG^ zo_$k8E#KQc(1Hi=f@{dG^=RGF43E#+)b8P{wv#x`f*T%|A8G`fa`ms9Xxw1kjNYUiHu5k69?Zj-OjiM=cjQNvlTlVco>f%gJX6 zl2hT19zjCo6c-4pU9FYFBQ{if$n`m9a{Y}KOouSn?tjgAuXPaQ$_+|pLhW6BqHdIh zYzm-(c7#-Hl`7e!6k?-Rg|`S2hHo&tOoo;@ggT$LX?B&ouKF-fj*=uooq-7OPW{FV zM3~%%Jd(b)c>@pS)2-H0Ce?|YU)eV9*lQalc8-52@x9Jx{>M{Sv ztJ%Jk5W^{n44S>+XpI?dECwr~hH>LBsy{&!$L~KM(&y4L2V=dq`m(9zd}NMfeY^K; z{O#}`52+zZb~nIM5#1wc!^nd|&-G?Bw2s6wG0qZM*yH%{9<|#u*w1Xfo;Aya(wwvG zb{!huKSpGxM(}uNnwJ~&&M@iA0b~N{df`k+@2Z&qY`D#>*hxFJ@T_Gk1pQv3(@ zvQm}MUh92GjrD*7>h6-;r1EhyiB`2%CV~x0H_tt^aU(Vg(GGD4z>(O}NtZvZT4$U1Y9Rcgd$#l6Ygcnx+_!2WNtnTk=30a^U~5|voObH) z(f;UsbSS@|cjoBejaei^#%C4zY&TEL*re`+8HC96y0M4PBK8onR+GU}cJRw7}N|$6)z?U6&HRRq1HD&Lxfzv|Z zL{&Q@b2ilBU(S+bmX|*D(+>{!YnfCL`QdAi0dB)@V@O71C1u}av#imqnO>5ri ztD5-C`%0*|3M^=h8i>cbRfAx?nasG|J4qo@cSpvQzG#8;!>U6?3}x=N}Fb-@7;acvn$rmH`io4=KefI%ah{Y z9EYre<1La$s6xmDjRldT$pl8kQh%Yde(iYLdh~Ki&Dj)Ptq6VlD4(;A+-3Q%1tKD6 z8Ff<>%^8w5TY%Z;)V)Kk(B-uK@7$cs&~d&|+97E;LC5P7%aA}@? zYdK10V*Nqr~RLIvxvJju}3S1&uP`h6%zr*PB z<4Hg{Ci!By$H}tG!gzzlY2}JUnz47Ofp>RJ^LIeuD?S}qt~m+Fq&rFVt{_{;r#r8|ufL|T>O`g+RD=UDzpN7Imn0!Y zFis$yr*eFjpK^W%85rIwElNqZ2gM+`RJ?t}W7G3T+nUIZxe)mP+~6vJPGmA$#bh8J zqLT_WNiHcDgza^-iq|mA6$6LTt}#XVZ|9$bRaV zh)y4nnfN-pDoDa*E`7LuNv;?@Ps0?CF5V$+J%ru7+PLPUwSE4+mBRrmv6c=&k1*~& z!EfL$GM1*FiUUXkOjo5HlB?q;vy3#k5qnXI-%y8}5$6V$R9TBNpz*P5kxR%nLQnuDq#tSiVSAy5)KQR|R{`CHL+xT#tf^;nxoH ziM8+aCs+hm`CLTsXlkP%BNgm$#Qzr@@TR1ccOjMUy% znz-$irp6SY#;Y6^LhYp;b-R^RKuq!vep5(0=A6GN|fS#Iu z9$|M8kg? z5uRoghm2KuAbk?8gX6?CpV(mHz+KMSn**069e=J|fgWRuYX%kP;(V1&Q8!Le90 zX@I)oVF+H%>9o2liQlB{XBH4hjkSFbsVn?g`HCdOEToDdmcTq`m_6J?>ic&9Mi8lY z<&{#i>k*U#y%&9mfb>yU)KRYuH=6}T6>KxdmJEFf-;4&^5TMo>YHMgbq$9SoQiBi? z<+h=p#q@VH3q^mL6wZw|fl}kZPb9>sfBmv~F2=tRz3iVo-@D5bYwn~kUFuvi^vD6! zXenorR`n|s#ZR0+H0+`kX=XaCh4@mxnHAvh=xcWU z0cI!c#{$W@E?*M0yc7!*eE0&S63DJ*+I_6-6`W;2DgVaaS;wqb9jQ-A&QcaO`ia>v zDabBi)2Eb=$?>1kFmd)<#tYZQ$a?eRAvkY}t7>2bTeiPT(QC6LB zd`O?P^W3Bk`v(mB=buChxIBbvnf9u9cH-sIoFb1`zkDCu{|i!+?=Y>s`7RSRVNX4c z+6UJs%}w{#+rDs9uWG$vaC!)fg98=22w!1sZS@Q}-oN1C6w23F0q}RyXhHJt8_2Uorm=nh$3YB>fB^Ta)(m)3ALo|J0<`rRnQ&j}J#FR!c$QY1Y=peV>r3 zr!x$@NiMXmfzD%pw&H~SiLR;7-|G3LBVUou@0O;*y`a5JyxqFQkcy5U(?npgK1r`C zeu=@2WQx=x$a^$Ya7x}%f*nxQRJqZ@=OSLKHcl5DzK>IXibwj*lUuj;{!}SGS?#YvxvMUxV`M^C*22iTI}*yp@)f6ViIg&d zmdId$fA~ZpH>}thl3?-P^A#bOkW_#fE%+S#{M6!KOupu6{STwr@vj8rw9T(ES>1n# z+D{6Fk!a+8E_in6AAxymqGC$ z!5WM0*h=^;{`gtU=do{|-&;dDi@W73+oU!zv-a;ykVB?ynP$t@j9=G}8M{H5s_tZ< z%dx!_JOd-cOXYt0qD85C-X_#<3y91By;uCvis(U^ z*~FQEoQh}ox&f2L2^IUcFif_EDAttv1~G4FZ?VaB$&E{exD8HCMlF>i`azL?2u~-5 zOu)SWJs44^Mg$o3LT1DTpZD%BZ)HO1t$o$bF4p1sL1yElunw9cd%yzcx%c#2iTNdK zV?W9C5cU-lr9|{&531~&*&G{4^^X=4#@H!5^dePXItF1k-xprn>cYWZq9l|*GPMd1 zFd!Oh8*CBqZhWQpyvMUzD&dad1;ws{;$0M=D}ng97{V=}g&qEiVH%OcB?79VrpdQX(YNVd@N3c!Rn=4b%~T*HQR;eNcQVY6GQ;@hEguCD!=-*x~Q>GHgt zxeuGr`J?$?#qGo5s;@{&Gq+Iw)smtU1+1xcjrFK|L@dC-vh-7HkK`OMR~IQ~ zeJGHPnXu0xnTDt7dG|Reyo3@57x?_WEhu~wcwRPz!*(kq`?o=ZyQZmhp)=RUfVEw* zO3wcApbUMHw`5^s3H!eu0Gcu-fRo@m0}uH*5tUlw8V($b}Rin8x!b?AOF=Ya6p|j61?-j0~M+Az54`c zG~6@Uqzj4F{#~^2|6X({Q1p8|$^`lD$6s4z(vf)_eQkzeKY*^Q{jaWjsekovs>w}UBJmWQ%+b-@282XbfMu#cm+NBwA03? z`-9(rBF3cwnC=VgEr;eDt*37@jnrEm|6J(+l&B3bPCxUu2GbV&ZkDVU92#=?92e&@ z`5it2h;x$ISvS7^Q8ZP+!}v7g3-y`#`zP`~**-^ zz|ZxH9Dkco{Efh*mVEss7lTVUTYVV^>I z^dm_{m}!{suETn}26@5A>CaUvpWVz*-H!A?QuCG3CeW-MQuY@~i~U@snL7Z5wwP{3 zFy^M8d-a63ZvfOh2tfDcGk;6}OxuW)SOyZH_6ttnKRJHa5J%pr7Z4lh$@&)=fMe@f z?|$98PvKws03>i{Uq9ikT<1kFI=lS6-XHI)#AObeA6qXRH6Q?(1IEP6sM)Q`B37su z2vv{g5wj;L0mhg6F$4hb7h^@wBFa-BM$Jx1S!9LdQy&bz!t!@ zMm{Q=Zv%v90|24T11KnYOP&NC)704Bf1y`Mg<+iwXV_xc_c zn`q}0nr?PQd;u<$ohy?AV+bwvS-n6O0*t+7ajy4A!}US{4*Zva77nB<143`tk_vQU zI)#PRz2dz3m$XNU*M78yRP|~kOS$t^KcGU=)-s9uf}EEVMEk3(Il)PCljzEEZG?R3J8n5K-hS*bg~t@c zL5)*i^f{~wGdMCkTkp|na9oqKljlu&6dDt%XHUXMz3fWQzWBnm&EL(#_svpK_eF zC0q{cz$Y3w$|<=i<>+nU$ID5hr5Vx1~u@?9Z`;d(8MstCdi##;cI z4VbiLEQtqaT_P7pf55~z>`nY|93$HCoo5A_m8YC7$aQ>$0^^!%0+3)!{8R6Mx&7Ox zT)uP;SilY)!HCzugzs&`o9(&5@DvBl-;y(WM zH3CvaPRaEZQ2VT0g_No;2R!?wHDX++;15>Zp&C&N6JU>E{8x&7%0_#8uG1FI9mhH_e-j4v$lpS*x@Rc0f4kuF*ii6h&mhr44FW*$rUY_Fr!=|SA?6gz0J{h--;jFurE}2Dn^`uPo>wPb zeAMO@a~VL#&uWXh4FLPJEi^7o)6!K>@mp|(nySbVuK-#M+Aqyw6~}$C$qp1#?m?Nt zWS4a~T27%e#9}}EzZHK;lX<=UpYE(Zg10|2dC=j?$B(@^mB*^|CB&pC`k@J88f2~N zdF3SzFNL~KgvUc?W+S-<&|V%n1T(Mb$KEf=KqPjuT@!u3J9o}_?CoR8w$aT9O=+JN z7z1|&%zpbG9fX~XF7YEXkkKkq3TKF+pyr*B zDJp5~-Kqv}zi~^et7yL#ZmFPfH61~m@P0{QoaVCLz*kpCueq;SpQw#_)7=pV7pgIc z6rB>RMG+K=6hxqQ- zTrl^GHK5^74vuhs*istZcYvuo*k_ujxilhfmyt}(FEN=Bum?*QHs_BXS%jkC*TDN(248iLoh&as{_(v#mk-0DpdoW?G_wRkmZ~ELrF0xyKx^w$5rNOx z3Rh4PlsmUSgLv30=TJi3?E=HBg+7{aqQO$D507hO#H5< z8)pj-`5oqYx&0q*=llj!*`f~r+$<*m!ClLF%u6VcvPR{9OI=S9=Kz?A+#a>i_Yxg$0)n{6p*#r* zM*}9KP#q$-gBiB!{hz;@&vQJpgg<|@Z_%;jsdAAMuUh zy!6pRL);@py$Ov5F3>S*ST+lc>wdEz?AT^kWarW;tXf`F=+Bg!qZJ2bH7bW~-RB2a zCo3xs2cc|PX7?+;ZI;d|1Y7@R0nUP@vBfUq7h(fKZdn%t)*~2uk1d`NH{vLvj`Ylf`|<1p$D{ zGv_bhawuHpqqxQBlKpg{;Zd*1vfXkIvBhwJh;V)NW|*p z0(4!Gkz%qEy}pvHO~TUEU++Y1f>JEvrS>T|ka@xtqs6Gay)63ec`{~^6Ox=ikMbgi zK+h}1xbasnGR#HSJnwxbf%6b_hr3Usq20s|{U4H}1!3%Nsuy1s42TYh7qr*l*0=qV zUy}0cu|dl{IHS-b3>mMa(GIo9!PSXq0NlHTV~eHLj72xjRaoBy*CMepL8}erV9&Vm zX`D~LvB-jJYq;gtgfAUGc01Rzx1o5f5j`4sLtjlZ!Xk%W4HJQ~yf5{4H93P5ahE7* z`Pb6CR%w3M+7csD9wu?l9BElS?iA@(pK- zpXQZ1?7o@32%Ho#Cr41t>#6@HvXi-jJaaO_f|-%w(F!j2Kj}by%4BT(0lhJcf{VqVze> zgm$qaK^YqOxzi7hANL3^L8HSo7$D~t=*0wgCLFDfe8+TFACx;og2Y*^d#;{>55{Yh zFbA7HDYpV@ZwRnyS_^j5UK&x>xlUSAy}PlJc=2>v^ahTRPi0hNIQ$^F=e%YbLACLX zrVdy&GfNGASIG0W!F1^wH+FR-}~z}pRI`@PSLwycZmLr^c~iBG0SfAlyVj7Q{( zr$4)w)gXP(zt+LWk0PpJ`d9*D|GR_jCd%t{o{lQ=ePk9) z`jW8c>pw#UI#Qmg*;o&GWhnc-a01vj3w(&$0j#nC`&^eD5UqZ;svf2J5sS}8#Jtrj z&o;A4&Tp@$Q&XFm;58fXo8-R3?thLSqK>B!Y z7FodmTG2P(hp^?D?JvyphuBbIAuVtd0PXWOm(UF6{3GN`*PFdedx@%G6LZVZHbP?{ zg)+p3=fgfo(d4X?qjk75)3R(|^u2Gu8-3VBNJHTxMvQ5U3jVmoq=NndbIwi@% zR#OzsiHC4UVFRTV8uX!_K(x9I`b6~XHzX+?fA^%_j8}^lzp^z@67ef{_f)PPL|NKM zR~5>7ea4!L6=qbIImqTbi2-`IXrvnBs|i|&@Bxr4a4)b7q1}{@q|nUk2z|s`Kxz|5 z5s49du|Z$nS!YVZNcn-(=*>~(23`;9bK*}~2$gX5Ym7Xya^SYkRmmlWqJJs2qtc?E zN3Nyrti=QhQdHx{`#;$Gs<5iswp(eCk}hea8|hYBO1e9gl$1_I8tDd=66tQ~?q<=_ z-JSbce((G3|7aio2m87>5S(+axt_f5agQ;c6e6-pOQOj+V1+WX8V84XrJNxf!#Uo* z+Ey*}Wqm*3&03k6D@R{8*paNZb`ggU;XAbd_=#gA>N$oqu-Obmo(gXIn!txtpaJ8I zRSRFY3CfUrSNPk5nfncp^-D*F$J;*4;pXgoq{Ty@i_Bz$=s+KyjY;6h0eyeQ*fny6o+Dgy5LYDf6qM z41tKlmE8LDrb(4I-}TAAeC|9VZl{JwXBWi@)tPq-M~&vj z?Jrw)Q%4D5Uw)jqVYOL^*4iv>#^77_n<;;iu|(c_BbSY91A<9bu|Dh%^1_!|#E}=U zs%;S3^wLc?tbD@arq1gvD7FCOM=|tg;9^avi`%_?wBe&YZ*YJ(j87Ncm1q{1cCNpe z9OV!FSC7<5TdlE5BHKHBMSs|Gf}T)ybIW2{yhK7eDILITZ3kgy$-o{atQ9irm$q^) zk!t1ewu?6sa-{q4368XXwo6Qjz^X)^)QX|UOC5YlKMjjPbU61g~Q-ALLq%Jw*4HL2OT(b^>OROzw!8dt5)IBnvyMv$QHoSFL zZXKnk3RwZx2a2rid`2x#5}$o9|Na$$EfkK`O|i2#j-SMlhN-856sj$>$HWo9Ro25)oYH z{`mmd88fC)!W(_85wNU7gEFvEVx?U#+7fi5Hlu0y{(QpGOF!PqimDG91;pG~J8}sk z^EifKOCl0hw+qk)wU?$%%7#28wJT3Qw&m?Xb>^&3`Y!+c_#{4oBK_RqQ^8!)MPKj- zR>h&M(2lpc#yf&Lx$G`TE*R%{A!a-IfYvm)&xXx7o~z*0OG7L)p}MCVp_cedB8IID zYtO;|*hcz(9t8Dv$wGZ_ws2Bk%J5lGrr8N@&^;pwqC+YDdJ(#{SNu<;O8q{qoo$aV z@F%yxtV4#M4C01h6r)SQ#+~wm?tQy_HzWo-kjxku*h7LPSJJhp@Q-$0e%>XtQ z@1a}y?(JI5l26!LJ4gt+VQr&9?LWbN4}g!(Q45a!EM>OJP<*WINcrG z2Pjaee{ByE$HE~uKm}Vdfci-t9GihsIW|AA?4Y(TER)IxfZxICaWeL?53uHFE+9$a zwI|~TX$BR@3*&Fm0+BEyZFxa{cj*DjY#-*x96GR~p>{Va0441KDc_0#m%KMY?g6mN zlFhbX`W>CXqFX=A1hBAPog791?xAf>=p#Z@|4IgJyg7Lb@WGyba^!`R2I5` zBS-ZcO$+`6&&z}Kv$A24+kvJpY
SXCKy?=@+cO@OOvdroJjbY6PH#6l>#ATMr_M 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 literal 0 HcmV?d00001 diff --git a/edge-api/docs/img/lab17_cloudflare_workers_pages.png b/edge-api/docs/img/lab17_cloudflare_workers_pages.png new file mode 100644 index 0000000000000000000000000000000000000000..7b72537c46b35412d5dc4d3c5b50b7123b2ac501 GIT binary patch literal 180297 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

V9P z(^D=~3!rbq*lyvK7UyS~xNFLTv0F!HQ*=S*)InQ%=1H$Kuhyvl0o!1gG0;u9 zfiCu9O&E9@=y~r{8;Je}478X;^;N`@$#&`ppi}gs=W(4yvb`re0HxM+M?QFLry<~T z6-gF^h;1rq$@``(IQ#C`2?m6d&{RfR_%aZOgjvW8ZVYYj16t2dX7#M?KZ1^bW^*@? z7)dkcI#xRGR!gH|rx7WBxvVIj-2vEQ?|*ZmEgv8)HB)W7mVCA~G2BeVDIwd1p#KSo zPDKD3mhNztxcyRBxY~;ke&sbBYxltIFg0I*M%8=&sNa`a5#sD!Yl5f~u9e+hZixo` zO%1{#tN~A4xSXUL*DSSsAl1SSSHmzcwd?@NyO+8{PV#tSn#7VF3@*~M6+?#_?0qSDCV4&`e7T1oXQ%AVneGWhzO zss^`~(UQhRi>=w*k8@6Q)u(H8tt@sL5<+TuQz1}PZ0thWJpZdcrgVZYe`S2J_UO>| z#QmZ9h!xv;3F4#bDpo_OH@$as(WhcljD;1%lJaip{-h-|ix^yGP@|@$6)ke%)cgO2vE{qQ~9mWin3cFQ|bG*7SSa0bq zy-qW6HkIBx$L9a`dAU5nX3gLP5U#JkBZHN9)*HHkQ21&-ZFFBt<`~%);bT zi`-`1I__}x8Etl6L>@%R);ux_{$5d9Ub+ae(%@+1eKevZ0_T7Xtao9>#xj3lYdZYU zU;h&Q^4?N^Gt*^s>!C9~V=Hnch^T|MfQ|FexT?W@!)`ELQ2os}AEM|kOHxhCgFFhp@|aV zMOBh!dDG8ar3@!Ez7V zlLuZ*tOxhd?N;Cr9NR>~V0KPJsOUiO5j`!%?YfG%F#?76-h{rZDhmhpP#lBo?91Ip z+-*5HJRR5Ok~vtSZtHQnEEB#Y{0BQ^e&dg15=&~jdFsRbHihNs7TE@l3&56t8HhVvlqYpN74JoE)m6mlmewk zWF(#6Hd!@Ogx^FJ;3&j4=pc9Q*uAWq035Dtr*W@^axaoqEqR!g zjXqPvy~2IMU}CrFNbQWa)8%iP<=-98ZtmdxOb^|ThxcrLe_d_bEN!{`!K{{1H_%#C z?{{-qvV#@}a&AZ5PlwO85(tBgm#)Fs8MeLzomEcMrr>pKPD z(};|5Hf~pp#eTEUGoII+KBIY`CJU`G_oDAMwVqi=5+4oO7nkA$W3nNCg1+a%!Zvw^xo^ljUFZ zdM=m@K^p_{X~iZ1s96hkNKh3}%1zOU(b$=)%%ADy9Tr<|avT3{ei5OD?b`)>K8lZG zUKNoa#XF z1A=Sq?afu=C4LdmH#u+ifqo+Tr5dP8b$n!N{NAT_mScwAJN&f{KrP7dy!+0QJ=qb0 zYY&_~Cx6MybtZ4X&otM*ze6gD)sFLjY{m*qI>QKSOAHzt%wZS3)UHuTNmVY+$nPSz z8E8wnCA?IyYIVt*s;fJoN7hpETI3}2+l=*jT~nL^z}j$xNDf2+nxf#Yq3b-Y_co8{ z#Y(~s80l_>4>X;tAQR$91#dM;JLAPq3+Q7f@XV)yu&S>MzS4s;N&X#v(8-+Vyf7-N zKi>2rP!=me=Zl&w3f<}_)L2sXZqL@c7TO-geYgT7c<#=&q(1Mc0>Vdl_OV9KGSht< zi2TlHOYK;6Do>37px#2`SbJFcG(UTEh}UwcirmPDr`nKs_DD-z{C9)r-tHy8Q*jub zU)`4L?{C_*46>n}P6<#m{D41#HGxSzPAn^ZzXia85BS;d?36Ie62!93wh=+43iZn`s*gh1FLX05G-< zo`+}u1;ekWwX>rQZW~K@I5Va>sak<)q)lfb}kgdC8x!r;ADz6F=*bdu;&> zGUr7|#4SNhaxm@KdQ${2rbA=4-{tqGESmwqH=4)SjKb_~lk!~u*-pvIWeBBO4Z#jn zMCY2$*9~VyXkaW%kp#F5i({9ExwgX>(#$A`WR0`^TJ84Qf0A4zCMM=glPtH3A6h?( zBAVD!nxtm6qH&KkX zI$1a^IW34Cn{y3eqan(GUzOAKjnNmqy~~Sn32m1@kaXU%{4D;FBFz#v0R=Zb%bGTa ze;`RIgh@W}oqGNkf^J+#5?N{*?lkyrSi7PPL1z%eI2%?0?*fxz9i11a<}sPl%N3>v zO-HOF%U-dR?e{dF)f?rl^I75I*IYzxM40jHXk@1q~U zk69c&hW>i10X@*-TMDTq$!5&p#G)xZ;wC!BTUO`mMq!9fc{)#bQi8a8D+xSd}V?-3pf2{%5 zJ<~hkBhC@~@WSUT-ff9amo8jpeu26$KAfBN;Q;~@;vXku=oxTcDUj0)Pi#71arwcg z=o%ue*d^ze5l)k1)CB9s$6D%c%j=8z%y7ug4mBUUujqC8GB3<_Ih{vsWc_J+Hp^V< zP^wfDCTSRI%T`IF2axT52;irdm_5wDYAe5+~n&x3RQR$SwfAm#HU!TVaSO%xZ!u~`iYa~^xH*aY3q(wK zLWEJ88K({@sExzQ@^Jay@)R^M5y{xivkvxLKZu= zhRrpfb2@QETaMLX&C3?fDX*E)EWSs19+7zZcA|fTRD9q(D>epZ^vM&~HSRlGu32Q+F1ek~Z zi8!<;?7w$Mf%&WPS2^$nh4TaaX#HcpP10YzFZ+L|T?=+=bGS>7e zlNNdmXoTzvW>CsQ9NrE^!2|j&=U$pMMt%Ih*B`8zsfIP;PghKAx{4=vMctWNPB+2g z>Qv~ac`;^wA+!9m-7o{>7jVG1&K(U;VWomys@yk5If}w_7qx+pgo(?Ud{zr_;&F|4 zbY>G+C&^$U>>-Ii;vnzHUHja1_^2Qq2-Dc8NhN=g`K81E2#eE*D-Bx`{D7oHG8#k& z5w}aF;3MN56Ooyf|1*qGW21ZPd^xrjfXMlW0IoPuz1ByfPb4QoYJC{3H~>3;7Qf!_ zEId=7^~y1DYR9miAluLZ$%Gw%@2X@8#rf9s#)@=!CwihV;?rPvq}{5yB&A!@aM{E`ftdl2n((M?(yMhCuQ2b|>_>`)jR!qcbBD+T$heXJ4R{R* z4HM)#APD9;WAm+8vtMA&O>1kmzVa&D6}~4*b8L3WTe{i}(4-yGWJB^Ckn=zU^GALZ zao>E?{O*K!{EbHrRrch=F1LB#v%$K#2o-QUYMCO!K`sENH+XbgWqAEf0|C9Urm7>P zz5g$Ug?Q6e$1LZ;!4l}TUEaG5A`Z1_yq44EDF%O|FpHW`r-vZ#0MVNB3nif0Or9vx z`Sr9nynZQyefwxwvKF~Sf<%dE7iifvVk?^VMN(v%my+O8}Hy=Xnm zLJs6RM-UrpKqkF#Y{T`Xf{~y$m_L~d86*SS$k53MkU1X})thQ=bbYh_l{eHkkk0>& z{%J(mqYipKHy02xm;@043vkCSi1#Uat$w~U#zFYAhk#$qv|MhoZvlFx`cYso%j+*C zi`_@N3MHEh;IrEp`5c6(rt^LOpW_pPYnd511L^Y6&j3Y-L`FMx~V7Y=*O`+8cU_}q`H z8U({{TT^r;ALojP7OMR(T1LPBMhw<4V^pg3BM76ra zMHk2eT8VC#1zlZ%(3-H>no0AQ7?B^-wT^q6Fa9$XgQEQRsTc@rRD!25eFGvc^P*qU zaWu`bXknj<%X=OQfaJp!aM89wJkRxNe;f2uO)sstkR@v8HIhYmLq#^?WC@(v$}n&r z)LE^BkQ*v`Qxje-!Sn@pl)X81tNNaP1JV(V@9{_tFhJ^0Y58puBSnw|xi-VTPEgOT zJS5T$WHFaVeR3+B`hLC!(V~yGW=%URS+I`Vi#56lLniqs#Z0V;UT;lb5Jky%-<}-# zog$V&GEp}qvNZ{4`}!{7Rdk2TH16b|?EJ9hT@X6h^`B0aKtE0a5>BG7AWe(pMGIC= z%XB!unA7V@-YL#T)JNkTm$?>fzAF=!uQ=*x)FjZs@J+<#r4*_(OF`c@zZiX$n!wd9xAZJ|J0m;Op&?w{ibgcDZxaLSs^M&^&4eK>V0-qz##@@VocC9$vgQ#yeW zkb|46bjD3&_-^BIZ3cmynPpJBTK)k-I?Qw-{=TUcQh&%zpm;;^R77%*63=bLbKZ9X zpWe9a87sw4Jmz4+&ft+VdR;KU(x~3&pvDL-VQ>q6$XM$z!}gK?IZZCNsg z!H~5_%KGuB@&Wb`rBf_y2{b;M92GElj95~!S)FE8==HI$D~BbvqNsv)Rua@bxE%W+ z4>RzmQOpK~8C~9=Gyci>vH!q28%Q|yzPV@&3)fCBh|orDDe!h#LIbO))UXhpM%09w zu0Ao^&u3hB3>w^=d*0umo>8K8My8X7qA8%4GyGWc8%X2r&1ACQY5yePFgsZtLLSHp zYp)`Yvsk%>nuyk50bFT7dKqsd;k*Pr3k1}wX6#*kph><%=$CHaHJ^Hg{0x_fMhUzI zto*2DCgz-p!d7Q|3L_~gqFOh4A?T-tv+qKm@Daw7Y4qJ|a3Sm8AhR+9re>0ESWBl! zl{csT_UEUC?9W0)Y?4?ahn8ItpaTi-=G=x1JL7#i;0QG!J%7yuqu@A-E zcYOH|gCWJ6O$7>?Y|I{S3x5io3<}IUz~!_UgPbwDNF5)@hQ%MBTVZhb2oXc|?9?BH zYsWe>MFhcK2BI)hNF~A*jX8MIkHt5wBmzz8lxEh@(BZBY)GxHqrgwq(<iOuzh!SqfZhoK zd2hDv%opp+ut!xd*wI%nvtsQwz6fEzb#cmDCppGHCEuZ|!iNwM5IALD2jfsvo%X}> zhf&XB%HPBO-n&V9$QDmlT6dlwe|mDc7az8~mnnaj zMyCbU6(Z3%SpHKv|A->YunuKLDj5A(`BeIXkpQt0!jDrS{+7q-Cy|+E&J^ISg8De9 zShyn(?lb_4R#>$3@)}+BT6U*}1`e+aLABf%M`3?(2ccs@;kyYpMBiVyMcuFJ>%U2b~7P^?7J=}>bH_rDwOAiY};&vaYDm;HePMCBh6D;!;8w-{2 z8t6Vw8qe4mN|H!T#!}-gRvN^PaiegppFjyayH2IhA8=J2N!SFlN08^A`z|&6t8^`I zbX?GPP=x36XAmRW zo!AV*-bdX#y#Zl0XKJ`-b4FUTp^L_l+ys%w_j@#sH#$^)a=w*?zv;dMguKHxLQ*kf zmooFbk{jj@ef|fVSoqc3C(jlrNt{Ot`|QmqnqebeUxMx*AefHu2x*f0N{beXpDm)O zkK{iS*Qc5ocpv+&TH_0}fk)z}xW+IaRfgmV&QQ>CewfvOI^#i5a-!w6{zVjaokA>a zVY{+H1;-ju$kt=`E{QMqR1ErY(SLe6al`c?bhm3Fh)@=s>5t^`_YDOmx@$lohs#aB z5zAQy>r}q2c#*Q(cdrjUM<;~ANp9+62a6O+{Jj-RduSVid)>=FAr~LgBkyDI%MoHG zU%@L^XRu`HS_RZg2#9>+HR6EI&lc=J+q}fo{6qXwH$W%Be)v3lbGW7 z6W+KB<;$>kW%On77o!qnUNNC#j|z!58D?ECvEr$A#NG@+f}|tJoKHf7TA@o6 zJS7-Gs=j>b$z78bPuHHKN3(2Wq??ubmk{8HVcOeKi{M=eD_1udtdq8PL2LytR?N66xYv^`+^b-tTdCADrq2UhX`-#t4~Nb z7N84xgNG7C-3bXHQ0=u4$7Aae5GiLgxGd)|{zT~nhinjJ^_yH4hl${<_0o3>HG!>$ zb6Tc~0*|9tDhZ<`DNS<>DIH*(rxOF|p#9j@5S9-`uUC1_MmVOHDiwgbnod!MtvyEc zA*(x8gR4VvNnA^>?H9|Y$uy7Y0DsQ6<<Z%kAf~n zePxvihmktsbc|K8{=CM77)>6tG}V{H{vc~BM$L&{wMT%0y(Hm=M|DmVJ%E&NlvPNF1eJ=1kb!YS*(`g#@(!4<{s3%CWT zbrSjM20ovCS590GpEakwKJ8?(cUwL8_j@LvCFO@h;1n!TlpXbI?+~#+v*1tTh3ucx z;98MrjvtfTj6r=Tx$oA|7dUu&>Kzze$A>YOUcF{i33lzW-*kCx#(3ovK}PM|JG~9?UyPji$LuE&y7|fUjpy4`#a#l+ff7=&OMYh zKo+pj7vw|w&1G&=FF?ErnIPQ;%3~SOC%ORY%g`hsx!L;^MBoxL21tSl(rL9#VEt%c zlQ!pfwR1YAr7n!>FjZkb)bBisjNc=}NZWw+J*_rirXWAI1Qijhb1a~I%ffb|B-0-7 zDUT63^7>(96jT)W8*|N&?!m*2YK$CEj8U`Our;0O`Dfz~@6TbeBNZSc*!0-{==d+f zfT>R4V*NrOE)W(3=xKq!Sq`ZB?|-}*UbRF^fGj=Mp5N7Pe*KnFhOB5PTt!w4>fHgJ z;6A|%%DaHo+FxWbm@fR3ix3$R%5)o5It3;+D7!HQfSORxESjHG2U7~j6d<*bIP^JD|DF*{B-iOD7$;T$2m!LH4tC&O?RM zZxd8CM=1MS{~PvC4k=gT?3eRP<+Y5#rxyA-1<{y&ss5%$g~42k_9m3dLD5%!&J>i@ zsOF+5B_S&mYrxGki1`9fdK(nsxQ7~p;vWYZyzZs$NUbX&pkvsBr{QeK8Tfa89&9)s zVCqb7ek|@znDDOnwODGUjFUBXY%o0z@DCM z$f??|k-S(T(W`U%yaP{x`lVQs4kK>g}(5^?wSKyjI)9ZT>XXgCN?3$DF&i?axmE_*4P| zxp}}@UmyRTYw#?-Y6p0c`sq8s>Q%`kq=qd7jF+1!c$PLFa}uCd?x~XR z#_C-yJ-PhvZak6czBv(4-RGk5AiEv7i5t5!$o##C#7_T3Y2}c}DezM3w!A>ao>u=9 zmT%1JHt&qfF2jut2)v&HN|iUR9C-N~NNqNAjh>!o)QWPnpr)iG)|D^}kJ6N@^}0gz zHR)(h&Sk;Jk)Go{!FeBEkKnh-p4o4&7ZuCy*2_)2ay8|4(I;fU%r6C%tVW#fF2HWp z{r0+edm)HW?P)Jb@49&q>i)Q%qp*qTrz}9ncU?Di#+V*(yfFqlP--(!@rGWg09C0u zf7xu|{0=G2&T#i}OOdwnJjbRx31@{rSd&wI`y-LfqYI)S#1qJ@nm!5g4wlF|AgWK; zbeI#_NM^lr>kpX24p3uUW}elFV@vdi&V57rg*13nn3(U*cI}a3hN!> zhtAb}{J~YEz|#a;pWkvCjM^<^TJ+^-{zE`~@oa%XtTmJnb_HhRa#263GsD+qpH?6U zYHqFGA9~29jt=SF2G+ED2hzFcBnzi^isH|>w>t+WjqcY>ne_y4DSg?V?SGqgnQ_2* z@Wd~I`S1ssNZOgzK`Qq#1!ojiXqcMnWHvsg1}LAKy~7jP3t)QSrXLd^ND%^GTmKU4 zVNG>=#$DG8>7;4`K?8$1eCeZw_5^`L?o=V>tQ|0R*D(2J7}VO{haintxdf!&D~gF( z2@;4kz>sd>BU`x94lWq6%ti__NDX=S_8x@&Y)auB1sUTj1i7Qrhv~;uN;9LFv+Opa zLIhQWhJuFtp%10o*v^4@t-O;^a|4!;xjQ=dUo3tL#AGM+F!PBbg)`eDX<(al^|U82W^P+KnFeXA&)HCH+Sj zH*xTYhRoQi^Cz;;qZ@`x+p1iQ1(YcsLJX2G6oUcp2aI&=VxGssVepz!TGr zPgA66|8}4B3ymbn$c-^vanJ;tB5|8!m^i-8HujzQhOwSzJRbGl-11X}aN6N~fhMfy zD`5<$9b_TCW_8OGiNoo%@&N^bi4cu@Yqa8bpzJp3xrU1!BTmV0BW=ybGKo;m2KCWb ze<)b&XG)DEQ|>d}m#Kr0-!AR21XM0a&sv!w$gRM@_~CqDoHH3}TJ`y`2nB^i8hI{2 zbJ!6)@Ry7mahNyI6&r<_)K~C@7?HNMtsY~P6?E-$D}xkA*trPD8m+lr7FQqo&(|ZQ z3`^b3pJSm6h=T>9IMoG-l}Pgu7TyCeZ$+`zfZC*nQ^hI~A>YK!eegnj?)Vgz8AdQ@ zN#T!R6A`g)vb#95vf*h^KMk5t)FlWCo)~WN!DlDXpt6=16We@4p_KhMl2|yp?rhDB7w+;bYtwr_?kH ziPDTqCR8NHq#3rV`71n|ckkxrZ&sf2(<2?Xdx}0ZLu>}wT_*QN6KT;?`l3CgNtK)# zBn;v2-FOP6#^vZ?d$tZz?-J5gYE~}-ZDVUO&faV53oTcxBwrO^gBga_GI}<(v z#`d2H;{_m$T%;8T1wNKNUxxUsTreDy;gLRKB%+F8u!9J~w_UiMG9w=Y7V&j-+GJ-< zBcJO3;H8B)+3WN6Fm5WzM{^kZi44;sf`n-@?vS1>G5RT0@lzDYzCC#9%(+nJM3BSlTNTP6XU83= z!Yoy#NTM}^y34j9g`h4m0eSD;2H&e+1b&!i$U8im1ty37)#aGzn#zj0_|yB4uj=39 zf8-ATWAKWtNPIszhij2?$uSwCVd6PuJxX{$L5fX;_C0@6YykZ&eL~Hr5;tH4Bp${g zXg$2zDp?HR8Vt=+(qc~@lEQ=qEt+^H4+JRr1{BRA_%?bfWK1%sMH6tj<*|i_ziAvZ z?+poSq{^#Mo@daVtpmX4JhPmZLY{5Y9>*A`@-|#uvbWG!2A7vQ&A83gA?LN?7q5zH zW#XwCIXk#%0Xrl_PTXcX$m$~>$yw-0MZ5T_aGP1I`1qjI$~(3d68v)=s1a(og` zA;~D36HK(^EtGxhuN|0uZLnCt_`sPq&xxk$!HLXk{_HCN(*l!CYAG zrlPI-uu8Hcti0{~A2(OAt(IlKBaWNiH7)T2E(JgHGa}&%$Lz}}nVcY=!`S;TK1Ti_ z=>sETrQ+#c8ahOhGahfPcg%`emwTC)s)~e!9d`ZxI}U~7Y5U3Qrv38R&mrg=3cX#r zHBVr?2+KyMLaMKBc;+&&Lv>;(dVn-L?)$f$^7Gyc+%D^-hScpvt&}O?c$4bacrTp= zB=q>22(ZWc?+Z_~qldw=KMg9DLgwfZVzX4LA72NXt|t(eF6AS6lgl0#6HH~K$w%S< z^M`t=Dpoud@4Z4`=cYCzma+@$!5+{1Cs2R-F-g4x@^}c*;WR~=l~DifpkCBbq`h0e zo*)31?0q#rTA{vVykCc+!CJ{Gcc6Jol&i>K%22)3`c35}0ZeTuUrEk^$X(77qle)} z)$J9lB`*~AIw~z{q*ov6tjTBH=_6e?9E3o)NQp=Cabmn1&1dwyKC*EJ72|{{r;pO* zW)bcPGMc;00>pWt+tTAFQ z|GNs4|HTW^m95X`v?9o8>kAO`MM(ZZ9%8UUg*;>8|In!^|F=MEC|L?X36sDqbOhPA z*F%Dz{}b8DH>d&0(-{B^c24yu3p8^h=75Yi4q|{AT=_bc7Q0!aXZMvfMRUwL@dc{@ zvJzT8{8rlXPvw17e+Vn{lS~+h>Hh{^5J%(bwC!DE+gD_4-)0DV746?UwVyivE2p*t zppU3`&Rvkg8m>L@Pj@d%4db#~`f;H9z#A(^7UR#=%8XQ6 zs#AfC%auQrNmM#u#PMygNXWLRs|Vxq4{c=c606%s`z42)TKVo zz$czcWYfx+U{AIHg&U_p+Rka_ci$R!?>Wd#F?0!Znsx4-@>doEl%?@}FHFF*__JzLThtiFz0Pe~K$Z)6wl*kw& z`*rDGR8E2}XjSVyR21xFmBkI4Upf7a^3`ar06s8y%kO{dQ%hhdNQ=N4rVfIEqH0m; zqdmv^)d!-7eN36{vfGM0Cj0M?gw{U=%|1K50%=H5S$HoFu=TQ(B^L)Jj|O;a0F<5t zjaVD9J>8z-d#bXl^}qcv#UUg z;5wyL<@p0bB)fYcC|)&oNh9h}1#Bm9U;sFFA$A8@o4pD(9W`;Cp>WzQe)J$v@zst-3H^US%EvMa$Xot-~C zkRi-lT;MH~f;<)@libV<6hEJW7y+02uo$$y>K8a;!Umkhj#_dYxZTP){GrQ)KakX=bYYJaN z#0faOU<#ZhU>rvKuHaku@$TFVrN^d3jv2QQHc1Z=1Z5~pMnpahjsPF%pa=bMgBmyw zvbB?Bx4mhWSsQpJ2#rnQ#6Tu>oAd zRmNhW+ZI>hb5;7Y!*L||eFsb#s{!>PhpiU{%m8R^E> zjEQb?qiqQm(+C-x8)SiULK;ztP>#PBDq9C@75TCXd{xP5=>#ZAB46&qu3#Y)R$Y+@ zk@)_$05o2QJqDM}U-_|D{>b72WZ~N#1Q!prw@oxQu*?`74tCIrwfsI6B@{(A#u*MA z#5r89rnq?pLqWAN0jKOk0IWB?*Isk%mArsm#r$2Y4J|N+kn=x!`P?)`7fCyL40}kRG$l7 zfI^CFi-jbkl*+@;^UW83KkoAGlJRmlBM?h+&~USW@;gx9zXQ&gaNCiu8nQeNv&t^O zhBLX#*uW*s)!wS>CSTEHt_P4fA+2{-&S?c#42G`yhup?eYB30+5PG45hdidx!ZW-_ znleprD{c;`;1qlpYcF+-8k0cUEE{Y$btE`Z1c7PjGfS()WQ#Xw8ZQ&q51JGrjZv)? zM_rLN-X2i%INeo43N{#~^<`&25z8^&!%iaS8qFCKF9Ev-C?D*AvkcdOqgTH1?*3op zocll1dmP7WmdhT>Hutt%Mqk%vE)x>AvoX%vm~)(RJ4VxkcKgrRj0Lt>~MOVP97;nF-P?n6FKC3=?^%6!1?j>>*uHU>-MDnHMM@507W;g_|;_+ zEc!|J<-;uqv0F|T$cJ}?uF`Ba1 zEZ*YM$0Tpc8zerqu34Z3%uaQ~(<_tV(V2l@=%#UA$*;uTFrhn|BeRQ?7MFf&x4bZS zS574zmCk#;&=HJ)|FsC)BvBUaBA%-ACMeEGQP5+ervLIIPy=p#xS_)-VA3?yjX7zc zD^|Vk+3$_H7t$G89r~W>k##~+xI9=TErn^|;pjaJ(c!6GN!S6(O}RC0GH3YEFKJR2 z6x!JTcH5*vBys~Y`LlofZq7Cu}mL^zbpDK(07^mGg7jtK+XtQbpDQ%>!ZiaA)M2f}a# z0i4CvJuNj9BJk=wLxnjXCspG_hVX{ASr0W!DiKxZxfCCx**X^Xj8d66qC!{FPrZfA zd4q(gb0%XRnq#$1BsmiUU9soZRbd2vC#ExuWZ_LMm=d!H{d7y-+3d{{7lSxD;Fpm< z6nRPj5I?LkZ5Rh5DSaoow&GYcYsMguL=TfR9$R%=4X_ z|KunS?yXilI5Ya&T!86x5&-h3cy^MUQno?zL1C#q(mUlbr-tNGOomepL@sQcKOIS4utHPG)`r6;B zVRnGbM?w&V`Gf3}M`OpB39Y(zF(MZw~k4l|9Sz>0sVI*Ea!d_$ysr8^^Q=)(G12EBCyTsa~;SQou zli3Si35$dc_&Gqm+krv*EPx2_Y@>{NVz5bhKO=@l0zYyBm5s9eUMonf!GYlS$@aCj zG!#I9T`0!+XIQa&nE{_bAkW`ImZXMP`WPxq$C-8dsvdolxsF`L1-E@0#4GsKu--84 z^n3SB?lrg1-G|}3Q_44D_KgfY)t9t)&;;;LUnYS+nv29~!L7>#m3tKx-iNr0V=q_R zBCAp3U8)+YEJw+M#s#7I`Ufx`Lf3c^iAS_|7%~;=*^unp%#6c{Cpmh6APkts1hf?y zM;@!Om2Vn{?U}kN90(d{z9pQI^Wzws+ zzQ3Z$4X}zN&Z@Hh;df2^jC95iB`2xn&Keiqft7Z98EQxZC%EO1HD7 z!NZw!)HWZj&{qzMBaEBnHl3~DtN+boW^4DxTHe(fS)wNh-`wR-rjfdcQ3d}3@pWsm literal 0 HcmV?d00001 diff --git a/monitoring/docs/img/lab08_task3_custom_dashboard.png b/monitoring/docs/img/lab08_task3_custom_dashboard.png new file mode 100644 index 0000000000000000000000000000000000000000..a018051d9922e31cb5a2825e02c1574d586d2b7b GIT binary patch literal 231683 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%0DndaZr%G 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�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 z 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 literal 0 HcmV?d00001 diff --git a/monitoring/grafana/dashbboard.json b/monitoring/grafana/dashbboard.json new file mode 100644 index 0000000000..8300187931 --- /dev/null +++ b/monitoring/grafana/dashbboard.json @@ -0,0 +1,620 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": 0, + "links": [], + "panels": [ + { + "datasource": { + "type": "prometheus", + "uid": "afgj96bua3bpce" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + } + }, + "mappings": [] + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 6, + "x": 0, + "y": 0 + }, + "id": 6, + "options": { + "legend": { + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "pieType": "pie", + "reduceOptions": { + "calcs": ["lastNotNull"], + "fields": "", + "values": false + }, + "sort": "desc", + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "12.3.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "afgj96bua3bpce" + }, + "editorMode": "code", + "expr": "sum by (status_code) (rate(http_requests_total[5m]))", + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "Status Code Distribution", + "type": "piechart" + }, + { + "datasource": { + "type": "prometheus", + "uid": "afgj96bua3bpce" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": 0 + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 6, + "x": 6, + "y": 0 + }, + "id": 7, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "percentChangeColorMode": "standard", + "reduceOptions": { + "calcs": ["lastNotNull"], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "12.3.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "afgj96bua3bpce" + }, + "editorMode": "code", + "expr": "up{job=\"app\"}", + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "Uptime", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "afgj96bua3bpce" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "showValues": false, + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": 0 + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 0 + }, + "id": 5, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "12.3.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "afgj96bua3bpce" + }, + "editorMode": "code", + "expr": "http_requests_in_progress", + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "Active Requests", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "afgj96bua3bpce" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "showValues": false, + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": 0 + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 8 + }, + "id": 2, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "12.3.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "afgj96bua3bpce" + }, + "editorMode": "code", + "expr": "sum(rate(http_requests_total{status_code=~\"5..\"}[5m]))", + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "Error Rate", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "afgj96bua3bpce" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "showValues": false, + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": 0 + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 8 + }, + "id": 1, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "12.3.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "afgj96bua3bpce" + }, + "editorMode": "code", + "expr": "sum(rate(http_requests_total[5m])) by (endpoint)", + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "Request Rate", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "afgj96bua3bpce" + }, + "fieldConfig": { + "defaults": { + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "scaleDistribution": { + "type": "linear" + } + } + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 12, + "x": 0, + "y": 16 + }, + "id": 3, + "options": { + "calculate": false, + "cellGap": 1, + "color": { + "exponent": 0.5, + "fill": "dark-orange", + "mode": "scheme", + "reverse": false, + "scale": "exponential", + "scheme": "Oranges", + "steps": 64 + }, + "exemplars": { + "color": "rgba(255,0,255,0.7)" + }, + "filterValues": { + "le": 1e-9 + }, + "legend": { + "show": true + }, + "rowsFrame": { + "layout": "auto" + }, + "tooltip": { + "mode": "single", + "showColorScale": false, + "yHistogram": false + }, + "yAxis": { + "axisPlacement": "left", + "reverse": false + } + }, + "pluginVersion": "12.3.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "afgj96bua3bpce" + }, + "editorMode": "code", + "expr": "histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m]))", + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "Request Duration p95", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "afgj96bua3bpce" + }, + "fieldConfig": { + "defaults": { + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "scaleDistribution": { + "type": "linear" + } + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 16 + }, + "id": 4, + "options": { + "calculate": false, + "cellGap": 1, + "color": { + "exponent": 0.5, + "fill": "dark-orange", + "mode": "scheme", + "reverse": false, + "scale": "exponential", + "scheme": "Oranges", + "steps": 64 + }, + "exemplars": { + "color": "rgba(255,0,255,0.7)" + }, + "filterValues": { + "le": 1e-9 + }, + "legend": { + "show": true + }, + "rowsFrame": { + "layout": "auto" + }, + "tooltip": { + "mode": "single", + "showColorScale": false, + "yHistogram": false + }, + "yAxis": { + "axisPlacement": "left", + "reverse": false + } + }, + "pluginVersion": "12.3.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "afgj96bua3bpce" + }, + "editorMode": "code", + "expr": "rate(http_request_duration_seconds_bucket[5m])", + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "Request Duration Heatmap", + "type": "heatmap" + } + ], + "preload": false, + "schemaVersion": 42, + "tags": [], + "templating": { + "list": [] + }, + "time": { + "from": "now-1h", + "to": "now" + }, + "timepicker": {}, + "timezone": "browser", + "title": "Custom", + "uid": "adksq66", + "version": 10 +} diff --git a/monitoring/prometheus/prometheus.yml b/monitoring/prometheus/prometheus.yml new file mode 100644 index 0000000000..405abc0fdf --- /dev/null +++ b/monitoring/prometheus/prometheus.yml @@ -0,0 +1,27 @@ +global: + scrape_interval: 15s + evaluation_interval: 15s + +scrape_configs: + - job_name: prometheus + static_configs: + - targets: + - localhost:9090 + + - job_name: app + metrics_path: /metrics + static_configs: + - targets: + - app-python:8000 + + - job_name: loki + metrics_path: /metrics + static_configs: + - targets: + - loki:3100 + + - job_name: grafana + metrics_path: /metrics + static_configs: + - targets: + - grafana:3000 diff --git a/vagrant/README.md b/vagrant/README.md index 24174798f9..1b44c25725 100644 --- a/vagrant/README.md +++ b/vagrant/README.md @@ -113,14 +113,16 @@ cp shared/github-runner.env.example shared/github-runner.env 2. Edit `shared/github-runner.env` and fill in: - `GH_RUNNER_URL` -- `GH_RUNNER_TOKEN` +- `GH_RUNNER_API_TOKEN` or `GH_RUNNER_TOKEN` - optional runner name / labels / group / workdir -If the runner VM is already running, sync the updated file into the guest: +`GH_RUNNER_API_TOKEN` is the safer option because the provisioner will exchange it for a fresh one-hour runner registration token every time it runs. For a repository runner, GitHub's REST API requires a token that can create registration tokens for that repository. For a fine-grained PAT, that means repository `Administration: write`. A manually copied `GH_RUNNER_TOKEN` still works, but it expires after one hour and must be refreshed before provisioning. -```bash -vagrant rsync github-runner -``` +> ❗ If the runner VM is already running, don't forget to sync the updated shared files into the guest: +> +> ```bash +> vagrant rsync github-runner +> ``` 3. Run the registration provisioner: diff --git a/vagrant/Vagrantfile b/vagrant/Vagrantfile index f6bc680c11..80152c12e6 100644 --- a/vagrant/Vagrantfile +++ b/vagrant/Vagrantfile @@ -11,6 +11,8 @@ Vagrant.configure("2") do |config| "GH_RUNNER_VERSION" => ENV.fetch("GH_RUNNER_VERSION", ""), "GH_RUNNER_URL" => ENV.fetch("GH_RUNNER_URL", ""), "GH_RUNNER_TOKEN" => ENV.fetch("GH_RUNNER_TOKEN", ""), + "GH_RUNNER_API_TOKEN" => ENV.fetch("GH_RUNNER_API_TOKEN", ""), + "GH_RUNNER_API_URL" => ENV.fetch("GH_RUNNER_API_URL", ""), "GH_RUNNER_NAME" => ENV.fetch("GH_RUNNER_NAME", ""), "GH_RUNNER_LABELS" => ENV.fetch("GH_RUNNER_LABELS", ""), "GH_RUNNER_GROUP" => ENV.fetch("GH_RUNNER_GROUP", ""), diff --git a/vagrant/shared/github-runner.env.example b/vagrant/shared/github-runner.env.example index 7c750fba09..4e1c1b215f 100644 --- a/vagrant/shared/github-runner.env.example +++ b/vagrant/shared/github-runner.env.example @@ -3,7 +3,19 @@ # vagrant provision github-runner --provision-with github-runner-register GH_RUNNER_URL="https://github.com/OWNER/REPOSITORY" -GH_RUNNER_TOKEN="REPLACE_WITH_EPHEMERAL_REGISTRATION_TOKEN" + +# Preferred: a GitHub API token that can mint a fresh registration token during +# provisioning. For repository runners on github.com, a fine-grained PAT needs +# repository Administration: write. For organization runners, it needs +# organization Self-hosted runners: write. +# GH_RUNNER_API_TOKEN="github_pat_..." + +# Optional: override the API root for GitHub Enterprise Server instances. +# GH_RUNNER_API_URL="https://github.example.com/api/v3" + +# Fallback: a time-limited registration token copied from GitHub. This expires +# after one hour, so stale values will fail during runner registration. +GH_RUNNER_TOKEN="" # Optional overrides GH_RUNNER_NAME="github-runner-s26" diff --git a/vagrant/shared/provision-gh-runner-register.sh b/vagrant/shared/provision-gh-runner-register.sh index be6902328a..ac29aecad1 100644 --- a/vagrant/shared/provision-gh-runner-register.sh +++ b/vagrant/shared/provision-gh-runner-register.sh @@ -13,24 +13,141 @@ if [ -f /shared/github-runner.env ]; then set +a fi -if [ ! -f /shared/github-runner.env ] && [ -z "${GH_RUNNER_URL:-}" ] && [ -z "${GH_RUNNER_TOKEN:-}" ]; then +if [ ! -f /shared/github-runner.env ] && [ -z "${GH_RUNNER_URL:-}" ] && [ -z "${GH_RUNNER_TOKEN:-}" ] && [ -z "${GH_RUNNER_API_TOKEN:-}" ]; then cat <<'EOF' >&2 Runner configuration is missing inside the guest. If you created vagrant/shared/github-runner.env on the host after the VM was already running, sync it first with: vagrant rsync github-runner -Or bypass the shared file and pass GH_RUNNER_URL / GH_RUNNER_TOKEN in the host environment. +Or bypass the shared file and pass GH_RUNNER_URL plus GH_RUNNER_API_TOKEN or GH_RUNNER_TOKEN in the host environment. EOF fi : "${GH_RUNNER_URL:?Set GH_RUNNER_URL in /shared/github-runner.env or the host environment.}" -: "${GH_RUNNER_TOKEN:?Set GH_RUNNER_TOKEN in /shared/github-runner.env or the host environment.}" + +if [ -z "${GH_RUNNER_TOKEN:-}" ] && [ -z "${GH_RUNNER_API_TOKEN:-}" ]; then + echo "Set GH_RUNNER_API_TOKEN (preferred) or GH_RUNNER_TOKEN in /shared/github-runner.env or the host environment." >&2 + exit 1 +fi if [ ! -x /opt/actions-runner/config.sh ]; then echo "GitHub runner is not installed. Run the base provisioner first." >&2 exit 1 fi +runner_url="${GH_RUNNER_URL%/}" +case "$runner_url" in + https://*) + runner_scheme="https" + ;; + http://*) + runner_scheme="http" + ;; + *) + echo "GH_RUNNER_URL must start with http:// or https:// and point to a repository or organization root." >&2 + exit 1 + ;; +esac + +runner_url_no_scheme="${runner_url#*://}" +runner_host="${runner_url_no_scheme%%/*}" +runner_path="" +if [ "$runner_url_no_scheme" != "$runner_host" ]; then + runner_path="/${runner_url_no_scheme#*/}" +fi +runner_path="${runner_path%%\?*}" +runner_path="${runner_path%%\#*}" +runner_path="${runner_path%/}" + +IFS='/' read -r runner_segment1 runner_segment2 runner_segment3 _runner_extra <<< "${runner_path#/}" + +if [ -z "${runner_segment1:-}" ]; then + echo "GH_RUNNER_URL must point to a repository or organization root, for example https://github.com/OWNER/REPOSITORY." >&2 + exit 1 +fi + +if [ -n "${runner_segment3:-}" ] || [ -n "${_runner_extra:-}" ]; then + echo "GH_RUNNER_URL must be a repository or organization root URL, not a deeper settings page." >&2 + exit 1 +fi + +runner_scope="organization" +runner_owner="$runner_segment1" +runner_repo="" +if [ -n "${runner_segment2:-}" ]; then + runner_scope="repository" + runner_repo="${runner_segment2%.git}" +fi + +runner_api_base="${GH_RUNNER_API_URL:-}" +if [ -z "$runner_api_base" ]; then + if [ "$runner_host" = "github.com" ]; then + runner_api_base="https://api.github.com" + else + runner_api_base="${runner_scheme}://${runner_host}/api/v3" + fi +fi +runner_api_base="${runner_api_base%/}" + +create_registration_token() { + local endpoint response http_code body token expires_at message + + if [ -n "${GH_RUNNER_API_TOKEN:-}" ]; then + case "$runner_scope" in + repository) + endpoint="${runner_api_base}/repos/${runner_owner}/${runner_repo}/actions/runners/registration-token" + ;; + organization) + endpoint="${runner_api_base}/orgs/${runner_owner}/actions/runners/registration-token" + ;; + *) + echo "Unsupported runner scope: $runner_scope" >&2 + exit 1 + ;; + esac + + response="$( + curl -sS -X POST \ + -H "Accept: application/vnd.github+json" \ + -H "Authorization: Bearer ${GH_RUNNER_API_TOKEN}" \ + -H "X-GitHub-Api-Version: 2022-11-28" \ + "$endpoint" \ + -w $'\n%{http_code}' + )" + + http_code="${response##*$'\n'}" + body="${response%$'\n'*}" + + if [ "$http_code" -lt 200 ] || [ "$http_code" -ge 300 ]; then + message="$(printf '%s' "$body" | jq -r '.message // empty' 2>/dev/null || true)" + echo "Failed to create a runner registration token from ${endpoint} (HTTP ${http_code})." >&2 + if [ -n "$message" ]; then + echo "GitHub API message: ${message}" >&2 + fi + echo "Check that GH_RUNNER_API_TOKEN has admin access to the target and the required runner permissions." >&2 + exit 1 + fi + + token="$(printf '%s' "$body" | jq -r '.token // empty')" + expires_at="$(printf '%s' "$body" | jq -r '.expires_at // empty')" + if [ -z "$token" ]; then + echo "GitHub did not return a runner registration token." >&2 + exit 1 + fi + + export RUNNER_TOKEN="$token" + if [ -n "$expires_at" ]; then + echo "Generated a fresh runner registration token via the GitHub API (expires at ${expires_at})." + else + echo "Generated a fresh runner registration token via the GitHub API." + fi + return 0 + fi + + export RUNNER_TOKEN="${GH_RUNNER_TOKEN}" + echo "Using GH_RUNNER_TOKEN from the environment. GitHub runner registration tokens expire after one hour." +} + runner_name="${GH_RUNNER_NAME:-$(hostname -s)}" runner_labels="${GH_RUNNER_LABELS:-self-hosted,linux,vagrant}" runner_group="${GH_RUNNER_GROUP:-Default}" @@ -38,7 +155,6 @@ runner_workdir="${GH_RUNNER_WORKDIR:-_work}" runner_disable_update="${GH_RUNNER_DISABLE_UPDATE:-false}" export RUNNER_URL="$GH_RUNNER_URL" -export RUNNER_TOKEN="$GH_RUNNER_TOKEN" export RUNNER_NAME="$runner_name" export RUNNER_LABELS="$runner_labels" export RUNNER_GROUP="$runner_group" @@ -46,6 +162,7 @@ export RUNNER_WORKDIR="$runner_workdir" export RUNNER_DISABLE_UPDATE="$runner_disable_update" if [ ! -f /opt/actions-runner/.runner ]; then + create_registration_token sudo -u github-runner --preserve-env=RUNNER_URL,RUNNER_TOKEN,RUNNER_NAME,RUNNER_LABELS,RUNNER_GROUP,RUNNER_WORKDIR,RUNNER_DISABLE_UPDATE bash <<'EOF' set -euo pipefail cd /opt/actions-runner @@ -98,3 +215,4 @@ for service_unit in "${service_units[@]}"; do done echo "GitHub runner configured and started successfully." +# diff --git a/vagrant/shared/provision-gh-runner.sh b/vagrant/shared/provision-gh-runner.sh index fe22cd89e2..0e58c5c2d2 100644 --- a/vagrant/shared/provision-gh-runner.sh +++ b/vagrant/shared/provision-gh-runner.sh @@ -85,7 +85,7 @@ if [ ! -f /shared/github-runner.env ]; then cat <<'EOF' GitHub runner base installation complete. Create /shared/github-runner.env from /shared/github-runner.env.example, -fill in GH_RUNNER_URL and GH_RUNNER_TOKEN, then run: +fill in GH_RUNNER_URL and either GH_RUNNER_API_TOKEN (preferred) or GH_RUNNER_TOKEN, then run: vagrant provision github-runner --provision-with github-runner-register EOF fi From a60433d646336cc8fc78a0d7bd80f56fd2b314e1 Mon Sep 17 00:00:00 2001 From: LocalT0aster Dan <90502400+LocalT0aster@users.noreply.github.com> Date: Fri, 27 Mar 2026 07:21:14 +0300 Subject: [PATCH 09/21] Lab09 Complete (#9) * k8s * add: docker build dev tag to not look for commit hashes * feat: app_py `/ready` endpoint * feat: app_go feature pairity with app_py * task 2 * task 3 * task 45 * fix: zlib cve in `python:3.14-alpine` * fix: go mod tidy * fix: snyk setup * fix: requests cve --- .github/workflows/go-docker.yml | 3 + .github/workflows/go-snyk.yml | 40 ++ .github/workflows/python-docker.yml | 3 + .github/workflows/python-snyk.yml | 2 +- app_go/Dockerfile | 7 +- app_go/README.md | 4 +- app_go/go.mod | 17 +- app_go/go.sum | 36 ++ app_go/main.go | 136 +++++- app_go/main_test.go | 339 ++++++++++++++- app_python/Dockerfile | 1 + app_python/README.md | 3 +- app_python/poetry.lock | 34 +- app_python/src/router.py | 14 +- app_python/tests/test_endpoints.py | 31 ++ app_python/tests/test_metrics.py | 7 + k8s/README.md | 650 ++++++++++++++++++++++++++++ k8s/deployment.yml | 59 +++ k8s/service.yml | 17 + monitoring/docker-compose.yml | 2 +- 20 files changed, 1366 insertions(+), 39 deletions(-) create mode 100644 .github/workflows/go-snyk.yml create mode 100644 app_go/go.sum create mode 100644 k8s/README.md create mode 100644 k8s/deployment.yml create mode 100644 k8s/service.yml diff --git a/.github/workflows/go-docker.yml b/.github/workflows/go-docker.yml index a1fcc9268f..2fc2d8121e 100644 --- a/.github/workflows/go-docker.yml +++ b/.github/workflows/go-docker.yml @@ -31,6 +31,7 @@ jobs: lab_number=$((10#$lab_number)) short_sha="${GITHUB_SHA::7}" echo "branch_tag=1.${lab_number}.${short_sha}" >> "$GITHUB_OUTPUT" + echo "branch_dev_tag=1.${lab_number}-dev" >> "$GITHUB_OUTPUT" else echo "Failed to extract lab number from branch: $source_branch" >&2 exit 1 @@ -48,6 +49,8 @@ jobs: push: true tags: | ${{ secrets.DOCKERHUB_USERNAME }}/devops-app-go:${{ steps.version.outputs.branch_tag }} + ${{ secrets.DOCKERHUB_USERNAME }}/devops-app-go:${{ steps.version.outputs.branch_dev_tag }} + ${{ secrets.DOCKERHUB_USERNAME }}/devops-app-go:dev build-and-push: if: github.event.pull_request.merged == true diff --git a/.github/workflows/go-snyk.yml b/.github/workflows/go-snyk.yml new file mode 100644 index 0000000000..d9d1819e0c --- /dev/null +++ b/.github/workflows/go-snyk.yml @@ -0,0 +1,40 @@ +name: Go Snyk Scan + +on: + push: + paths: + - app_go/** + - .github/workflows/go-snyk.yml + pull_request: + branches: + - master + paths: + - app_go/** + - .github/workflows/go-snyk.yml + +jobs: + snyk: + runs-on: ubuntu-latest + defaults: + run: + working-directory: ./app_go + steps: + - uses: actions/checkout@v6 + - name: Setup Go + uses: actions/setup-go@v6 + with: + go-version-file: ./app_go/go.mod + cache-dependency-path: ./app_go/go.sum + - name: Download Go modules + run: go mod download + - name: Setup Snyk CLI + uses: snyk/actions/setup@master + - name: Run Snyk dependency scan (or skip) + env: + SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }} + run: | + if [ -z "${SNYK_TOKEN:-}" ]; then + echo "SNYK_TOKEN secret not set; skipping Snyk dependency scan." + exit 0 + fi + snyk test --severity-threshold=medium --fail-on=upgradable diff --git a/.github/workflows/python-docker.yml b/.github/workflows/python-docker.yml index dc486928df..047be1e6c7 100644 --- a/.github/workflows/python-docker.yml +++ b/.github/workflows/python-docker.yml @@ -31,6 +31,7 @@ jobs: lab_number=$((10#$lab_number)) short_sha="${GITHUB_SHA::7}" echo "branch_tag=1.${lab_number}.${short_sha}" >> "$GITHUB_OUTPUT" + echo "branch_dev_tag=1.${lab_number}-dev" >> "$GITHUB_OUTPUT" else echo "Failed to extract lab number from branch: $source_branch" >&2 exit 1 @@ -48,6 +49,8 @@ jobs: push: true tags: | ${{ secrets.DOCKERHUB_USERNAME }}/devops-app-py:${{ steps.version.outputs.branch_tag }} + ${{ secrets.DOCKERHUB_USERNAME }}/devops-app-py:${{ steps.version.outputs.branch_dev_tag }} + ${{ secrets.DOCKERHUB_USERNAME }}/devops-app-py:dev build-and-push: if: github.event.pull_request.merged == true diff --git a/.github/workflows/python-snyk.yml b/.github/workflows/python-snyk.yml index a9967bc9b9..e389c1065c 100644 --- a/.github/workflows/python-snyk.yml +++ b/.github/workflows/python-snyk.yml @@ -34,4 +34,4 @@ jobs: echo "SNYK_TOKEN secret not set; skipping Snyk dependency scan." exit 0 fi - snyk test --severity-threshold=high + snyk test --severity-threshold=medium --fail-on=upgradable diff --git a/app_go/Dockerfile b/app_go/Dockerfile index aa269d06e2..09e812af80 100644 --- a/app_go/Dockerfile +++ b/app_go/Dockerfile @@ -1,9 +1,8 @@ FROM golang:1.25-alpine AS build WORKDIR /app -# Uncomment for dependency installation -# COPY go.mod go.sum ./ -# RUN go mod download -COPY go.mod *.go ./ +COPY go.mod go.sum ./ +RUN go mod download +COPY *.go ./ RUN CGO_ENABLED=0 GOOS=linux go build -o devops-info-service.out FROM scratch diff --git a/app_go/README.md b/app_go/README.md index 22a27fa787..1e8a5d867a 100644 --- a/app_go/README.md +++ b/app_go/README.md @@ -1,7 +1,7 @@ # DevOps Info Service (Go) ## Overview -Simple Go web service that exposes system/runtime details and a health check. +Simple Go web service that exposes system/runtime details, health and readiness checks, Prometheus metrics, and structured JSON logs. ## Prerequisites - Go 1.25+ @@ -21,6 +21,8 @@ HOST=127.0.0.1 PORT=8080 ./devops-info-service.out ## Endpoints - `GET /` - service + system + runtime + request info - `GET /health` - health check +- `GET /ready` - readiness check +- `GET /metrics` - Prometheus metrics exposition ## Configuration diff --git a/app_go/go.mod b/app_go/go.mod index ed5d7b4f3e..364c72ba68 100644 --- a/app_go/go.mod +++ b/app_go/go.mod @@ -1,3 +1,18 @@ module example.com/devops-info-service -go 1.25 +go 1.25.0 + +require github.com/prometheus/client_golang v1.23.2 + +require ( + github.com/beorn7/perks v1.0.1 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/klauspost/compress v1.18.5 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/prometheus/client_model v0.6.2 // indirect + github.com/prometheus/common v0.67.5 // indirect + github.com/prometheus/procfs v0.20.1 // indirect + go.yaml.in/yaml/v2 v2.4.4 // indirect + golang.org/x/sys v0.42.0 // indirect + google.golang.org/protobuf v1.36.11 // indirect +) diff --git a/app_go/go.sum b/app_go/go.sum new file mode 100644 index 0000000000..2895e9cec2 --- /dev/null +++ b/app_go/go.sum @@ -0,0 +1,36 @@ +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/klauspost/compress v1.18.5 h1:/h1gH5Ce+VWNLSWqPzOVn6XBO+vJbCNGvjoaGBFW2IE= +github.com/klauspost/compress v1.18.5/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o= +github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg= +github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= +github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= +github.com/prometheus/common v0.67.5 h1:pIgK94WWlQt1WLwAC5j2ynLaBRDiinoAb86HZHTUGI4= +github.com/prometheus/common v0.67.5/go.mod h1:SjE/0MzDEEAyrdr5Gqc6G+sXI67maCxzaT3A2+HqjUw= +github.com/prometheus/procfs v0.20.1 h1:XwbrGOIplXW/AU3YhIhLODXMJYyC1isLFfYCsTEycfc= +github.com/prometheus/procfs v0.20.1/go.mod h1:o9EMBZGRyvDrSPH1RqdxhojkuXstoe4UlK79eF5TGGo= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.yaml.in/yaml/v2 v2.4.4 h1:tuyd0P+2Ont/d6e2rl3be67goVK4R6deVxCUX5vyPaQ= +go.yaml.in/yaml/v2 v2.4.4/go.mod h1:gMZqIpDtDqOfM0uNfy0SkpRhvUryYH0Z6wdMYcacYXQ= +golang.org/x/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo= +golang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= +google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/app_go/main.go b/app_go/main.go index 14aa5441d8..898f940d7b 100644 --- a/app_go/main.go +++ b/app_go/main.go @@ -9,14 +9,18 @@ import ( "net/http" "os" "runtime" + "strconv" "strings" "sync" "time" + + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promhttp" ) const ( serviceName = "devops-info-service" - serviceVersion = "1.7.0" + serviceVersion = "1.8.0" serviceDescription = "DevOps course info service" serviceFramework = "Go net/http" serviceLoggerName = "devops_info_service" @@ -65,7 +69,7 @@ type RootResponse struct { Endpoints []EndpointInfo `json:"endpoints"` } -type HealthResponse struct { +type StatusResponse struct { Status string `json:"status"` Timestamp string `json:"timestamp"` UptimeSeconds int64 `json:"uptime_seconds"` @@ -76,13 +80,65 @@ var ( startTime = time.Now().UTC() logMu sync.Mutex logOutput io.Writer = os.Stdout + // metricsRegistry only exposes service metrics, matching the Python app. + metricsRegistry = prometheus.NewRegistry() + httpRequestsTotal = prometheus.NewCounterVec( + prometheus.CounterOpts{ + Name: "http_requests_total", + Help: "Total HTTP requests handled by the service.", + }, + []string{"method", "endpoint", "status_code"}, + ) + httpRequestDurationSeconds = prometheus.NewHistogramVec( + prometheus.HistogramOpts{ + Name: "http_request_duration_seconds", + Help: "HTTP request duration in seconds.", + }, + []string{"method", "endpoint", "status_code"}, + ) + httpRequestsInProgress = prometheus.NewGaugeVec( + prometheus.GaugeOpts{ + Name: "http_requests_in_progress", + Help: "HTTP requests currently being processed.", + }, + []string{"method", "endpoint"}, + ) + endpointCallsTotal = prometheus.NewCounterVec( + prometheus.CounterOpts{ + Name: "devops_info_endpoint_calls_total", + Help: "Total calls to application endpoints.", + }, + []string{"endpoint"}, + ) + systemInfoDurationSeconds = prometheus.NewHistogram( + prometheus.HistogramOpts{ + Name: "devops_info_system_info_duration_seconds", + Help: "Time spent collecting system information.", + }, + ) + metricsHTTPHandler = promhttp.HandlerFor( + metricsRegistry, + promhttp.HandlerOpts{}, + ) // endpoints is a static list used to mirror the Python app output. endpoints = []EndpointInfo{ {Path: "/", Method: http.MethodGet, Description: "Service information."}, - {Path: "/health", Method: http.MethodGet, Description: "Health check endpoint."}, + {Path: "/health", Method: http.MethodGet, Description: "Health check."}, + {Path: "/ready", Method: http.MethodGet, Description: "Readiness check."}, + {Path: "/metrics", Method: http.MethodGet, Description: "Prometheus metrics."}, } ) +func init() { + metricsRegistry.MustRegister( + httpRequestsTotal, + httpRequestDurationSeconds, + httpRequestsInProgress, + endpointCallsTotal, + systemInfoDurationSeconds, + ) +} + type responseRecorder struct { http.ResponseWriter statusCode int @@ -101,6 +157,9 @@ func getServiceInfo() ServiceInfo { // getSystemInfo returns host and runtime information. func getSystemInfo() SystemInfo { + startedAt := time.Now() + defer systemInfoDurationSeconds.Observe(time.Since(startedAt).Seconds()) + hostname, err := os.Hostname() if err != nil { hostname = "unknown" @@ -206,6 +265,19 @@ func listEndpoints() []EndpointInfo { return endpoints } +func normalizeEndpointLabel(path string) string { + switch path { + case "/", "/health", "/metrics", "/ready": + return path + default: + return "unmatched" + } +} + +func recordEndpointCall(endpoint string) { + endpointCallsTotal.WithLabelValues(endpoint).Inc() +} + func newResponseRecorder(w http.ResponseWriter) *responseRecorder { return &responseRecorder{ ResponseWriter: w, @@ -263,6 +335,7 @@ func queryString(r *http.Request) string { // mainHandler serves GET /. func mainHandler(w http.ResponseWriter, r *http.Request) { + recordEndpointCall("/") payload := RootResponse{ Service: getServiceInfo(), System: getSystemInfo(), @@ -276,8 +349,19 @@ func mainHandler(w http.ResponseWriter, r *http.Request) { // healthHandler serves GET /health. func healthHandler(w http.ResponseWriter, r *http.Request) { - payload := HealthResponse{ - Status: "healthy", + recordEndpointCall("/health") + writeStatusResponse(w, "healthy") +} + +// readinessHandler serves GET /ready. +func readinessHandler(w http.ResponseWriter, r *http.Request) { + recordEndpointCall("/ready") + writeStatusResponse(w, "ready") +} + +func writeStatusResponse(w http.ResponseWriter, status string) { + payload := StatusResponse{ + Status: status, Timestamp: time.Now().UTC().Format("2006-01-02T15:04:05.000000-07:00"), UptimeSeconds: getUptime().Seconds, } @@ -285,8 +369,21 @@ func healthHandler(w http.ResponseWriter, r *http.Request) { writeJSON(w, http.StatusOK, payload) } +// metricsHandler serves GET /metrics. +func metricsHandler(w http.ResponseWriter, r *http.Request) { + recordEndpointCall("/metrics") + metricsHTTPHandler.ServeHTTP(w, r) +} + // notFound returns a JSON 404. func notFound(w http.ResponseWriter, r *http.Request) { + emitLog("WARNING", serviceLoggerName, "request returned not found", map[string]any{ + "client_ip": clientIP(r), + "method": r.Method, + "path": r.URL.Path, + "status_code": http.StatusNotFound, + "user_agent": r.Header.Get("User-Agent"), + }) writeJSON(w, http.StatusNotFound, map[string]string{ "error": "Not Found", "message": "Endpoint does not exist", @@ -300,6 +397,10 @@ func router(w http.ResponseWriter, r *http.Request) { mainHandler(w, r) case r.URL.Path == "/health" && r.Method == http.MethodGet: healthHandler(w, r) + case r.URL.Path == "/metrics" && r.Method == http.MethodGet: + metricsHandler(w, r) + case r.URL.Path == "/ready" && r.Method == http.MethodGet: + readinessHandler(w, r) default: notFound(w, r) } @@ -348,6 +449,27 @@ func requestLoggingMiddleware(next http.Handler) http.Handler { }) } +func metricsMiddleware(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + endpoint := normalizeEndpointLabel(r.URL.Path) + httpRequestsInProgress.WithLabelValues(r.Method, endpoint).Inc() + defer httpRequestsInProgress.WithLabelValues(r.Method, endpoint).Dec() + + startedAt := time.Now() + recorder := newResponseRecorder(w) + + next.ServeHTTP(recorder, r) + + statusCode := strconv.Itoa(recorder.statusCode) + httpRequestsTotal.WithLabelValues(r.Method, endpoint, statusCode).Inc() + httpRequestDurationSeconds.WithLabelValues( + r.Method, + endpoint, + statusCode, + ).Observe(time.Since(startedAt).Seconds()) + }) +} + // writeJSON serializes a payload with the given status code. func writeJSON(w http.ResponseWriter, status int, payload any) { w.Header().Set("Content-Type", "application/json") @@ -378,7 +500,9 @@ func main() { "version": serviceVersion, }) - handler := requestLoggingMiddleware(recoverMiddleware(http.HandlerFunc(router))) + handler := requestLoggingMiddleware( + metricsMiddleware(recoverMiddleware(http.HandlerFunc(router))), + ) if err := http.ListenAndServe(addr, handler); err != nil { emitLog("ERROR", serviceLoggerName, "server error", map[string]any{ "error": err.Error(), diff --git a/app_go/main_test.go b/app_go/main_test.go index 2622645ec9..32d1784ed3 100644 --- a/app_go/main_test.go +++ b/app_go/main_test.go @@ -6,6 +6,8 @@ import ( "io" "net/http" "net/http/httptest" + "strconv" + "strings" "testing" ) @@ -22,20 +24,270 @@ func captureLogOutput(w io.Writer) func() { } } -func decodeLogEntry(t *testing.T, buffer *bytes.Buffer) map[string]any { +func decodeLogEntries(t *testing.T, buffer *bytes.Buffer) []map[string]any { t.Helper() lines := bytes.Split(bytes.TrimSpace(buffer.Bytes()), []byte("\n")) - if len(lines) != 1 { - t.Fatalf("expected exactly one log line, got %d", len(lines)) + entries := make([]map[string]any, 0, len(lines)) + + for _, line := range lines { + if len(line) == 0 { + continue + } + + var entry map[string]any + if err := json.Unmarshal(line, &entry); err != nil { + t.Fatalf("failed to decode log entry: %v", err) + } + entries = append(entries, entry) + } + + if len(entries) == 0 { + t.Fatal("expected at least one log entry") + } + + return entries +} + +func decodeLogEntry(t *testing.T, buffer *bytes.Buffer) map[string]any { + t.Helper() + + entries := decodeLogEntries(t, buffer) + if len(entries) != 1 { + t.Fatalf("expected exactly one log line, got %d", len(entries)) + } + + return entries[0] +} + +func decodeJSONResponse[T any](t *testing.T, recorder *httptest.ResponseRecorder) T { + t.Helper() + + var payload T + if err := json.Unmarshal(recorder.Body.Bytes(), &payload); err != nil { + t.Fatalf("failed to decode JSON response: %v", err) + } + + return payload +} + +func performRequest(handler http.Handler, method, path string) *httptest.ResponseRecorder { + request := httptest.NewRequest(method, path, nil) + request.RemoteAddr = "203.0.113.7:4321" + request.Header.Set("User-Agent", "go-test") + + recorder := httptest.NewRecorder() + handler.ServeHTTP(recorder, request) + return recorder +} + +func metricValue(metricsText, sampleName string, labels map[string]string) (float64, bool) { + for _, line := range strings.Split(metricsText, "\n") { + line = strings.TrimSpace(line) + if line == "" || strings.HasPrefix(line, "#") { + continue + } + + fields := strings.Fields(line) + if len(fields) != 2 { + continue + } + + metricName, metricLabels := parseMetricSample(fields[0]) + if metricName != sampleName { + continue + } + if !labelsMatch(metricLabels, labels) { + continue + } + + value, err := strconv.ParseFloat(fields[1], 64) + if err != nil { + return 0, false + } + return value, true + } + + return 0, false +} + +func parseMetricSample(sample string) (string, map[string]string) { + openBrace := strings.Index(sample, "{") + if openBrace == -1 { + return sample, map[string]string{} + } + + name := sample[:openBrace] + labelText := strings.TrimSuffix(sample[openBrace+1:], "}") + labels := map[string]string{} + if labelText == "" { + return name, labels + } + + for _, part := range strings.Split(labelText, ",") { + key, value, found := strings.Cut(part, "=") + if !found { + continue + } + labels[key] = strings.Trim(value, "\"") + } + + return name, labels +} + +func labelsMatch(actual map[string]string, expected map[string]string) bool { + for key, value := range expected { + if actual[key] != value { + return false + } + } + return true +} + +func scrapeMetrics(t *testing.T) string { + t.Helper() + + recorder := performRequest(http.HandlerFunc(metricsHandler), http.MethodGet, "/metrics") + if recorder.Code != http.StatusOK { + t.Fatalf("expected metrics status %d, got %d", http.StatusOK, recorder.Code) + } + + return recorder.Body.String() +} + +func TestIndexReturnsExpectedJSONStructureAndTypes(t *testing.T) { + restore := captureLogOutput(io.Discard) + defer restore() + + recorder := performRequest(http.HandlerFunc(router), http.MethodGet, "/") + if recorder.Code != http.StatusOK { + t.Fatalf("expected status %d, got %d", http.StatusOK, recorder.Code) + } + + payload := decodeJSONResponse[RootResponse](t, recorder) + if payload.Service.Name != serviceName { + t.Fatalf("expected service name %q, got %q", serviceName, payload.Service.Name) + } + if payload.Service.Framework != serviceFramework { + t.Fatalf("expected framework %q, got %q", serviceFramework, payload.Service.Framework) + } + if payload.Service.Version == "" { + t.Fatal("expected non-empty version") + } + if payload.System.Hostname == "" { + t.Fatal("expected hostname to be populated") + } + if payload.System.CPUCount < 1 { + t.Fatalf("expected cpu_count >= 1, got %d", payload.System.CPUCount) + } + if payload.Runtime.Seconds < 0 { + t.Fatalf("expected non-negative uptime, got %d", payload.Runtime.Seconds) + } + if payload.Request.ClientIP != "203.0.113.7" { + t.Fatalf("expected client_ip %q, got %q", "203.0.113.7", payload.Request.ClientIP) + } + + routeIndex := map[string]bool{} + for _, endpoint := range payload.Endpoints { + routeIndex[endpoint.Method+" "+endpoint.Path] = true } - var entry map[string]any - if err := json.Unmarshal(lines[0], &entry); err != nil { - t.Fatalf("failed to decode log entry: %v", err) + for _, route := range []string{ + http.MethodGet + " /", + http.MethodGet + " /health", + http.MethodGet + " /ready", + http.MethodGet + " /metrics", + } { + if !routeIndex[route] { + t.Fatalf("expected endpoint %q to be listed", route) + } + } +} + +func TestHealthReturnsExpectedJSONStructureAndTypes(t *testing.T) { + restore := captureLogOutput(io.Discard) + defer restore() + + recorder := performRequest(http.HandlerFunc(router), http.MethodGet, "/health") + if recorder.Code != http.StatusOK { + t.Fatalf("expected status %d, got %d", http.StatusOK, recorder.Code) + } + + payload := decodeJSONResponse[StatusResponse](t, recorder) + if payload.Status != "healthy" { + t.Fatalf("expected status %q, got %q", "healthy", payload.Status) + } + if payload.UptimeSeconds < 0 { + t.Fatalf("expected non-negative uptime, got %d", payload.UptimeSeconds) + } + if payload.Timestamp == "" { + t.Fatal("expected non-empty timestamp") + } +} + +func TestReadyReturnsExpectedJSONStructureAndTypes(t *testing.T) { + restore := captureLogOutput(io.Discard) + defer restore() + + recorder := performRequest(http.HandlerFunc(router), http.MethodGet, "/ready") + if recorder.Code != http.StatusOK { + t.Fatalf("expected status %d, got %d", http.StatusOK, recorder.Code) + } + + payload := decodeJSONResponse[StatusResponse](t, recorder) + if payload.Status != "ready" { + t.Fatalf("expected status %q, got %q", "ready", payload.Status) + } + if payload.UptimeSeconds < 0 { + t.Fatalf("expected non-negative uptime, got %d", payload.UptimeSeconds) + } + if payload.Timestamp == "" { + t.Fatal("expected non-empty timestamp") + } +} + +func TestUnknownEndpointReturnsJSON404(t *testing.T) { + restore := captureLogOutput(io.Discard) + defer restore() + + recorder := performRequest(http.HandlerFunc(router), http.MethodGet, "/missing") + if recorder.Code != http.StatusNotFound { + t.Fatalf("expected status %d, got %d", http.StatusNotFound, recorder.Code) + } + + payload := decodeJSONResponse[map[string]string](t, recorder) + expected := map[string]string{ + "error": "Not Found", + "message": "Endpoint does not exist", + } + if payload["error"] != expected["error"] || payload["message"] != expected["message"] { + t.Fatalf("expected %#v, got %#v", expected, payload) + } +} + +func TestNotFoundEmitsJSONWarningLog(t *testing.T) { + var buffer bytes.Buffer + restore := captureLogOutput(&buffer) + defer restore() + + recorder := performRequest(http.HandlerFunc(router), http.MethodGet, "/missing") + if recorder.Code != http.StatusNotFound { + t.Fatalf("expected status %d, got %d", http.StatusNotFound, recorder.Code) } - return entry + entry := decodeLogEntry(t, &buffer) + if entry["level"] != "WARNING" { + t.Fatalf("expected WARNING level, got %#v", entry["level"]) + } + if entry["logger"] != serviceLoggerName { + t.Fatalf("expected logger %q, got %#v", serviceLoggerName, entry["logger"]) + } + if entry["message"] != "request returned not found" { + t.Fatalf("expected message to be logged, got %#v", entry["message"]) + } + if entry["status_code"] != float64(http.StatusNotFound) { + t.Fatalf("expected status_code %d, got %#v", http.StatusNotFound, entry["status_code"]) + } } func TestRequestLoggingMiddlewareEmitsJSONAccessLog(t *testing.T) { @@ -138,3 +390,76 @@ func TestRecoverMiddlewareEmitsJSONPanicLog(t *testing.T) { t.Fatalf("expected client_ip to be logged, got %#v", entry["client_ip"]) } } + +func TestMetricsEndpointExposesHTTPAndApplicationMetrics(t *testing.T) { + restore := captureLogOutput(io.Discard) + defer restore() + + handler := metricsMiddleware(http.HandlerFunc(router)) + + performRequest(handler, http.MethodGet, "/") + performRequest(handler, http.MethodGet, "/health") + performRequest(handler, http.MethodGet, "/ready") + performRequest(handler, http.MethodGet, "/does-not-exist") + + recorder := performRequest(handler, http.MethodGet, "/metrics") + if recorder.Code != http.StatusOK { + t.Fatalf("expected status %d, got %d", http.StatusOK, recorder.Code) + } + if !strings.HasPrefix(recorder.Header().Get("Content-Type"), "text/plain") { + t.Fatalf("expected text/plain content type, got %q", recorder.Header().Get("Content-Type")) + } + + metricsText := recorder.Body.String() + for _, tc := range []struct { + name string + labels map[string]string + }{ + {name: "http_requests_total", labels: map[string]string{"method": "GET", "endpoint": "/", "status_code": "200"}}, + {name: "http_requests_total", labels: map[string]string{"method": "GET", "endpoint": "/health", "status_code": "200"}}, + {name: "http_requests_total", labels: map[string]string{"method": "GET", "endpoint": "/ready", "status_code": "200"}}, + {name: "http_requests_total", labels: map[string]string{"method": "GET", "endpoint": "unmatched", "status_code": "404"}}, + {name: "http_request_duration_seconds_count", labels: map[string]string{"method": "GET", "endpoint": "/", "status_code": "200"}}, + {name: "devops_info_endpoint_calls_total", labels: map[string]string{"endpoint": "/"}}, + {name: "devops_info_endpoint_calls_total", labels: map[string]string{"endpoint": "/ready"}}, + {name: "devops_info_system_info_duration_seconds_count", labels: map[string]string{}}, + } { + value, ok := metricValue(metricsText, tc.name, tc.labels) + if !ok || value < 1.0 { + t.Fatalf("expected %s with labels %#v to be >= 1, got ok=%v value=%v", tc.name, tc.labels, ok, value) + } + } + + value, ok := metricValue( + metricsText, + "http_requests_in_progress", + map[string]string{"method": "GET", "endpoint": "/"}, + ) + if !ok || value != 0.0 { + t.Fatalf("expected in-progress gauge to be 0, got ok=%v value=%v", ok, value) + } +} + +func TestMetricsCountInternalServerErrorsWithStatusLabels(t *testing.T) { + restore := captureLogOutput(io.Discard) + defer restore() + + labels := map[string]string{"method": "GET", "endpoint": "/", "status_code": "500"} + before, _ := metricValue(scrapeMetrics(t), "http_requests_total", labels) + + handler := metricsMiddleware(recoverMiddleware(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + panic("boom") + }))) + recorder := performRequest(handler, http.MethodGet, "/") + if recorder.Code != http.StatusInternalServerError { + t.Fatalf("expected status %d, got %d", http.StatusInternalServerError, recorder.Code) + } + + after, ok := metricValue(scrapeMetrics(t), "http_requests_total", labels) + if !ok { + t.Fatalf("expected %s with labels %#v to exist after panic request", "http_requests_total", labels) + } + if after != before+1.0 { + t.Fatalf("expected counter to increase by 1, got before=%v after=%v", before, after) + } +} diff --git a/app_python/Dockerfile b/app_python/Dockerfile index 2c59bb0ca7..a123b9e3be 100644 --- a/app_python/Dockerfile +++ b/app_python/Dockerfile @@ -1,4 +1,5 @@ FROM python:3.14-alpine +RUN apk upgrade -U ENV PYTHONDONTWRITEBYTECODE=1 ENV PYTHONUNBUFFERED=1 diff --git a/app_python/README.md b/app_python/README.md index dd63b7a64a..78a0b12cc8 100644 --- a/app_python/README.md +++ b/app_python/README.md @@ -4,7 +4,7 @@ ## Overview -Small Flask web service that reports service metadata, system information, runtime uptime, and basic request details. Includes health and Prometheus metrics endpoints for monitoring. +Small Flask web service that reports service metadata, system information, runtime uptime, and basic request details. Includes health, readiness, and Prometheus metrics endpoints for monitoring. ## Prerequisites @@ -54,6 +54,7 @@ Gunicorn access logs are emitted as JSON so Loki can parse request fields cleanl - `GET /` - Service and system information - `GET /health` - Health check +- `GET /ready` - Readiness check - `GET /metrics` - Prometheus metrics exposition ## Configuration diff --git a/app_python/poetry.lock b/app_python/poetry.lock index 748bfe2685..5eb5476447 100644 --- a/app_python/poetry.lock +++ b/app_python/poetry.lock @@ -353,14 +353,14 @@ dotenv = ["python-dotenv"] [[package]] name = "gunicorn" -version = "25.1.0" +version = "25.3.0" description = "WSGI HTTP Server for UNIX" optional = false python-versions = ">=3.10" groups = ["main"] files = [ - {file = "gunicorn-25.1.0-py3-none-any.whl", hash = "sha256:d0b1236ccf27f72cfe14bce7caadf467186f19e865094ca84221424e839b8b8b"}, - {file = "gunicorn-25.1.0.tar.gz", hash = "sha256:1426611d959fa77e7de89f8c0f32eed6aa03ee735f98c01efba3e281b1c47616"}, + {file = "gunicorn-25.3.0-py3-none-any.whl", hash = "sha256:cacea387dab08cd6776501621c295a904fe8e3b7aae9a1a3cbb26f4e7ed54660"}, + {file = "gunicorn-25.3.0.tar.gz", hash = "sha256:f74e1b2f9f76f6cd1ca01198968bd2dd65830edc24b6e8e4d78de8320e2fe889"}, ] [package.dependencies] @@ -368,6 +368,7 @@ packaging = "*" [package.extras] eventlet = ["eventlet (>=0.40.3)"] +fast = ["gunicorn_h1c (>=0.6.3)"] gevent = ["gevent (>=24.10.1)"] http2 = ["h2 (>=4.1.0)"] setproctitle = ["setproctitle"] @@ -663,14 +664,14 @@ dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "requests [[package]] name = "pytest-cov" -version = "7.0.0" +version = "7.1.0" description = "Pytest plugin for measuring coverage." optional = false python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "pytest_cov-7.0.0-py3-none-any.whl", hash = "sha256:3b8e9558b16cc1479da72058bdecf8073661c7f57f7d3c5f22a1c23507f2d861"}, - {file = "pytest_cov-7.0.0.tar.gz", hash = "sha256:33c97eda2e049a0c5298e91f519302a1334c26ac65c1a483d6206fd458361af1"}, + {file = "pytest_cov-7.1.0-py3-none-any.whl", hash = "sha256:a0461110b7865f9a271aa1b51e516c9a95de9d696734a2f71e3e78f46e1d4678"}, + {file = "pytest_cov-7.1.0.tar.gz", hash = "sha256:30674f2b5f6351aa09702a9c8c364f6a01c27aae0c1366ae8016160d1efc56b2"}, ] [package.dependencies] @@ -683,25 +684,26 @@ testing = ["process-tests", "pytest-xdist", "virtualenv"] [[package]] name = "requests" -version = "2.32.5" +version = "2.33.0" description = "Python HTTP for Humans." optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" groups = ["main"] files = [ - {file = "requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6"}, - {file = "requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf"}, + {file = "requests-2.33.0-py3-none-any.whl", hash = "sha256:3324635456fa185245e24865e810cecec7b4caf933d7eb133dcde67d48cee69b"}, + {file = "requests-2.33.0.tar.gz", hash = "sha256:c7ebc5e8b0f21837386ad0e1c8fe8b829fa5f544d8df3b2253bff14ef29d7652"}, ] [package.dependencies] -certifi = ">=2017.4.17" +certifi = ">=2023.5.7" charset_normalizer = ">=2,<4" idna = ">=2.5,<4" -urllib3 = ">=1.21.1,<3" +urllib3 = ">=1.26,<3" [package.extras] socks = ["PySocks (>=1.5.6,!=1.5.7)"] -use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] +test = ["PySocks (>=1.5.6,!=1.5.7)", "pytest (>=3)", "pytest-cov", "pytest-httpbin (==2.1.0)", "pytest-mock", "pytest-xdist"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<8)"] [[package]] name = "urllib3" @@ -723,14 +725,14 @@ zstd = ["backports-zstd (>=1.0.0) ; python_version < \"3.14\""] [[package]] name = "werkzeug" -version = "3.1.6" +version = "3.1.7" description = "The comprehensive WSGI web application library." optional = false python-versions = ">=3.9" groups = ["main"] files = [ - {file = "werkzeug-3.1.6-py3-none-any.whl", hash = "sha256:7ddf3357bb9564e407607f988f683d72038551200c704012bb9a4c523d42f131"}, - {file = "werkzeug-3.1.6.tar.gz", hash = "sha256:210c6bede5a420a913956b4791a7f4d6843a43b6fcee4dfa08a65e93007d0d25"}, + {file = "werkzeug-3.1.7-py3-none-any.whl", hash = "sha256:4b314d81163a3e1a169b6a0be2a000a0e204e8873c5de6586f453c55688d422f"}, + {file = "werkzeug-3.1.7.tar.gz", hash = "sha256:fb8c01fe6ab13b9b7cdb46892b99b1d66754e1d7ab8e542e865ec13f526b5351"}, ] [package.dependencies] diff --git a/app_python/src/router.py b/app_python/src/router.py index 294be6246d..bd9315d8b5 100644 --- a/app_python/src/router.py +++ b/app_python/src/router.py @@ -147,9 +147,21 @@ def index(): def health(): """Health check.""" record_endpoint_call("/health") + return _status_response("healthy") + + +@app.route("/ready") +def readiness(): + """Readiness check.""" + record_endpoint_call("/ready") + return _status_response("ready") + + +def _status_response(status: str): + """Return a shared JSON payload for health-style endpoints.""" return jsonify( { - "status": "healthy", + "status": status, "timestamp": datetime.now(timezone.utc).isoformat(), "uptime_seconds": get_uptime()["seconds"], } diff --git a/app_python/tests/test_endpoints.py b/app_python/tests/test_endpoints.py index 97c217b476..6299a7c1dd 100644 --- a/app_python/tests/test_endpoints.py +++ b/app_python/tests/test_endpoints.py @@ -62,6 +62,7 @@ def test_index_returns_expected_json_structure_and_types(client): route_index = {(endpoint["method"], endpoint["path"]) for endpoint in endpoints} assert ("GET", "/") in route_index assert ("GET", "/health") in route_index + assert ("GET", "/ready") in route_index assert ("GET", "/metrics") in route_index @@ -82,6 +83,23 @@ def test_health_returns_expected_json_structure_and_types(client): assert parsed_timestamp.tzinfo is not None +def test_ready_returns_expected_json_structure_and_types(client): + """GET /ready should report ready status and typed runtime metadata.""" + response = client.get("/ready") + + assert response.status_code == 200 + payload = response.get_json() + assert payload is not None + + assert {"status", "timestamp", "uptime_seconds"} <= payload.keys() + assert payload["status"] == "ready" + assert isinstance(payload["uptime_seconds"], int) + assert payload["uptime_seconds"] >= 0 + + parsed_timestamp = datetime.fromisoformat(payload["timestamp"]) + assert parsed_timestamp.tzinfo is not None + + def test_unknown_endpoint_returns_json_404(client): """Unknown routes should be handled by JSON 404 error handler.""" response = client.get("/definitely-does-not-exist") @@ -117,3 +135,16 @@ def test_health_returns_json_500_when_uptime_probe_fails(client, monkeypatch): "error": "Internal Server Error", "message": "An unexpected error occurred", } + + +def test_ready_returns_json_500_when_uptime_probe_fails(client, monkeypatch): + """GET /ready should return JSON 500 when uptime collection crashes.""" + monkeypatch.setattr(router, "get_uptime", _raise_runtime_error) + + response = client.get("/ready") + + assert response.status_code == 500 + assert response.get_json() == { + "error": "Internal Server Error", + "message": "An unexpected error occurred", + } diff --git a/app_python/tests/test_metrics.py b/app_python/tests/test_metrics.py index ac7da3ad0b..717f9320dc 100644 --- a/app_python/tests/test_metrics.py +++ b/app_python/tests/test_metrics.py @@ -40,6 +40,7 @@ def test_metrics_endpoint_exposes_http_and_application_metrics(client): """Metrics endpoint should expose HTTP RED data and app-specific metrics.""" client.get("/") client.get("/health") + client.get("/ready") client.get("/does-not-exist") response = client.get("/metrics") @@ -58,6 +59,11 @@ def test_metrics_endpoint_exposes_http_and_application_metrics(client): "http_requests_total", {"method": "GET", "endpoint": "/health", "status_code": "200"}, ) + ready_total = _metric_value( + metrics_text, + "http_requests_total", + {"method": "GET", "endpoint": "/ready", "status_code": "200"}, + ) unmatched_total = _metric_value( metrics_text, "http_requests_total", @@ -85,6 +91,7 @@ def test_metrics_endpoint_exposes_http_and_application_metrics(client): assert root_total is not None and root_total >= 1.0 assert health_total is not None and health_total >= 1.0 + assert ready_total is not None and ready_total >= 1.0 assert unmatched_total is not None and unmatched_total >= 1.0 assert root_duration_count is not None and root_duration_count >= 1.0 assert root_in_progress == 0.0 diff --git a/k8s/README.md b/k8s/README.md new file mode 100644 index 0000000000..01f5ed71a6 --- /dev/null +++ b/k8s/README.md @@ -0,0 +1,650 @@ +# Kubernetes Lab 9 + +## Task 1 - Local Kubernetes Setup + +I used `minikube` because it was in Arch Linux extra repo (`kind` is only in AUR), integrates cleanly with the Docker driver, and has more features. + +