Skip to content

Commit

Permalink
Merge pull request #1409 from goodrain/v5.16.0-pre
Browse files Browse the repository at this point in the history
feat: v5.16.0 version
  • Loading branch information
yangkaa authored Nov 30, 2023
2 parents 73cd753 + 0267809 commit e659d60
Show file tree
Hide file tree
Showing 34 changed files with 743 additions and 53 deletions.
1 change: 1 addition & 0 deletions console/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ class AppConstants(object):
DOCKER_COMPOSE = "docker_compose"
DOCKER_IMAGE = "docker_image"
PACKAGE_BUILD = "package_build"
VM_RUN = "vm_run"


class LogConstants(object):
Expand Down
1 change: 1 addition & 0 deletions console/enum/component_enum.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ class ComponentType(Enum):
state_multiple = "state_multiple"
job = "job"
cronjob = "cronjob"
vm = "vm"


def is_state(component_type):
Expand Down
6 changes: 6 additions & 0 deletions console/exception/bcode.py
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,12 @@ def __init__(self):
msg="k8s component name exists", msg_show="组件英文名已存在", status_code=400, error_code=20802)


class ErrVMImageNameExists(ServiceHandleException):
def __init__(self):
super(ErrVMImageNameExists, self).__init__(
msg="vm image name exists", msg_show="镜像名称已存在,请检查已有镜像", status_code=400, error_code=20802)


# 20900 ~ 20999 => app upgrade
class ErrAppUpgradeRecordNotFound(ServiceHandleException):
def __init__(self):
Expand Down
4 changes: 2 additions & 2 deletions console/models/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -958,8 +958,8 @@ class Meta:
db_table = "oauth_service"

name = models.CharField(max_length=32, null=False, unique=True, help_text="oauth服务名称")
client_id = models.CharField(max_length=64, null=False, help_text="client_id")
client_secret = models.CharField(max_length=64, null=False, help_text="client_secret")
client_id = models.CharField(max_length=255, null=False, help_text="client_id")
client_secret = models.CharField(max_length=255, null=False, help_text="client_secret")
redirect_uri = models.CharField(max_length=255, null=False, help_text="redirect_uri")
home_url = models.CharField(max_length=255, null=True, help_text="auth_url")
auth_url = models.CharField(max_length=255, null=True, help_text="auth_url")
Expand Down
7 changes: 5 additions & 2 deletions console/repositories/group.py
Original file line number Diff line number Diff line change
Expand Up @@ -160,17 +160,20 @@ def get_group_by_service_ids(self, service_ids):
sgr_map = {s.service_id: s.group_id for s in sgr}
group_ids = [g.group_id for g in sgr]
groups = ServiceGroup.objects.filter(ID__in=group_ids)
group_map = {g.ID: g.group_name for g in groups}
group_name_map = {g.ID: g.group_name for g in groups}
group_k8s_app_map = {g.ID: g.k8s_app for g in groups}
result_map = {}
for service_id in service_ids:
group_id = sgr_map.get(service_id, None)
group_info = dict()
if group_id:
group_info["group_name"] = group_map.get(group_id, "")
group_info["group_name"] = group_name_map.get(group_id, "")
group_info["group_id"] = group_id
group_info["k8s_app"] = group_k8s_app_map.get(group_id, "")
result_map[service_id] = group_info
else:
group_info["group_name"] = "未分组"
group_info["k8s_app"] = "default"
group_info["group_id"] = -1
result_map[service_id] = group_info
return result_map
Expand Down
3 changes: 2 additions & 1 deletion console/repositories/share_repo.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@ def get_service_list_by_group_id(self, team, group_id):
if not svc_relations:
return []
svc_ids = [svc_rel.service_id for svc_rel in svc_relations]
return TenantServiceInfo.objects.filter(service_id__in=svc_ids).exclude(service_source="third_party")
return TenantServiceInfo.objects.filter(service_id__in=svc_ids).exclude(service_source="third_party").exclude(
service_source="vm_run")

