Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
2c3a7ad
Add mongo helm deployment
Mubangizi Mar 21, 2024
e659f20
add mongo start
Mubangizi Mar 21, 2024
d3aa120
add mongo service
Mubangizi Mar 21, 2024
0679788
Merge pull request #7 from crane-cloud/ft-add-mongo-deployment
Mubangizi Mar 27, 2024
975ac7b
start app with scrip file
Mubangizi May 15, 2024
bd8c5a6
Merge pull request #9 from crane-cloud/ft-use-scripts
Mubangizi May 15, 2024
2b8269c
feat: fix authentication
khalifan-kfan May 16, 2024
d9bac27
ch:disable cors error
khalifan-kfan May 22, 2024
44604dd
Merge pull request #10 from crane-cloud/fx-authentication
khalifan-kfan May 22, 2024
a3cbe7c
fix nginx config
Mubangizi May 23, 2024
4ab5e6e
Merge pull request #11 from crane-cloud/fix-nginx-app
Mubangizi May 23, 2024
519d150
Ch: add pagination
khalifan-kfan May 23, 2024
8730a15
ch: only return one user activities
khalifan-kfan May 23, 2024
3880a51
Merge pull request #12 from crane-cloud/ft-enable-pagination
khalifan-kfan May 23, 2024
fab9fd0
remove helm chart files
Mubangizi May 30, 2024
a1915a8
add gcp actions
Mubangizi May 30, 2024
871fc47
add external network for applogger to belong to
Mubangizi Jun 26, 2024
73b08de
allow any user activities
Mubangizi Jun 27, 2024
60afcb8
allow more filter options
Mubangizi Jun 28, 2024
63d22f2
Merge pull request #14 from crane-cloud/ft-add-activity-feed
Mubangizi Jul 1, 2024
7863ec5
add tags filters
Mubangizi Jul 19, 2024
7c4378d
Merge pull request #15 from crane-cloud/ft-add-tags
Mubangizi Jul 19, 2024
f3f2941
Merge branch 'develop' of https://github.com/crane-cloud/app-logger i…
Mubangizi Sep 26, 2024
a9ad444
use staging namespace
Mubangizi Sep 26, 2024
2ca360a
dont create redis
Mubangizi Sep 26, 2024
274168c
update workflow versions
Mubangizi Oct 4, 2024
c782996
add production workflows
Mubangizi Jan 21, 2025
e5bf76e
update reference branch
Mubangizi Jan 21, 2025
c226562
update worflows
Mubangizi Jan 21, 2025
7b675af
fix poetry issue
Mubangizi Jan 21, 2025
bde612d
update docker poetry package
Mubangizi Jan 21, 2025
c74aa85
fix branches
Mubangizi Jan 21, 2025
9ffd145
Merge pull request #13 from crane-cloud/deploy/gcp
Mubangizi Jan 21, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
130 changes: 130 additions & 0 deletions .github/workflows/prod.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
---
name: Prod

on:
release:
types:
- released
- prereleased

jobs:
build:
outputs:
image: ${{ steps.export.outputs.image }}
tag: ${{ steps.export.outputs.tag }}

runs-on: ubuntu-latest

steps:
- name: Checkout
uses: actions/checkout@v4
with:
ref: main # Reference branch

- name: Install (Buildx)
uses: docker/setup-buildx-action@v3

- name: Login (GCP)
uses: google-github-actions/auth@v2
with:
credentials_json: ${{ secrets.CREDENTIALS_JSON }}

- name: Install (Gcloud)
uses: google-github-actions/setup-gcloud@v1
with:
project_id: crane-cloud-274413
install_components: "gke-gcloud-auth-plugin"

- name: Login (GCR)
run: gcloud auth configure-docker

- id: meta
name: Tag
uses: docker/metadata-action@v3
with:
flavor: |
latest=true
images: gcr.io/crane-cloud-274413/activity-logger
tags: |
type=ref,event=branch
type=ref,event=pr
type=semver,pattern={{version}}
type=semver,pattern={{major}}.{{minor}}
type=sha

- name: Build
uses: docker/build-push-action@v2
with:
cache-from: type=gha
cache-to: type=gha,mode=max
context: .
file: Dockerfile
labels: ${{ steps.meta.outputs.labels }}
push: true
tags: ${{ steps.meta.outputs.tags }}

- id: export
name: Export
uses: actions/github-script@v5
with:
script: |
const metadata = JSON.parse(`${{ steps.meta.outputs.json }}`)
const fullUrl = metadata.tags.find((t) => t.includes(':sha-'))
if (fullUrl == null) {
core.error('Unable to find sha tag of image')
} else {
const tag = fullUrl.split(':')[1]
core.setOutput('image', fullUrl)
core.setOutput('tag', tag)
}

