From 979fcd298cff36354eeaba099732405788f8beef Mon Sep 17 00:00:00 2001 From: zhenyus Date: Mon, 23 Jun 2025 16:46:06 +0800 Subject: [PATCH] Add DevOps reconciliation models and integrate into deployment service Signed-off-by: zhenyus --- apps/devops/app/common/models/__init__.py | 1 + .../common/models/deployment/deployment.py | 23 +++++++++++--- apps/devops/app/routes/deployment/service.py | 31 +++++++++++++------ 3 files changed, 41 insertions(+), 14 deletions(-) diff --git a/apps/devops/app/common/models/__init__.py b/apps/devops/app/common/models/__init__.py index 20aacb2..10e5320 100644 --- a/apps/devops/app/common/models/__init__.py +++ b/apps/devops/app/common/models/__init__.py @@ -1,5 +1,6 @@ from app.common.models.code_depot.code_depot import CodeDepotDoc from app.common.models.deployment.deployment import Deployment +from app.common.models.deployment.deployment import DevOpsReconcileRequest, DevOpsReconcileOperationType # list of beanie document models, # must add here so that the mongo db collection can be automatically created diff --git a/apps/devops/app/common/models/deployment/deployment.py b/apps/devops/app/common/models/deployment/deployment.py index 4d9a9e1..b47c423 100644 --- a/apps/devops/app/common/models/deployment/deployment.py +++ b/apps/devops/app/common/models/deployment/deployment.py @@ -1,5 +1,7 @@ from datetime import datetime, timedelta -from typing import Literal, List +from typing import Literal, List, Optional +from dataclasses import dataclass +from enum import Enum from beanie import Document from bson import ObjectId @@ -69,8 +71,19 @@ class CheckApplicationLogsResponse(BaseModel): limit: int logs: list[str] +class DevOpsReconcileOperationType(Enum): + START = "start" + TERMINATE = "terminate" + RESTART = "restart" - - - - +@dataclass +class DevOpsReconcileRequest(BaseModel): + operation: DevOpsReconcileOperationType + id: str + devops_proj_id: str + triggered_user_id: str + causes: str + commit_sha256: Optional[str] = None + target_env: Literal["alpha", "prod"] + ttl_controled: bool = False + ttl: int = 10800 \ No newline at end of file diff --git a/apps/devops/app/routes/deployment/service.py b/apps/devops/app/routes/deployment/service.py index 66e13f4..c535a24 100644 --- a/apps/devops/app/routes/deployment/service.py +++ b/apps/devops/app/routes/deployment/service.py @@ -8,7 +8,7 @@ import requests from fastapi import HTTPException, Depends from app.common.config.site_settings import site_settings -from app.common.models import Deployment +from app.common.models import Deployment, DevOpsReconcileRequest, DevOpsReconcileOperationType from app.common.models.code_depot.code_depot import CodeDepotDoc, DepotStatus from app.common.models.deployment.deployment import InitDeploymentRequest, CheckApplicationLogsRequest, \ CheckApplicationLogsResponse @@ -148,15 +148,28 @@ class DeploymentService: ) -> bool: """ Start the deployment - Return true atm, modify calling reconsile service later + Return true atm, modify calling reconcile service later """ - # async with httpx.AsyncClient() as client: - # response = await client.post( - # f"{reconsile_base_url}/api/devops/reconcile", - # json=deployment.model_dump() - # ) - # if response.status_code != 200: - # raise HTTPException(status_code=response.status_code, detail=response.text) + # construct request body + request = DevOpsReconcileRequest( + operation=DevOpsReconcileOperationType.START, + id=deployment.deployment_id, + devops_proj_id=deployment.deployment_project_id, + triggered_user_id=deployment.deployed_by, + causes=deployment.deployment_reason, + target_env=deployment.deployment_target_env, + ttl_controled=True, + ttl=deployment.deployment_ttl_hours, + commit_sha256=deployment.deployment_git_sha256, + ) + # send request to reoncile service + async with httpx.AsyncClient() as client: + response = await client.post( + f"{reconsile_base_url}/api/devops/reconcile", + json=request.model_dump() + ) + if response.status_code != 200: + raise HTTPException(status_code=response.status_code, detail=response.text) return True async def check_application_logs(