Skip to content

Commit

Permalink
feat: installing rainbond app using the command line (#1359)
Browse files Browse the repository at this point in the history
* feat: installing rainbond app using the command line

* fix: template json error

---------

Co-authored-by: 曲源成 <[email protected]>
  • Loading branch information
quyuancheng and 曲源成 authored Jul 24, 2023
1 parent 0e6ace3 commit 4ed649a
Show file tree
Hide file tree
Showing 6 changed files with 144 additions and 3 deletions.
3 changes: 2 additions & 1 deletion console/services/helm_app_yaml.py
Original file line number Diff line number Diff line change
Expand Up @@ -300,7 +300,8 @@ def parse_helm_command(self, command, region_name, tenant):
repo_name = chart.split("/")[0]
chart_name = chart.split("/")[1]
else:
raise AbortRequest("repo_name/chart_name incorrect format", "格式不正确,仓库名称和应用名称之间应用 '/' 划分", status_code=404, error_code=404)
raise AbortRequest(
"repo_name/chart_name incorrect format", "格式不正确,仓库名称和应用名称之间应用 '/' 划分", status_code=404, error_code=404)
repo = helm_repo.get_helm_repo_by_name(repo_name)
if not repo:
raise AbortRequest("helm repo is not exist", "商店不存在,执行 helm repo add 进行添加", status_code=404, error_code=404)
Expand Down
73 changes: 73 additions & 0 deletions console/services/market_app_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,12 @@
import datetime
import json
import logging
import os
import time

# enum
import requests

from console.constants import AppConstants
from console.enum.app import GovernanceModeEnum
from console.enum.component_enum import ComponentType
Expand Down Expand Up @@ -39,6 +42,7 @@
from console.services.market_app.component_group import ComponentGroup
from console.services.plugin import (app_plugin_service, plugin_config_service, plugin_service, plugin_version_service)
from console.services.region_services import region_services
from console.services.share_services import share_service
from console.services.upgrade_services import upgrade_service
from console.services.user_services import user_services
from console.utils.version import compare_version, sorted_versions
Expand Down Expand Up @@ -135,6 +139,75 @@ def get_app_template(self, app_model_key, install_from_cloud, market_name, regio
app_template["arch"] = app_version.arch
return app_template, market_app

def install_app_by_cmd(self, tenant, region, user, app_id, app_model_key, version):
app = group_repo.get_group_by_id(app_id)
if not app:
raise AbortRequest("app not found", "应用不存在", status_code=404, error_code=404)
app_template = self.get_app_template_cmd(app_model_key, version)
if app_template:
share_app = share_service.get_app_by_key(key=app_template["group_key"])
if not share_app:
center_app = {
"app_id": app_template["group_key"],
"app_name": app_template["group_name"],
"create_team": tenant.tenant_name,
"source": "cmd",
"scope": "enterprise",
"pic": "",
"describe": "",
"enterprise_id": tenant.enterprise_id,
"details": "",
"arch": app_template["arch"],
}
self.cmd_create_center_app(**center_app)
share_app = share_service.get_app_by_key(key=app_template["group_key"])
share_service.update_or_create_rainbond_center_app_version(tenant, region, user, share_app.app_id, version,
app_template)
res, body = region_api.get_cluster_nodes_arch(region.region_name)
chaos_arch = list(set(body.get("list")))
template_arch = share_app.arch if share_app.arch else "amd64"
if template_arch not in chaos_arch and len(chaos_arch) < 2:
raise AbortRequest("app arch does not match build node arch", "应用架构与构建节点架构不匹配", status_code=404, error_code=404)

component_group = self._create_tenant_service_group(region.region_name, tenant.tenant_id, app.app_id,
app_template["group_key"], version, app_template["group_name"])
app_upgrade = AppUpgrade(
user.enterprise_id,
tenant,
region,
user,
app,
version,
component_group,
app_template,
False,
"",
is_deploy=True)
app_upgrade.install()
return app_template["group_name"]
return

def get_app_template_cmd(self, app_model_key, version):
market_domain = os.getenv("MARKET_DOMAIN", "https://hub.grapps.cn")
market_id = os.getenv("MARKET_ID", "859a51f9bb3b48b5bfd222e3bef56425")
url = "{0}/app-server/markets/{1}/apps/{2}/version/{3}/cmd".format(market_domain, market_id, app_model_key, version)
res = requests.get(url)
if res.status_code == 200:
cmd = res.json()
template = cmd["cmd"]
arch = cmd["arch"]
if template:
temp = json.loads(template)
temp["arch"] = arch
return temp
else:
err = res.json()
raise AbortRequest(err["msg"], status_code=400, error_code=err["code"])

def cmd_create_center_app(self, **kwargs):
logger.info("begin create center app by cmd")
return RainbondCenterApp(**kwargs).save()

def install_service(self,
tenant,
region_name,
Expand Down
28 changes: 27 additions & 1 deletion console/services/share_services.py
Original file line number Diff line number Diff line change
Expand Up @@ -667,7 +667,7 @@ def get_app_version_by_app_id(self, app_id, is_complete):
def get_app_by_key(self, key):
app = share_repo.get_app_by_key(key)
if app:
return app[0]
return app
else:
return None

Expand Down Expand Up @@ -1312,5 +1312,31 @@ def list_component_k8s_attributes(component_ids):
result[attr.component_id].append(a)
return result

def update_or_create_rainbond_center_app_version(self, tenant, region, user, app_id, version, app_template):
try:
obj = RainbondCenterAppVersion.objects.get(app_id=app_id, version=version)
obj.app_template = json.dumps(app_template)
obj.save()
except RainbondCenterAppVersion.DoesNotExist:
RainbondCenterAppVersion.objects.create(
app_id=app_id,
version=app_template["group_version"],
app_version_info="",
version_alias="",
template_type="",
record_id=0,
share_user=user.user_id,
share_team=tenant.tenant_name,
# group_id=share_record.group_id,
source="local",
scope="enterprise",
app_template=json.dumps(app_template),
template_version="v2",
enterprise_id=tenant.enterprise_id,
region_name=region.region_name,
arch=app_template["arch"],
is_complete=True,
upgrade_time=time.time())


share_service = ShareService()
4 changes: 3 additions & 1 deletion console/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,8 @@
from console.views.center_pool.app_export import CenterAppExportView
from console.views.center_pool.app_import import (CenterAppImportView, CenterAppTarballDirView, EnterpriseAppImportInitView)
from console.views.center_pool.apps import (AppTagCDView, AppVersionUDView, CenterAppCLView, CenterAppUDView, CenterAppView,
LocalComponentLibraryConfigCheck, TagCLView, TagUDView, CenterPluginAppView)
LocalComponentLibraryConfigCheck, TagCLView, TagUDView, CenterPluginAppView,
CmdInstallAppView)
from console.views.center_pool.groupapp_backup import (AllTeamGroupAppsBackupView, GroupAppsBackupExportView,
GroupAppsBackupImportView, GroupAppsBackupStatusView,
GroupAppsBackupView, TeamGroupAppsBackupView)
Expand Down Expand Up @@ -696,6 +697,7 @@
url(r'^plugins$', InternalMarketPluginsView.as_view(), perms.InternalMarketPluginsView),
url(r'^plugins/installable$', InstallableInteralPluginsView.as_view(), perms.InstallableInteralPluginsView),
url(r'^teams/(?P<tenantName>[\w\-]+)/apps/market_create$', CenterAppView.as_view(), perms.CenterAppView),
url(r'^teams/(?P<tenantName>[\w\-]+)/apps/cmd_create$', CmdInstallAppView.as_view(), perms.CmdInstallAppView),
url(r'^teams/(?P<tenantName>[\w\-]+)/apps/plugins$', CenterPluginAppView.as_view()),

# 文件上传
Expand Down
17 changes: 17 additions & 0 deletions console/utils/perms_route_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -2690,6 +2690,23 @@
}
}