Production:
name: Deploy (Production)

needs:
- build

runs-on: ubuntu-latest

env:
namespace: cranecloud-prod

steps:
- name: Clone
uses: actions/checkout@v2

- name: Login (GCP)
uses: google-github-actions/auth@v2
with:
credentials_json: ${{ secrets.CREDENTIALS_JSON }}

- name: Install (Gcloud)
uses: google-github-actions/setup-gcloud@v1
with:
project_id: crane-cloud-274413
install_components: "gke-gcloud-auth-plugin"

- name: Login (Kubernetes Cluster)
uses: google-github-actions/get-gke-credentials@v1
with:
cluster_name: staging-cluster
location: us-central1-a
project_id: crane-cloud-274413

- name: Add Repo (cranecloud)
run: |
helm repo add cranecloud https://crane-cloud.github.io/helm-charts/

- name: Helm Release
run: |
helm upgrade --install \
activity-logger cranecloud/cranecloud \
--values helm/values.prod.yaml \
--namespace $namespace \
--set image.tag="${{ needs.build.outputs.tag }}" \
--set environment.JWT_SALT="${{ secrets.PRODUCTION_JWT_SALT }}" \
--timeout=300s

- name: Monitor Rollout
run: |
kubectl rollout status deployment/activity-logger --timeout=300s --namespace $namespace
43 changes: 26 additions & 17 deletions .github/workflows/staging.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,10 @@ jobs:

steps:
- name: Checkout
uses: actions/checkout@v2
uses: actions/checkout@v4

- name: Install (Buildx)
uses: docker/setup-buildx-action@v1
uses: docker/setup-buildx-action@v3

- name: Login to Docker Hub
uses: docker/login-action@v2
Expand All @@ -44,7 +44,7 @@ jobs:
type=sha

- name: Build
uses: docker/build-push-action@v2
uses: docker/build-push-action@v5
with:
cache-from: type=gha
cache-to: type=gha,mode=max
Expand All @@ -55,7 +55,7 @@ jobs:

- id: export
name: Export
uses: actions/github-script@v5
uses: actions/github-script@v7
with:
script: |
const metadata = JSON.parse(`${{ steps.meta.outputs.json }}`)
Expand All @@ -72,34 +72,43 @@ jobs:
name: Deploy (Staging)

needs:
- Build
- build

runs-on: ubuntu-latest
env:
namespace: cranecloud-microservice
namespace: cranecloud
image: cranecloud/activity-logger

steps:
- name: Checkout code
uses: actions/checkout@v2
uses: actions/checkout@v4

- uses: azure/k8s-set-context@v1
- name: Login (GCP)
uses: google-github-actions/auth@v2
with:
kubeconfig: ${{ secrets.RENU_KUBECONFIG}}
credentials_json: ${{ secrets.CREDENTIALS_JSON }}

- name: Install kubectl
run: |
sudo apt-get update -y
sudo apt-get install -y kubectl
- name: Install (Gcloud)
uses: google-github-actions/setup-gcloud@v2
with:
project_id: crane-cloud-274413
install_components: "gke-gcloud-auth-plugin"

# - name: Add Repo (cranecloud-backend)
# run: |
# helm repo add cranecloud-backend https://crane-cloud.github.io/helm-charts/
- name: Login (Kubernetes Cluster)
uses: google-github-actions/get-gke-credentials@v2
with:
cluster_name: staging-cluster
location: us-central1-a
project_id: crane-cloud-274413

- name: Add Repo (cranecloud)
run: |
helm repo add cranecloud https://crane-cloud.github.io/helm-charts/

- name: Helm Release
run: |
helm upgrade --install \
activity-logger ./helm/chart \
activity-logger cranecloud/cranecloud \
--values helm/values.staging.yaml \
--namespace $namespace \
--set image.tag="${{ needs.build.outputs.tag }}" \
Expand Down
10 changes: 4 additions & 6 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -6,23 +6,21 @@ ENV DEBIAN_FRONTEND='noninteractive'

RUN apt-get update && apt install -y curl

COPY ./README.md /app/README.md

RUN pip install poetry

ENV PATH="${PATH}:/root/.local/bin"

COPY ./pyproject.toml /app/pyproject.toml

COPY ./poetry.lock /app/poetry.lock

COPY . /app

RUN poetry install

COPY . /app

#for celery to have a different working directory
COPY . /celery-app

EXPOSE 8000

CMD ["poetry", "run", "uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000", "--reload"]
ENTRYPOINT ["sh", "/app/scripts/start.sh"]