def get_rainbond_cent_app_by_tenant_service_group_id(self, group_id):
rainbond_cent_app = RainbondCenterApp.objects.filter(tenant_service_group_id=group_id).order_by("-create_time").first()
Expand Down
25 changes: 25 additions & 0 deletions console/repositories/virtual_machine.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# -*- coding: utf8 -*-
from www.models.main import VirtualMachineImage


class VirtualMachineImageRepo(object):
def get_vm_images_by_tenant_id(self, tenant_id):
vm_images = VirtualMachineImage.objects.filter(tenant_id=tenant_id)
return vm_images.values()

def get_vm_name_by_tenant_id_image(self, tenant_id, image_url):
vm_images = VirtualMachineImage.objects.filter(tenant_id=tenant_id, image_url=image_url).first()
return vm_images.name

def get_vm_image_url_by_tenant_id_and_name(self, tenant_id, name):
vm_images = VirtualMachineImage.objects.filter(tenant_id=tenant_id, name=name).first()
return vm_images.image_url

def get_vm_image_by_tenant_id_and_name(self, tenant_id, name):
return VirtualMachineImage.objects.filter(tenant_id=tenant_id, name=name)

def delete_vm_image_by_image_url(self, image_url):
return VirtualMachineImage.objects.filter(image_url=image_url).delete()


vm_repo = VirtualMachineImageRepo()
1 change: 1 addition & 0 deletions console/serializer.py
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,7 @@ class TenantServiceUpdateSerilizer(serializers.Serializer):
user_name = serializers.CharField(max_length=255, required=False, allow_blank=True, help_text="拉取仓库需要的用户名")
password = serializers.CharField(max_length=255, required=False, allow_blank=True, help_text="拉取仓库需要的密码")
job_strategy = serializers.CharField(max_length=2047, required=False, help_text="job任务策略")
disk_cap = serializers.IntegerField(required=False, help_text="虚拟机磁盘大小 (G)")


class AppConfigGroupCreateSerilizer(serializers.Serializer):
Expand Down
82 changes: 80 additions & 2 deletions console/services/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
from console.repositories.region_app import region_app_repo
from console.repositories.service_group_relation_repo import \
service_group_relation_repo
from console.services.app_config import label_service
from console.services.app_config import label_service, volume_service
from console.services.app_config.arch_service import arch_service
from console.services.app_config.port_service import AppPortService
from console.services.app_config.probe_service import ProbeService
Expand Down Expand Up @@ -299,6 +299,38 @@ def __init_docker_image_app(self, region):
tenant_service.create_status = "creating"
return tenant_service

def __init_vm_image_app(self, region):
"""
初始化vm image创建的组件默认数据,未存入数据库
"""
tenant_service = TenantServiceInfo()
tenant_service.service_region = region
tenant_service.service_key = "00000"
tenant_service.desc = "vm run application"
tenant_service.category = "app_publish"
tenant_service.setting = ""
tenant_service.extend_method = ComponentType.vm.value
tenant_service.min_node = 1
tenant_service.min_memory = 1024
tenant_service.min_cpu = 1000
tenant_service.inner_port = 0
tenant_service.version = ""
tenant_service.namespace = "goodrain"
tenant_service.update_version = 1
tenant_service.port_type = "multi_outer"
tenant_service.create_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
tenant_service.deploy_version = ""
tenant_service.git_project_id = 0
tenant_service.service_type = "application"
tenant_service.total_memory = 1024
tenant_service.volume_mount_path = ""
tenant_service.host_path = ""
tenant_service.code_from = "image_manual"
tenant_service.language = ""
tenant_service.create_status = "creating"
tenant_service.service_source = "vm_run"
return tenant_service