CmdInstallAppView = {
"__message": {
"get": {
"perms": []
},
"post": {
"perms": [300002, 400002]
},
"put": {
"perms": []
},
"delete": {
"perms": []
}
}
}

RegionProtocolView = {
"__message": {
"get": {
Expand Down
22 changes: 22 additions & 0 deletions console/views/center_pool/apps.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import datetime
import json
import logging
import re

from console.repositories.app import app_tag_repo
from console.repositories.market_app_repo import rainbond_app_repo
Expand Down Expand Up @@ -130,6 +131,27 @@ def post(self, request, *args, **kwargs):
return Response(general_message(200, "success", "创建成功"), status=200)


class CmdInstallAppView(RegionTenantHeaderView):
@never_cache
def post(self, request, *args, **kwargs):
"""
命令行创建应用
"""
app_id = request.data.get("group_id", -1)
cmd = request.data.get("cmd", "")
app_id_pattern = r"--appID\s+(\S+)"
version_pattern = r"--version\s+(\S+)"
appID_match = re.search(app_id_pattern, cmd)
version_match = re.search(version_pattern, cmd)
if appID_match and version_match:
app_model_key = appID_match.group(1) if appID_match else None
version = version_match.group(1) if version_match else None
market_app_service.install_app_by_cmd(self.tenant, self.region, self.user, app_id, app_model_key, version)
return Response(general_message(200, "success", "创建成功"), status=200)
else:
return Response(general_message(400, "failed", "解析命令失败"), status=200)


class CenterAppCLView(JWTAuthApiView):
@never_cache
def get(self, request, enterprise_id, *args, **kwargs):
Expand Down

0 comments on commit 4ed649a

Please sign in to comment.