From 9f740cb4cb18d26a2fdc3fe8aa3f04b7898aa6e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E5=90=AF=E8=88=AA?= <101104760+ZhangSetSail@users.noreply.github.com> Date: Fri, 29 Nov 2024 18:13:03 +0800 Subject: [PATCH 1/2] fix: lack of cluster connection logic (#1564) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 张启航 <101104760+ZhangSetSail@users.noreply.github.com> --- console/repositories/helm.py | 34 +++++++++++++++++- console/urls.py | 6 ++-- console/views/adaptor.py | 69 +++++++++++++++++++++++++++++++++++- www/models/main.py | 13 +++++++ 4 files changed, 118 insertions(+), 4 deletions(-) diff --git a/console/repositories/helm.py b/console/repositories/helm.py index b440b0f0f4..1a67a8c9cf 100644 --- a/console/repositories/helm.py +++ b/console/repositories/helm.py @@ -1,4 +1,6 @@ -from www.models.main import HelmRepoInfo +from www.models.main import HelmRepoInfo, TaskEvent +from django.db import IntegrityError +from typing import List class HelmRepo(object): @@ -34,4 +36,34 @@ def update_helm_repo(self, repo_name, repo_url): data[0].save() +class RegionEvent(object): + # 创建 TaskEvent + def create_region_event(self, **params) -> None: + try: + event = TaskEvent(**params) + event.save() # 保存到数据库 + except IntegrityError as e: + # 如果插入重复记录,捕获错误并处理 + raise Exception(f"Error creating TaskEvent: {str(e)}") + + # 列出指定 enterprise_id 和 task_id 的事件 + def list_event(self, eid: str, task_id: str) -> List[TaskEvent]: + return TaskEvent.objects.filter(enterprise_id=eid, task_id=task_id) + + # 更新状态批量更新 TaskEvent 的状态 + def update_status_in_batch(self, event_ids: List[str], status: str) -> None: + try: + TaskEvent.objects.filter(id__in=event_ids).update(status=status) # 批量更新状态 + except IntegrityError as e: + raise Exception(f"Error updating TaskEvent status: {str(e)}") + + # 删除指定 enterprise_id 和 task_id 的事件 + def delete_event(self, eid: str, task_id: str) -> None: + try: + TaskEvent.objects.filter(enterprise_id=eid, task_id=task_id).delete() # 删除相关事件 + except IntegrityError as e: + raise Exception(f"Error deleting TaskEvent: {str(e)}") + + helm_repo = HelmRepo() +region_event = RegionEvent() diff --git a/console/urls.py b/console/urls.py index 9583061e22..f0d0eeb4f3 100644 --- a/console/urls.py +++ b/console/urls.py @@ -5,7 +5,7 @@ import console.utils.perms_route_config as perms from console.captcha.captcha_code import CaptchaView from console.views import app_upgrade -from console.views.adaptor import Appstore, Appstores, AppstoreCharts, AppstoreChart +from console.views.adaptor import Appstore, Appstores, AppstoreCharts, AppstoreChart, HelmRegionInstall from console.views.api_gateway import AppApiGatewayView, AppApiGatewayConvertView from console.views.app_autoscaler import (AppAutoscalerView, AppScalingRecords, ListAppAutoscalerView) from console.views.app_config.app_dependency import (AppDependencyManageView, AppDependencyView, AppNotDependencyView, @@ -1071,5 +1071,7 @@ url(r"proxy/enterprise-server/api/v1/enterprises/(?P[\w\-]+)/appstores/(?P[\w\-]+)/apps$", AppstoreCharts.as_view()), url(r"proxy/enterprise-server/api/v1/enterprises/(?P[\w\-]+)/appstores/(?P[\w\-]+)/templates/(?P[\w\-]+)/versions/(?P[\d\.]+)$", - AppstoreChart.as_view()) + AppstoreChart.as_view()), + url(r"proxy/enterprise-server/api/v1/enterprises/(?P[\w\-]+)/tasks/helm_region_install$", + HelmRegionInstall.as_view()), ] diff --git a/console/views/adaptor.py b/console/views/adaptor.py index 03d0303e30..557977b8bf 100644 --- a/console/views/adaptor.py +++ b/console/views/adaptor.py @@ -1,4 +1,5 @@ import base64 +import json import os import tarfile import tempfile @@ -6,8 +7,9 @@ import requests import yaml from requests.auth import HTTPBasicAuth +from rest_framework import status -from console.repositories.helm import helm_repo +from console.repositories.helm import helm_repo, region_event from console.views.base import JWTAuthApiView from rest_framework.response import Response @@ -138,3 +140,68 @@ def get(self, request, enterprise_id, name, chart_name, version, *args, **kwargs except tarfile.TarError: return Response({"code": 500, "msg": "invalid tgz", "msg_show": "无法解析 tgz 文件"}, status=500) + +class HelmRegionInstall(JWTAuthApiView): + def get(self, request, enterprise_id, *args, **kwargs): + """ + 获取 Helm 安装区域事件信息 + """ + try: + # 根据企业ID和任务类型查询事件 + events = region_event.list_event(eid=enterprise_id, task_id="helm_install_region") + + if events.exists(): + event = events.first() + try: + # 反序列化事件消息 + event_data = json.loads(event.message) + response_data = { + "create_status": True, + "token": event_data.get("token"), + "api_host": event_data.get("api_host") + } + except json.JSONDecodeError as e: + return Response({"detail": "Error decoding event message"}, status=status.HTTP_400_BAD_REQUEST) + else: + response_data = {"create_status": False} + return Response(response_data, status=status.HTTP_200_OK) + + except Exception as e: + return Response({"detail": str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) + + def post(self, request, enterprise_id, *args, **kwargs): + """ + 初始化 Helm 安装区域事件 + """ + try: + token = request.data.get('token', "") + api_host = request.data.get('api_host', "") + event_data = { + "token": token, + "api_host": api_host, + } + # 创建新的事件 + message = json.dumps(event_data) + event = { + "task_id": "helm_install_region", + "enterprise_id": enterprise_id, + "message": message, + } + region_event.create_region_event(**event) + + response_data = {"create_status": True} + return Response(response_data, status=status.HTTP_201_CREATED) + + except Exception as e: + return Response({"detail": str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) + + def delete(self, request, enterprise_id, *args, **kwargs): + """ + 删除 Helm 安装区域事件 + """ + try: + # 删除事件 + region_event.delete_event(enterprise_id=enterprise_id, task_id="helm_install_region") + return Response({"detail": "Event deleted successfully"}, status=status.HTTP_204_NO_CONTENT) + except Exception as e: + return Response({"detail": str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) diff --git a/www/models/main.py b/www/models/main.py index 5832175508..89c2d7ac87 100644 --- a/www/models/main.py +++ b/www/models/main.py @@ -946,3 +946,16 @@ class Meta: tenant_id = models.CharField(max_length=32, help_text="租户id") name = models.CharField(max_length=64, help_text="镜像名称") image_url = models.CharField(max_length=200, help_text="镜像地址") + + +class TaskEvent(BaseModel): + class Meta: + db_table = 'task_event' + + task_id = models.CharField(max_length=255) # 对应 TaskID + enterprise_id = models.CharField(max_length=255) # 对应 EnterpriseID + step_type = models.CharField(max_length=255) # 对应 StepType + message = models.CharField(max_length=512) # 对应 Message + status = models.CharField(max_length=255) # 对应 Status + event_id = models.CharField(max_length=255) # 对应 EventID + reason = models.CharField(max_length=255) # 对应 Reason \ No newline at end of file From f1a01cdcc2fed266deb61bff292dd8d3f6937842 Mon Sep 17 00:00:00 2001 From: Qi Zhang Date: Fri, 29 Nov 2024 18:18:33 +0800 Subject: [PATCH 2/2] fix: quick installation script logical error (#1565) Signed-off-by: Qi Zhang --- script/install-rainbond.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/script/install-rainbond.sh b/script/install-rainbond.sh index c659855f30..544c7ef5e0 100755 --- a/script/install-rainbond.sh +++ b/script/install-rainbond.sh @@ -126,7 +126,7 @@ if ! (docker info &>/dev/null); then fi fi else - if docker ps -a | grep rainbond 2>&1 >/dev/null; then + if docker ps -a --filter "name=^rainbond$" | grep -q "rainbond"; then if [ "$LANG" == "zh_CN.UTF-8" ]; then send_error "rainbond 容器已存在.\n\t- 确保 rainbond 是否在运行.\n\t- 尝试执行 'docker start rainbond' 命令启动.\n\t- 或者你可以选择删除该容器 'docker rm -f rainbond'" exit 1