Skip to content

Commit

Permalink
feat: add reverse dependencies (#1420)
Browse files Browse the repository at this point in the history
* feat: add reverse dependencies
  • Loading branch information
DokiDoki1103 authored Dec 26, 2023
1 parent 6049675 commit 379825b
Show file tree
Hide file tree
Showing 5 changed files with 176 additions and 1 deletion.
6 changes: 6 additions & 0 deletions console/repositories/app_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -366,6 +366,9 @@ class TenantServiceRelationRepository(object):
def get_service_dependencies(self, tenant_id, service_id):
return TenantServiceRelation.objects.filter(tenant_id=tenant_id, service_id=service_id)

def get_service_reverse_dependencies(self, tenant_id, service_id):
return TenantServiceRelation.objects.filter(tenant_id=tenant_id, dep_service_id=service_id)

def get_depency_by_serivce_id_and_dep_service_id(self, tenant_id, service_id, dep_service_id):
deps = TenantServiceRelation.objects.filter(tenant_id=tenant_id, service_id=service_id, dep_service_id=dep_service_id)
if deps:
Expand All @@ -375,6 +378,9 @@ def get_depency_by_serivce_id_and_dep_service_id(self, tenant_id, service_id, de
def add_service_dependency(self, **tenant_service_relation):
return TenantServiceRelation.objects.create(**tenant_service_relation)

def bulk_add_service_dependency(self, service_dependency_list):
return TenantServiceRelation.objects.bulk_create([TenantServiceRelation(**data) for data in service_dependency_list])

def get_dependency_by_dep_service_ids(self, tenant_id, service_id, dep_service_ids):
return TenantServiceRelation.objects.filter(
tenant_id=tenant_id, service_id=service_id, dep_service_id__in=dep_service_ids)
Expand Down
34 changes: 34 additions & 0 deletions console/services/app_config/app_relation_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,19 @@ def get_undependencies(self, tenant, service):
not_dependencies.append(s)
return not_dependencies

# 查找所有的组件,看谁能依赖自己,要排除掉已经依赖自己的组件
def get_reverse_undependencies(self, tenant, service):
# 查找到所有的组件信息
services = service_repo.get_tenant_region_services(service.service_region,
tenant.tenant_id).exclude(service_id=service.service_id)
not_dependencies = []
dep_services = dep_relation_repo.get_service_reverse_dependencies(tenant.tenant_id, service.service_id)
dep_service_ids = [dep.service_id for dep in dep_services]
for s in services:
if s.service_id not in dep_service_ids:
not_dependencies.append(s)
return not_dependencies

def __is_env_duplicate(self, tenant, service, dep_service):
dep_ids = self.__get_dep_service_ids(tenant, service)
attr_names = env_var_repo.get_service_env(tenant.tenant_id, dep_service.service_id).filter(scope="outer").values_list(
Expand Down Expand Up @@ -119,6 +132,27 @@ def __open_port(self, tenant, dep_service, container_port, user_name=''):
if e.status_code != 404:
raise e

def patch_add_service_reverse_dependency(self, tenant, service, be_dep_service_ids, user_name=''):
task = dict()
task["be_dep_service_ids"] = be_dep_service_ids
task["tenant_id"] = tenant.tenant_id
task["dep_service_type"] = service.service_type
task["enterprise_id"] = tenant.enterprise_id
task["operator"] = user_name
region_api.add_service_dependencys(service.service_region, tenant.tenant_name, service.service_alias, task)
res = []
for be_dep_service_id in be_dep_service_ids.split(','):
tenant_service_relation = {
"tenant_id": tenant.tenant_id,
"service_id": be_dep_service_id,
"dep_service_id": service.service_id,
"dep_service_type": service.service_type,
"dep_order": 0,
}
res.append(tenant_service_relation)
data = dep_relation_repo.bulk_add_service_dependency(res)
return [item.to_dict() for item in data]

def add_service_dependency(self, tenant, service, dep_service_id, open_inner=None, container_port=None, user_name=''):
dep_service_relation = dep_relation_repo.get_depency_by_serivce_id_and_dep_service_id(
tenant.tenant_id, service.service_id, dep_service_id)
Expand Down
5 changes: 4 additions & 1 deletion console/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@
from console.cloud.views import ProxyView
from console.views import app_upgrade
from console.views.app_autoscaler import (AppAutoscalerView, AppScalingRecords, ListAppAutoscalerView)
from console.views.app_config.app_dependency import (AppDependencyManageView, AppDependencyView, AppNotDependencyView)
from console.views.app_config.app_dependency import (AppDependencyManageView, AppDependencyView, AppNotDependencyView,
AppDependencyReverseView)
from console.views.app_config.app_domain import (
AppServiceDomainQueryView, AppServiceTcpDomainQueryView, DomainQueryView, DomainView, GatewayCustomConfigurationView,
GetPortView, GetSeniorUrlView, HttpStrategyView, SecondLevelDomainView, ServiceDomainView, ServiceTcpDomainQueryView,
Expand Down Expand Up @@ -493,6 +494,8 @@
# 组件依赖
url(r'^teams/(?P<tenantName>[\w\-]+)/apps/(?P<serviceAlias>[\w\-]+)/dependency$', AppDependencyView.as_view(),
perms.AppDependencyView),
url(r'^teams/(?P<tenantName>[\w\-]+)/apps/(?P<serviceAlias>[\w\-]+)/dependency-reverse$',
AppDependencyReverseView.as_view(), perms.AppDependencyView),
url(r'^teams/(?P<tenantName>[\w\-]+)/apps/(?P<serviceAlias>[\w\-]+)/dependency/(?P<dep_service_id>[\w\-]+)$',
AppDependencyManageView.as_view(), perms.AppDependencyManageView),
url(r'^teams/(?P<tenantName>[\w\-]+)/apps/(?P<serviceAlias>[\w\-]+)/un_dependency$', AppNotDependencyView.as_view(),
Expand Down
119 changes: 119 additions & 0 deletions console/views/app_config/app_dependency.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,125 @@
logger = logging.getLogger("default")


class AppDependencyReverseView(AppBaseView):
@never_cache
def get(self, request, *args, **kwargs):
"""
获取组件可以被依赖但未依赖的组件
---
parameters:
- name: tenantName
description: 租户名
required: true
type: string
paramType: path
- name: serviceAlias
description: 组件别名
required: true
type: string
paramType: path
- name: page
description: 页码
required: false
type: string
paramType: query
- name: page_size
description: 每页数量
required: false
type: string
paramType: query
- name: search_key
description: 搜索关键字
required: false
type: string
paramType: query
- name: condition
description: 模糊搜索条件,按组名还是按组件名 group_name|service_name
required: false
type: string
paramType: query
"""
page_num = int(request.GET.get("page", 1))
page_size = int(request.GET.get("page_size", 25))
search_key = request.GET.get("search_key", None)
condition = request.GET.get("condition", None)
un_dependencies = dependency_service.get_reverse_undependencies(self.tenant, self.service)
service_ids = [s.service_id for s in un_dependencies]
service_group_map = group_service.get_services_group_name(service_ids)
un_dep_list = []
for un_dep in un_dependencies:
dep_service_info = {
"service_cname": un_dep.service_cname,
"service_id": un_dep.service_id,
"service_type": un_dep.service_type,
"service_alias": un_dep.service_alias,
"group_name": service_group_map[un_dep.service_id]["group_name"],
"group_id": service_group_map[un_dep.service_id]["group_id"]
}
if search_key and condition and condition != "group_name" and condition != "service_name":
result = general_message(400, "error", "condition参数错误")
return Response(result, status=400)

if search_key and condition:
if condition == "group_name" and search_key.lower() in service_group_map[
un_dep.service_id]["group_name"].lower():
un_dep_list.append(dep_service_info)
if condition == "service_name" and search_key.lower() in un_dep.service_cname.lower():
un_dep_list.append(dep_service_info)

elif search_key and not condition:
if search_key.lower() in service_group_map[
un_dep.service_id]["group_name"].lower() or search_key.lower() in un_dep.service_cname.lower():
un_dep_list.append(dep_service_info)
elif search_key is None and not condition:
un_dep_list.append(dep_service_info)

rt_list = un_dep_list[(page_num - 1) * page_size:page_num * page_size]
result = general_message(200, "success", "查询成功", list=rt_list, total=len(un_dep_list))
return Response(result, status=result["code"])

@never_cache
def post(self, request, *args, **kwargs):
"""
反向依赖,让其他的组件来依赖自己
---
parameters:
- name: tenantName
description: 租户名
required: true
type: string
paramType: path
- name: serviceAlias
description: 组件别名
required: true
type: string
paramType: path
- name: be_dep_service_id
description: 被依赖的组件的id
required: true
type: string
paramType: form
"""
be_dep_service_ids = request.data.get("be_dep_service_ids", None)
if not be_dep_service_ids:
return Response(general_message(400, "dependency service not specify", "请指明谁要依赖你"), status=400)
if self.service.is_third_party():
raise AbortRequest(msg="third-party components cannot add dependencies", msg_show="第三方组件不能添加依赖组件")
if self.service.service_id in be_dep_service_ids:
raise AbortRequest(msg="components cannot rely on themselves", msg_show="组件不能依赖自己")

# 这一步真的去添加依赖
try:
data = dependency_service.patch_add_service_reverse_dependency(
self.tenant, self.service, be_dep_service_ids=be_dep_service_ids, user_name=self.user.nick_name)
result = general_message(200, "success", "依赖添加成功", list=data)
return Response(result, status=result["code"])
except Exception as e:
logger.error("重复依赖添加失败", e)
result = general_message(400, "error", "依赖添加失败")
return Response(result, status=result["code"])


class AppDependencyView(AppBaseView):
@never_cache
def get(self, request, *args, **kwargs):
Expand Down
13 changes: 13 additions & 0 deletions www/apiclient/regionapi.py
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,19 @@ def add_service_dependency(self, region, tenant_name, service_alias, body):
res, body = self._post(url, self.default_headers, region=region, body=json.dumps(body))
return body

def add_service_dependencys(self, region, tenant_name, service_alias, body):
"""增加组件依赖"""

url, token = self.__get_region_access_info(tenant_name, region)
tenant_region = self.__get_tenant_region_info(tenant_name, region)
# 更新tenant_id 为数据中心tenant_id
body["tenant_id"] = tenant_region.region_tenant_id
url = url + "/v2/tenants/" + tenant_region.region_tenant_name + "/services/" + service_alias + "/dependencys"

self._set_headers(token)
res, body = self._post(url, self.default_headers, region=region, body=json.dumps(body))
return body

def delete_service_dependency(self, region, tenant_name, service_alias, body):
"""取消组件依赖"""

Expand Down

0 comments on commit 379825b

Please sign in to comment.