125 changes: 83 additions & 42 deletions app/controllers.py
Original file line number Diff line number Diff line change
@@ -1,58 +1,99 @@
from typing import List
from fastapi import HTTPException
from typing import Optional, List
from fastapi import HTTPException, Query, Depends
from app.database import get_collection
from app.model import Activity
from bson import json_util
from bson.objectid import ObjectId
import json

from app.helpers.paginater import paginate
from app.helpers.admin import get_current_user_id
from datetime import datetime
from pydantic import BaseModel


def get_activities(operation: str, status: str, model: str,
a_project_id: str, a_cluster_id: str, a_db_id: str, a_user_id: str,
a_app_id: str, start: str, end: str) -> List[dict]:
try:
filters = {}
all_filters = []
if a_project_id:
all_filters.append({"project_id": a_project_id})
if a_cluster_id:
all_filters.append({"cluster_id": a_cluster_id})
if a_db_id:
all_filters.append({"db_id": a_db_id})
if a_user_id:
all_filters.append({"user_id": a_user_id})
if a_app_id:
all_filters.append({"app_id": a_app_id})
if status:
all_filters.append({"status": status})
if operation:
all_filters.append({"operation": operation})
if model:
all_filters.append({"model": model})
class ActivityQueryParams(BaseModel):
operation: Optional[str] = None
user_id: Optional[str] = None
status: Optional[str] = None
model: Optional[str] = None
general: Optional[bool] = False
a_project_id: Optional[str] = None
a_cluster_id: Optional[str] = None
a_db_id: Optional[str] = None
a_user_id: Optional[str] = None
a_app_id: Optional[str] = None
start: Optional[str] = None
end: Optional[str] = None
page: int = Query(1, ge=1)
per_page: int = Query(10, ge=1)

if start:
all_filters.append({
"creation_date": {
"$gte": datetime.strptime(start, "%Y-%m-%d")
}
})
if end:
all_filters.append({
"creation_date": {
"$lte": datetime.strptime(end, "%Y-%m-%d")
}
})
operations: Optional[List[str]] = None
models: Optional[List[str]] = None
statuses: Optional[List[str]] = None
user_ids: Optional[List[str]] = None
project_ids: Optional[List[str]] = None
a_tag_ids: Optional[List[str]] = None

if all_filters:
filters["$and"] = all_filters

results = get_collection().find(filters)
def get_activities(query_params: ActivityQueryParams, current_user_id: str = Depends(get_current_user_id)) -> dict:
try:
filters = {"user_id": current_user_id}
if query_params.general:
del filters["user_id"]
if query_params.user_id and query_params.general:
filters["user_id"] = query_params.user_id
if query_params.operation:
filters["operation"] = query_params.operation
if query_params.status:
filters["status"] = query_params.status
if query_params.model:
filters["model"] = query_params.model
if query_params.a_project_id:
filters["a_project_id"] = query_params.a_project_id
if query_params.a_cluster_id:
filters["a_cluster_id"] = query_params.a_cluster_id
if query_params.a_db_id:
filters["a_db_id"] = query_params.a_db_id
if query_params.a_user_id:
filters["a_user_id"] = query_params.a_user_id
if query_params.a_app_id:
filters["a_app_id"] = query_params.a_app_id
if query_params.start:
start_date = datetime.strptime(query_params.start, "%Y-%m-%d")
filters.setdefault("creation_date", {}).update(
{"$gte": start_date})
if query_params.end:
end_date = datetime.strptime(query_params.end, "%Y-%m-%d")
filters.setdefault("creation_date", {}).update({"$lte": end_date})

# multiple filters
if query_params.operations:
filters["operation"] = {"$in": query_params.operations}
if query_params.models:
filters["model"] = {"$in": query_params.models}
if query_params.statuses:
filters["status"] = {"$in": query_params.statuses}
if query_params.a_tag_ids:
filters["a_tag_ids"] = {"$in": query_params.a_tag_ids}
if query_params.user_ids:
user_id_filter = {"user_id": {"$in": query_params.user_ids}}
filters = {"$or": [user_id_filter, filters]}
results = get_collection().find(
filters).sort("creation_date", -1).skip(
query_params.per_page * (query_params.page - 1)).limit(query_params.per_page)

serialized_results = json.loads(json_util.dumps(results))
serialized_results = [json.loads(
json_util.dumps(result)) for result in results]
pagination_meta_data, paginated_items = paginate(
serialized_results, per_page=query_params.per_page, page=query_params.page)

return serialized_results
return {
"status": "success",
"data": {
"pagination": pagination_meta_data,
"activity": paginated_items
}
}

except Exception as e:
print(e)
Expand Down
Loading
Loading