apiVersion: v1
kind: Namespace
metadata:
  name: shop
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: checkout-code
  namespace: shop
data:
  app.py: |
    import os, sys, time
    from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer
    VERSION = os.environ.get("VERSION", "1")
    cache = []
    if os.environ.get("WARM_CACHE") == "1":
        mb = int(os.environ.get("CACHE_MB", "80"))
        print(f"checkout v{VERSION}: warming product cache ({mb} MB)...", flush=True)
        for i in range(mb):
            cache.append(b"x" * (1024 * 1024))
            if (i + 1) % 20 == 0:
                print(f"  cache loaded {i + 1} MB", flush=True)
                time.sleep(0.2)
    class H(BaseHTTPRequestHandler):
        def do_GET(self):
            body = (f"checkout v{VERSION} ok\n").encode()
            self.send_response(200); self.send_header("Content-Length", str(len(body))); self.end_headers(); self.wfile.write(body)
        def log_message(self, *a): pass
    print(f"checkout v{VERSION} listening on :8080", flush=True)
    ThreadingHTTPServer(("", 8080), H).serve_forever()
  hit.py: |
    import urllib.request, time, sys
    n = int(sys.argv[1]) if len(sys.argv) > 1 else 40
    ok = err = 0; row = ""
    for i in range(n):
        try:
            r = urllib.request.urlopen("http://checkout.shop:8080/", timeout=1.5)
            ok += 1; row += "."
        except Exception as e:
            err += 1; row += "x"
        time.sleep(0.05)
    print("requests: " + row)
    print(f"200 OK: {ok}   errors: {err}   error rate: {100 * err / n:.0f}%")
---
apiVersion: v1
kind: Service
metadata:
  name: checkout
  namespace: shop
spec:
  selector:
    app: checkout
    version: "1"
  ports:
    - port: 8080
      targetPort: 8080
---
apiVersion: v1
kind: Pod
metadata:
  name: storefront
  namespace: shop
  labels:
    app: storefront
spec:
  containers:
    - name: storefront
      image: python:3.12-alpine
      command: ["sleep", "infinity"]
      volumeMounts:
        - name: code
          mountPath: /app
  volumes:
    - name: code
      configMap:
        name: checkout-code
