Teil I eines minimal Python-TestUseCases für Container basierte Setups

Bei container‑basierten Themen braucht man oft eine „einfache“ API, die man zum Testen des gerade aufgesetzten Setups verwenden kann. Zu Beginn genügt häufig ein „hello‑world“-Container oder eine simple „echo“-App. Später benötigt man jedoch schnell mehr Flexibilität bzw. weitere Zugriffsmöglichkeiten.

Hier kommt Python Flask ins Spiel. Mit dieser Bibliothek kann man extrem schnell Web‑APIs erstellen, mit verhältnismäßig geringem Aufwand containerisieren und deployen. Im ersten Teil dieses Blogs erstellen wir eine einfache Web‑API und erstellen ein Containerimage. Der zweite und dritte Teil beschäftigen sich dann mit Kubernetes und der Gateway-API basierend auf Traefik für diese API.

Durch die Verwendung von Python habe ich die Möglichkeit, Tests auf der zu erstellenden Infrastruktur beliebig auszubauen.

Der folgende Python‑Code app.py stellt unsere API dar: (basiert zum Teil auf https://medium.com/@MetricFire/develop-and-deploy-a-python-api-with-kubernetes-and-docker-part-ii-a31d9c61817) :

import requests
import os
from flask import Flask

app = Flask(__name__)

API_KEY = os.environ['API_KEY']

@app.route('/'
def index() -> str:
    return 'App Works!'

@app.route('/<string:city>/<string:country>')
def weather_by_city(country, city):

    url = 'https://api.openweathermap.org/data/2.5/weather'
    params = dict(
        q=city + "," + country,
        appid= API_KEY,
    )

    response = requests.get(url=url, params=params)
    data = response.json()
    return data

if __name__ == '__main__':
    app.run(host="0.0.0.0", port=5000)

dazu noch der „Pipfile

[requires]

[packages]
flask = '*'
requests = '*'

[dev-packages]
pytest = '*'
pytest-dotenv = '*'

und wir können mit folgendem Code „test_app.py“ auch testen

import pytest
from app import app

@pytest.fixture
def client():
    app.config.update({"TESTING": True})

    with app.test_client() as client:
        yield client

def test_index(client):
    response = client.get("/")
    assert response.status_code == 200
    assert b"App Works!" in response.data

def test_weater_by_city(client):
    response = client.get("/London/uk")
    assert response.status_code == 200
    assert response.json["name"] == "London"

Wir containerisieren mit folgendem „Dockerfile“ bzw. „Containerfile“ und starten unseren Container auf der Commandline. Der API-Key wird gespeichert in der „.env“ Datei und später beim Start des Containers gezogen.

FROM python:3.10-alpine
EXPOSE 5000
RUN pip install pipenv

ADD Pipfile .
ADD Pipfile.lock .
RUN pipenv install --system --deploy --ignore-pipfile

RUN mkdir -p /app

ADD app.py /app
WORKDIR /app

CMD ["python", "app.py"] 
$ podman build -t registry.consol.de/bierenfeld/weather-api .
$ podman run -dit --rm -p 5000:5000 --name weather --env-file .env \
  registry.consol.de/bierenfeld/weather-api

Im zweiten BLOG-Beitrag werden wir das Deployment um ein Kubernetes Manifest erweitern und im dritten Teil mit Hilfe der GatewayAPI eine HttpRoute mit „self signed“ Zertifikat vorschalten.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Nach oben scrollen
WordPress Cookie Hinweis von Real Cookie Banner