def create_service_alias(self, service_id):
service_alias = "gr" + service_id[-6:]
svc = service_repo.get_service_by_service_alias(service_alias)
Expand Down Expand Up @@ -345,6 +377,39 @@ def create_docker_run_app(self,

return 200, "创建成功", ts

def create_vm_run_app(self,
region,
tenant,
user,
service_cname,
k8s_component_name,
image="",
arch="amd64",
event_id="",
vm_url=""):
is_pass, msg = self.check_service_cname(tenant, service_cname, region)
if not is_pass:
return 412, msg, None
new_service = self.__init_vm_image_app(region)
new_service.tenant_id = tenant.tenant_id
new_service.service_cname = service_cname
service_id = make_uuid(tenant.tenant_id)
service_alias = self.create_service_alias(service_id)
new_service.service_id = service_id
new_service.service_alias = service_alias
new_service.creater = user.pk
new_service.host_path = "/grdata/tenant/" + tenant.tenant_id + "/service/" + service_id
new_service.k8s_component_name = k8s_component_name if k8s_component_name else service_alias
new_service.image = image
new_service.arch = arch
if vm_url != "":
new_service.git_url = vm_url
if event_id != "":
new_service.git_url = "/grdata/package_build/temp/events/" + event_id
new_service.save()
ts = TenantServiceInfo.objects.get(service_id=new_service.service_id, tenant_id=new_service.tenant_id)
return 200, "创建成功", ts

def __init_third_party_app(self, region):
"""
初始化创建外置组件的默认数据,未存入数据库
Expand Down Expand Up @@ -847,9 +912,22 @@ def add_service_default_porbe(self, tenant, service):
return probe_service.add_service_probe(tenant, service, data)
return 200, "success", None

def update_check_app(self, tenant, service, data):
def update_check_app(self, tenant, service, data, user):

service_source = service_source_repo.get_service_source(tenant.tenant_id, service.service_id)
if service.extend_method == "vm":
volumes = volume_repo.get_service_volumes_with_config_file(service.service_id)
disk_cap = data.get("disk_cap")
if len(volumes) == 0:
settings = {}
settings['volume_capacity'] = disk_cap
volume_service.add_service_volume(
tenant, service, "/disk", "vm-file", "disk", "", settings, user.nick_name, mode=None)
else:
volume = volumes.first()
volume.volume_capacity = disk_cap
volume.save()

service_cname = data.get("service_cname", service.service_cname)
image = data.get("image", service.image)
cmd = data.get("cmd", service.cmd)
Expand Down
45 changes: 41 additions & 4 deletions console/services/app_actions/app_manage.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
from console.repositories.service_backup_repo import service_backup_repo
from console.repositories.share_repo import share_repo
from console.repositories.team_repo import team_repo
from console.repositories.virtual_machine import vm_repo
from console.services.app import app_market_service, app_service
from console.services.app_actions.app_log import AppEventService
from console.services.app_actions.exception import ErrVersionAlreadyExists
Expand Down Expand Up @@ -170,6 +171,38 @@ def start(self, tenant, service, user, oauth_instance):
return 409, "操作过于频繁,请稍后再试"
return 200, "操作成功"

def pause(self, tenant, service, user):
if service.create_status == "complete":
body = dict()
body["operator"] = str(user.nick_name)
body["enterprise_id"] = tenant.enterprise_id
try:
region_api.pause_service(service.service_region, tenant.tenant_name, service.service_alias, body)
logger.debug("user {0} start app !".format(user.nick_name))
except region_api.CallApiError as e:
logger.exception(e)
return 507, "组件异常"
except region_api.CallApiFrequentError as e:
logger.exception(e)
return 409, "操作过于频繁,请稍后再试"
return 200, "操作成功"

def un_pause(self, tenant, service, user):
if service.create_status == "complete":
body = dict()
body["operator"] = str(user.nick_name)
body["enterprise_id"] = tenant.enterprise_id
try:
region_api.un_pause_service(service.service_region, tenant.tenant_name, service.service_alias, body)
logger.debug("user {0} start app !".format(user.nick_name))
except region_api.CallApiError as e:
logger.exception(e)
return 507, "组件异常"
except region_api.CallApiFrequentError as e:
logger.exception(e)
return 409, "操作过于频繁,请稍后再试"
return 200, "操作成功"

def stop(self, tenant, service, user):
if service.create_status == "complete":
body = dict()
Expand Down Expand Up @@ -266,10 +299,11 @@ def deploy(self, tenant, service, user, oauth_instance=None, service_copy_path=N
"lang": service.language,
"cmd": service.cmd,
}
if kind == "build_from_image" or kind == "build_from_market_image":
if kind == "build_from_image" or kind == "build_from_market_image" or kind == "build_from_vm":
body["image_info"] = {
"image_url": service.image,
"cmd": service.cmd,
"vm_image_source": service.git_url,
}
service_source = service_source_repo.get_service_source(service.tenant_id, service.service_id)
if service_source and (service_source.user_name or service_source.password):
Expand Down Expand Up @@ -470,6 +504,8 @@ def __get_service_kind(self, service):
return "build_from_market_slug"
else:
return "build_from_market_image"
elif service.service_source == AppConstants.VM_RUN:
return "build_from_vm"
else:
kind = "build_from_image"
if service.category == "application":
Expand Down Expand Up @@ -522,15 +558,15 @@ def batch_action(self, region_name, tenant, user, action, service_ids, move_grou
elif action == "move":
group_service.sync_app_services(tenant, region_name, move_group_id)
self.move(service, move_group_id)
elif action == "deploy" and service.service_source != "third_party":
elif action == "deploy" and service.service_source != "third_party" and service.service_source != "vm_run":
res, body = region_api.get_cluster_nodes_arch(region_name)
chaos_arch = list(set(body.get("list")))
service.arch = service.arch if service.arch else "amd64"
if service.arch not in chaos_arch:
raise AbortRequest(
"app arch does not match build node arch", "应用架构与构建节点架构不匹配", status_code=404, error_code=404)
self.deploy(tenant, service, user, oauth_instance=oauth_instance)
elif action == "upgrade" and service.service_source != "third_party":
elif action == "upgrade" and service.service_source != "third_party" and service.service_source != "vm_run":
self.upgrade(tenant, service, user, oauth_instance=oauth_instance)
code = 200
msg = "success"
Expand Down Expand Up @@ -922,7 +958,8 @@ def _truncate_service(self, tenant, service, user=None, app=None):
except Exception as e:
logger.exception(e)
pass

if service.create_status != "complete":
vm_repo.delete_vm_image_by_image_url(service.image)
env_var_repo.delete_service_env(tenant.tenant_id, service.service_id)
auth_repo.delete_service_auth(service.service_id)
domain_repo.delete_service_domain(service.service_id)
Expand Down
7 changes: 6 additions & 1 deletion console/services/app_check_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@ def __get_service_region_type(self, service_source):
return "third-party-service"
elif service_source == AppConstants.PACKAGE_BUILD:
return "package_build"
elif service_source == AppConstants.VM_RUN:
return "vm-run"

def check_service(self, tenant, service, is_again, event_id, user=None):
body = dict()
Expand Down Expand Up @@ -100,6 +102,8 @@ def check_service(self, tenant, service, is_again, event_id, user=None):
service_endpoints = service_endpoints_repo.get_service_endpoints_by_service_id(service.service_id).first()
if service_endpoints and service_endpoints.endpoints_type == "discovery":
source_body = service_endpoints.endpoints_info
elif service.service_source == AppConstants.VM_RUN:
source_body = service.git_url

body["username"] = user_name
body["password"] = password
Expand Down Expand Up @@ -197,7 +201,8 @@ def save_service_check_info(self, tenant, service, data):
sid = None
try:
sid = transaction.savepoint()
self.save_service_info(tenant, service, service_info_list[0])
if service.extend_method != "vm":
self.save_service_info(tenant, service, service_info_list[0])
# save service info, checked 表示检测完成
service.create_status = "checked"
service.save()
Expand Down
Loading

0 comments on commit e659d60

Please sign in to comment.