[gbm-web] Add redirector image



commit 7a4ab651e82cb2d2b74bf5e77c7ed0b9c33f72f1
Author: Bartłomiej Piotrowski <bpiotrowski gnome org>
Date:   Wed Oct 28 20:46:35 2020 +0100

    Add redirector image

 .gitignore                  |  1 +
 .gitlab-ci.yml              | 13 +++++++++
 redirector/Dockerfile       | 11 ++++++++
 redirector/main.py          | 64 +++++++++++++++++++++++++++++++++++++++++++++
 redirector/requirements.txt | 13 +++++++++
 5 files changed, 102 insertions(+)
---
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..bee8a64
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+__pycache__
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 0446a62..9a4ecbb 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -10,3 +10,16 @@ flat-manager:
     - buildah bud -t flat-manager .
     - buildah tag flat-manager $CI_REGISTRY_IMAGE/flat-manager:$CI_COMMIT_SHORT_SHA 
$CI_REGISTRY_IMAGE/flat-manager:latest
     - buildah push $CI_REGISTRY_IMAGE/flat-manager:$CI_COMMIT_SHORT_SHA 
$CI_REGISTRY_IMAGE/flat-manager:latest
+
+redirector:
+  image: 'registry.gitlab.gnome.org/infrastructure/oci-images/buildah:latest'
+  stage: test
+  only:
+    changes:
+      - "redirector/*"
+  script:
+    - cd redirector
+    - buildah login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
+    - buildah bud -t redirector .
+    - buildah tag redirector $CI_REGISTRY_IMAGE/redirector:$CI_COMMIT_SHORT_SHA 
$CI_REGISTRY_IMAGE/redirector:latest
+    - buildah push $CI_REGISTRY_IMAGE/redirector:$CI_COMMIT_SHORT_SHA $CI_REGISTRY_IMAGE/redirector:latest
diff --git a/redirector/Dockerfile b/redirector/Dockerfile
new file mode 100644
index 0000000..ec6e596
--- /dev/null
+++ b/redirector/Dockerfile
@@ -0,0 +1,11 @@
+FROM python:3.8-slim
+
+EXPOSE 8000
+ENV PYTHONPATH=/app
+
+COPY requirements.txt /requirements.txt
+RUN pip install -r /requirements.txt && rm -f /requirements.txt
+
+COPY ./ /app
+
+CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
diff --git a/redirector/main.py b/redirector/main.py
new file mode 100644
index 0000000..30544a4
--- /dev/null
+++ b/redirector/main.py
@@ -0,0 +1,64 @@
+import os.path
+
+import boto3
+from fastapi import FastAPI, Response, status
+from fastapi.responses import RedirectResponse
+from pydantic import BaseSettings
+
+
+class Settings(BaseSettings):
+    aws_access_key_id: str
+    aws_secret_access_key: str
+    bucket_url: str = "https://gnome-build-meta.s3.amazonaws.com";
+    bucket_name: str = "gnome-build-meta"
+    mirror_url: str = "https://download.gnome.org/gnomeos";
+    volume_path: str = "/ftp/pub/GNOME/gnomeos"
+
+
+cfg = Settings()
+app = FastAPI()
+
+
+@app.get("/status")
+def healthcheck():
+    return {"status": "OK"}
+
+
+@app.get("/latest/{filename}")
+def get_nightly(filename: str):
+    if filename.endswith(".iso"):
+        latest_filename = "latest-iso"
+    elif filename.endswith(".img.xz"):
+        latest_filename = "latest-disk"
+    else:
+        return Response(status_code=status.HTTP_404_NOT_FOUND)
+
+    s3 = boto3.resource('s3')
+    latest_file_key = f"nightly/{latest_filename}"
+    obj = s3.Object(cfg.bucket_name, latest_file_key)
+    latest = obj.get()['Body'].read().decode('utf-8')
+
+    response = RedirectResponse(f"{cfg.bucket_url}/{latest}")
+    response.status_code = status.HTTP_301_MOVED_PERMANENTLY
+    return response
+
+
+@app.get("/{version}/{filename}")
+def get_versioned(version: str, filename: str):
+    filepath = f"{cfg.volume_path}/{version}/{filename}"
+
+    # Redirect to mirror if file is available in the FTP volume
+    if os.path.isfile(filepath):
+        response = RedirectResponse(f"{cfg.mirror_url}/{version}/{filename}")
+        response.status_code = status.HTTP_302_FOUND
+        return response
+
+    # Otherwise, redirect to S3
+    if "." in version:
+        folder = "tag"
+    else:
+        folder = "nightly"
+
+    response = RedirectResponse(f"{cfg.bucket_url}/{folder}/{version}/{filename}")
+    response.status_code = status.HTTP_301_MOVED_PERMANENTLY
+    return response
diff --git a/redirector/requirements.txt b/redirector/requirements.txt
new file mode 100644
index 0000000..b3c9f3c
--- /dev/null
+++ b/redirector/requirements.txt
@@ -0,0 +1,13 @@
+boto3==1.16.6
+botocore==1.19.6
+click==7.1.2
+fastapi==0.61.1
+h11==0.11.0
+jmespath==0.10.0
+pydantic==1.7
+python-dateutil==2.8.1
+s3transfer==0.3.3
+six==1.15.0
+starlette==0.13.6
+urllib3==1.25.11
+uvicorn==0.12.2


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]