def post(self, request, *args, **kwargs):
        """
        分享插件
        TODO 此功能暂时不全
        """
        result = {}

        try:
            data = json.loads(request.body)
            plugin_id = data.get("plugin_id", None)
            plugin_version = data.get("build_version", None)
            share_verion = data.get("share_verion", plugin_version)
            region = self.request.COOKIES.get('region')
            if not plugin_id:
                return JsonResponse(general_message(400, "params error",
                                                    "参数异常"),
                                    status=400)
            base_info = plugin_svc.get_tenant_plugin_by_plugin_id(
                self.tenant, plugin_id)
            pbv = plugin_svc.get_tenant_plugin_version_by_plugin_id_and_version(
                self.tenant, plugin_id, plugin_version)
            image = ""
            config = plugin_svc.get_plugin_config(self.tenant, plugin_id,
                                                  plugin_version)
            config_group = json.dumps(config["config_group"])
            plugin_share_svc.create_share_info(self.tenant, self.user.user_id,
                                               base_info, pbv, share_verion,
                                               image, config_group)

            result = general_message(200, "success", "操作成功")
        except Exception as e:
            logger.exception(e)
            result = error_message()
        return JsonResponse(result, status=result["code"])
Exemple #2
0
    def post(self, request, plugin_id, build_version, *args, **kwargs):
        """构建插件"""
        result = {}
        try:
            config = json.loads(request.body)
            update_info = config.get("update_info", None)
            pbv = plugin_svc.get_tenant_plugin_version_by_plugin_id_and_version(
                self.tenant, self.plugin_id, build_version)
            if not pbv:
                return JsonResponse(general_message(404, "plugin not found",
                                                    "插件不存在"),
                                    status=404)
            if pbv.plugin_version_status == "fixed":
                return JsonResponse(general_message(
                    403, "current version is fixed", "该版本已固定,不能构建"),
                                    status=403)
            if pbv.build_status == "building":
                return JsonResponse(general_message(403, "too offen",
                                                    "构建中,请稍后再试"),
                                    status=403)

            if update_info:
                pbv.update_info = update_info
                pbv.save()

            region = self.request.COOKIES.get('region')
            event_id = make_uuid()
            base_info = plugin_svc.get_tenant_plugin_by_plugin_id(
                self.tenant, self.plugin_id)
            try:
                plugin_svc.build_plugin(region, self.tenant, event_id,
                                        self.plugin_id, build_version,
                                        base_info.origin)
                pbv.build_status = "building"
                logger.debug("plugin build status is {}".format(
                    pbv.build_status))
                pbv.event_id = event_id
                pbv.save()
                bean = {"event_id": event_id}
                result = general_message(200, "success", "操作成功", bean=bean)
            except Exception as e:
                logger.exception(e)
                result = general_message(500, "region invoke error", "操作失败")
        except Exception as e:
            logger.exception(e)
            result = error_message()
        return JsonResponse(result, status=result["code"])
Exemple #3
0
 def get(self, request, plugin_id, *args, **kwargs):
     result = {}
     region = self.request.COOKIES.get('region')
     try:
         base_info = plugin_svc.get_tenant_plugin_by_plugin_id(
             self.tenant, plugin_id)
         data = base_info.to_dict()
         pbvs = plugin_svc.get_tenant_plugin_versions(
             region, self.tenant, plugin_id)
         if len(pbvs) != 0:
             pbv = pbvs[0]
             data.update(pbv.to_dict())
         result = general_message(200, "success", "查询成功", bean=data)
     except Exception as e:
         logger.exception(e)
         result = error_message()
     return JsonResponse(result, status=result["code"])
Exemple #4
0
 def put(self, request, plugin_id, build_version, *args, **kwargs):
     """更新指定版本的插件信息"""
     result = {}
     try:
         data = json.loads(request.body)
         pbv = plugin_svc.get_tenant_plugin_version_by_plugin_id_and_version(
             self.tenant, plugin_id, build_version)
         if not pbv:
             return JsonResponse(general_message(404, "plugin not found",
                                                 "该版本插件不存在"),
                                 status=404)
         base_info = plugin_svc.get_tenant_plugin_by_plugin_id(
             self.tenant, plugin_id)
         plugin_alias = data.get("plugin_alias", base_info.plugin_alias)
         update_info = data.get("update_info", pbv.update_info)
         build_cmd = data.get("build_cmd", pbv.build_cmd)
         image_tag = data.get("image_tag", pbv.image_tag)
         code_version = data.get("code_version", pbv.code_version)
         min_memory = data.get("min_memory", pbv.min_memory)
         region = self.request.COOKIES.get('region')
         min_cpu = plugin_svc.calculate_cpu(region, int(min_memory))
         update_params = {
             "min_memory": min_memory,
             "build_cmd": build_cmd,
             "update_info": update_info,
             "min_cpu": min_cpu,
             "code_version": code_version,
             "image_tag": image_tag
         }
         # 更新数据
         new_pbv = plugin_svc.update_plugin_version_by_unique_key(
             self.tenant, plugin_id, build_version, **update_params)
         base_info.plugin_alias = plugin_alias
         base_info.save()
         bean = new_pbv.to_dict()
         result = general_message(200, "success", "操作成功", bean=bean)
     except Exception as e:
         logger.exception(e)
         result = error_message()
     return JsonResponse(result, status=result["code"])
 def get(self, request, plugin_id, *args, **kwargs):
     context = self.get_context()
     try:
         context["pluginStatus"] = "active"
         build_version = request.GET.get("build_version", None)
         context["plugin_id"] = plugin_id
         base_info = plugin_svc.get_tenant_plugin_by_plugin_id(
             self.tenant, plugin_id)
         if not base_info:
             return HttpResponse("插件不存在", status=404)
         build_version_info = plugin_svc.get_tenant_plugin_version_by_plugin_id_and_version(
             self.tenant, plugin_id, build_version)
         context["base_info"] = base_info
         context["build_version_info"] = build_version_info
         context["web_socket_url"] = self.get_ws_url(
             settings.EVENT_WEBSOCKET_URL[self.response_region],
             "event_log")
         logger.debug(context["web_socket_url"])
     except Exception as e:
         logger.exception(e)
     return TemplateResponse(self.request, "www/plugin/config_plugin.html",
                             context)
Exemple #6
0
    def get(self, request, plugin_id, build_version, *args, **kwargs):
        """获取某版本插件配置"""
        result = {}
        try:
            region = self.request.COOKIES.get('region')
            # 获取插件最新的配置信息
            base_info = plugin_svc.get_tenant_plugin_by_plugin_id(
                self.tenant, plugin_id)
            if not base_info:
                return JsonResponse(general_message(404, "plugin not exist",
                                                    "插件不存在"),
                                    status=404)

            data = plugin_svc.get_plugin_config(self.tenant, plugin_id,
                                                build_version)
            web_socket_url = self.get_ws_url(
                settings.EVENT_WEBSOCKET_URL[region], "event_log")
            data["web_socket_url"] = web_socket_url
            result = general_message(200, "success", "查询成功", bean=data)
        except Exception as e:
            logger.exception(e)
            result = error_message()
        return JsonResponse(data=result, status=result["code"])
    def get(self, request, plugin_id, *args, **kwargs):
        result = {}
        try:
            # 获取插件最新的配置信息
            build_version = request.GET.get("build_version", None)
            base_info = plugin_svc.get_tenant_plugin_by_plugin_id(
                self.tenant, plugin_id)
            if not base_info:
                return JsonResponse({"msg": "插件不存在"}, status=404)
            if not build_version:
                pbv = plugin_svc.get_tenant_plugin_version_by_plugin_id_and_version(
                    self.tenant, plugin_id)
                build_version = pbv.build_version

            data = plugin_svc.get_plugin_config(self.tenant, plugin_id,
                                                build_version)
            web_socket_url = self.get_ws_url(
                settings.EVENT_WEBSOCKET_URL[self.response_region],
                "event_log")
            data["web_socket_url"] = web_socket_url
            result = general_message(200, "success", "查询成功", bean=data)
        except Exception as e:
            result = error_message()
        return JsonResponse(data=result, status=result["code"])
Exemple #8
0
    def post(self, request, plugin_id, *args, **kwargs):
        """创建插件新版本"""
        result = {}
        try:
            region = self.request.COOKIES.get('region')
            pbv = plugin_svc.get_tenant_plugin_version_by_plugin_id_and_version(
                self.tenant, plugin_id, None)
            base_info = plugin_svc.get_tenant_plugin_by_plugin_id(
                self.tenant, plugin_id)
            if base_info:
                if base_info.origin != "source_code":
                    return JsonResponse(general_message(
                        403, "market plugin can not create new version",
                        "云市插件不能创建版本"),
                                        status=403)
            if not pbv:
                return JsonResponse(general_message(
                    403, "current version not exist", "插件不存在任何版本,无法创建"),
                                    status=403)
            if pbv.build_status != "build_success":
                return JsonResponse(general_message(
                    403, "no useable plugin version", "您的插件构建未成功,无法创建新版本"),
                                    status=403)

            plugin_id, new_version = plugin_svc.copy_config_to_new_version(
                self.tenant, self.plugin_id, pbv.build_version)

            pbv.plugin_version_status = "fixed"
            pbv.save()
            bean = {"plugin_id": plugin_id, "new_version": new_version}
            result = general_message(200, "success", "操作成功", bean=bean)

        except Exception as e:
            logger.exception(e)
            result = error_message()
        return JsonResponse(result, status=result["code"])
    def post(self, request, plugin_id, *args, **kwargs):
        result = {}
        build_version = None
        try:
            config = json.loads(request.body)
            min_memory = config["min_memory"]
            build_version = config["build_version"]
            config_group = config['config_group']
            update_info = config['update_info']
            build_cmd = config["build_cmd"]
            image_tag = config.get("image_tag", None)
            code_version = config.get("code_version", None)
            if config_group:
                is_success, msg = plugin_svc.check_config(*config_group)
                if not is_success:
                    result["status"] = "failure"
                    result["msg"] = msg
                    return JsonResponse(result)
            plugin = plugin_svc.get_tenant_plugin_by_plugin_id(
                self.tenant, plugin_id)
            min_cpu = plugin_svc.calculate_cpu(self.response_region,
                                               int(min_memory))
            pbv = plugin_svc.get_tenant_plugin_version_by_plugin_id_and_version(
                self.tenant, plugin_id, build_version)

            if pbv.build_status == "unbuild":
                # 删除原有配置项目
                plugin_svc.delete_config_group_by_group_id_and_version(
                    plugin_id, build_version)
                # 重新创建新配置
                plugin_svc.create_config_group(plugin_id, build_version,
                                               config_group)
                # 更新参数
                update_params = {
                    "min_memory": min_memory,
                    "build_cmd": build_cmd,
                    "update_info": update_info
                }
                plugin_svc.update_plugin_version_by_unique_key(
                    self.tenant, plugin_id, build_version, **update_params)
                build_version = pbv.build_version
            else:
                # 重新创建新的数据
                new_version = make_uuid()[:6] + datetime.datetime.now(
                ).strftime('%Y%m%d%H%M%S')
                if plugin.build_source == "dockerfile":
                    code_version = config.get("code_version", "master")
                if plugin.build_source == "image":
                    image_tag = config.get("image", "lastest")
                new_pbv = plugin_svc.create_plugin_build_version(
                    self.response_region, pbv.plugin_id, pbv.tenant_id,
                    self.user.user_id, update_info, new_version, "unbuild",
                    min_memory, min_cpu, build_cmd, image_tag, code_version)

                plugin_svc.create_config_group(plugin_id,
                                               new_pbv.build_version,
                                               config_group)
                build_version = new_version
            bean = {"plugin_id": plugin_id, "build_version": build_version}
            result = general_message(200, "success", "查询成功", bean=bean)

        except Exception as e:
            logger.exception(e)
            result = error_message()
        return JsonResponse(result, status=result["code"])
    def get(self, request, *args, **kwargs):
        self.response_region = self.service.service_region
        self.tenant_region = TenantRegionInfo.objects.get(
            tenant_id=self.service.tenant_id,
            region_name=self.service.service_region)
        context = self.get_context()
        context["tenantName"] = self.tenantName
        context['serviceAlias'] = self.serviceAlias
        fr = request.GET.get("fr", "deployed")
        context["fr"] = fr
        # 判断是否社区版云帮
        context["community"] = False
        if sn.instance.is_private():
            context["community"] = True
        try:
            regionBo = rpmManager.get_work_region_by_name(self.response_region)
            memory_post_paid_price = regionBo.memory_trial_price  # 内存按需使用价格
            disk_post_paid_price = regionBo.disk_trial_price  # 磁盘按需使用价格
            net_post_paid_price = regionBo.net_trial_price  # 网络按需使用价格
            if self.service.category == "application":
                # forbidden blank page
                if self.service.code_version is None or self.service.code_version == "" or (
                        self.service.git_project_id == 0
                        and self.service.git_url is None):
                    codeRepositoriesService.initRepositories(
                        self.tenant, self.user, self.service, "gitlab_new", "",
                        "", "master")
                    self.service = TenantServiceInfo.objects.get(
                        service_id=self.service.service_id)

                if ServiceCreateStep.objects.filter(
                        service_id=self.service.service_id,
                        tenant_id=self.tenant.tenant_id).count() > 0:
                    app_step = ServiceCreateStep.objects.get(
                        service_id=self.service.service_id,
                        tenant_id=self.tenant.tenant_id).app_step
                    logger.debug("create service step" + str(app_step))
                    if app_step == 2:
                        codeRepositoriesService.codeCheck(self.service)
                        return self.redirect_to(
                            '/apps/{0}/{1}/app-waiting/'.format(
                                self.tenant.tenant_name,
                                self.service.service_alias))
                    if app_step == 3:
                        return self.redirect_to(
                            '/apps/{0}/{1}/app-setting/'.format(
                                self.tenant.tenant_name,
                                self.service.service_alias))
                    if app_step == 4:
                        return self.redirect_to(
                            '/apps/{0}/{1}/app-language/'.format(
                                self.tenant.tenant_name,
                                self.service.service_alias))
            elif self.service.category == 'app_publish':
                # 市场安装
                if ServiceCreateStep.objects.filter(
                        service_id=self.service.service_id,
                        tenant_id=self.tenant.tenant_id).count() > 0:
                    return self.redirect_to(
                        '/apps/{0}/{1}/deploy/setting/'.format(
                            self.tenantName, self.serviceAlias))

            # service_consume_detail_list = TenantConsumeDetail.objects.filter(tenant_id=self.tenant.tenant_id,
            #                                                                  service_id=self.service.service_id).order_by("-ID")
            # last_hour_cost = None
            # if len(service_consume_detail_list) > 0:
            #     last_hour_cost = service_consume_detail_list[0]
            # if last_hour_cost is not None:
            #     last_hour_cost.memory_fee = round(
            #         last_hour_cost.memory / 1024 * memory_post_paid_price * last_hour_cost.node_num, 2)
            #     last_hour_cost.disk_fee = round(last_hour_cost.disk / 1024 * disk_post_paid_price, 2)
            #     last_hour_cost.net_fee = round(last_hour_cost.net / 1024 * net_post_paid_price, 2)
            #     last_hour_cost.total_fee = last_hour_cost.disk_fee + last_hour_cost.memory_fee + last_hour_cost.net_fee
            #     context["last_hour_cost"] = last_hour_cost
            context['is_tenant_free'] = (self.tenant.pay_type == "free")

            context["tenantServiceInfo"] = self.service
            context["myAppStatus"] = "active"
            context["perm_users"] = self.get_user_perms()
            context[
                "totalMemory"] = self.service.min_node * self.service.min_memory
            context["tenant"] = self.tenant
            context["region_name"] = self.service.service_region
            # context["websocket_uri"] = settings.WEBSOCKET_URL[self.service.service_region]
            context["event_websocket_uri"] = self.make_event_ws_uri(
                settings.EVENT_WEBSOCKET_URL[self.service.service_region])
            context["monitor_websocket_uri"] = self.make_monitor_ws_uri(
                settings.EVENT_WEBSOCKET_URL[self.service.service_region])
            context["wild_domain"] = settings.WILD_DOMAINS[
                self.service.service_region]
            if ServiceGroupRelation.objects.filter(
                    service_id=self.service.service_id).count() > 0:
                gid = ServiceGroupRelation.objects.get(
                    service_id=self.service.service_id).group_id
                context["group_id"] = gid
            else:
                context["group_id"] = -1
            service_domain = False
            if TenantServicesPort.objects.filter(
                    service_id=self.service.service_id,
                    is_outer_service=True,
                    protocol='http').exists():
                context["hasHttpServices"] = True
                service_domain = True
            is_public_cloud = (sn.instance.cloud_assistant == "goodrain"
                               and (not sn.instance.is_private()))
            http_port_str = settings.WILD_PORTS[self.response_region]
            if not is_public_cloud:
                # 如果不为公有云
                http_port_str = settings.WILD_PORTS["cloudbang"]
            context['http_port_str'] = ":" + http_port_str

            service_attach_info = None
            try:
                service_attach_info = ServiceAttachInfo.objects.get(
                    tenant_id=self.tenant.tenant_id,
                    service_id=self.service.service_id)
                attachManage = ServiceAttachInfoManage()
                if not attachManage.is_during_monthly_payment(
                        service_attach_info):
                    if attachManage.is_need_to_update(service_attach_info,
                                                      self.service.min_memory,
                                                      self.service.min_node):
                        service_attach_info.min_memory = self.service.min_memory
                        service_attach_info.min_node = self.service.min_node
                        service_attach_info.save()
            except ServiceAttachInfo.DoesNotExist:
                pass
            if service_attach_info is None:
                service_attach_info = self.generate_service_attach_info()

            now = datetime.datetime.now()
            if service_attach_info.buy_end_time < now:
                if service_attach_info.memory_pay_method == "prepaid" or service_attach_info.disk_pay_method == "prepaid":
                    service_attach_info.disk_pay_method = "postpaid"
                    service_attach_info.memory_pay_method = "postpaid"
                    service_attach_info.save()

            if fr == "deployed":
                if self.service.service_type == 'mysql':
                    service_manager = self.get_manage_app(http_port_str)
                    context['service_manager'] = service_manager

                # inner service
                innerPorts = {}
                tsps = TenantServicesPort.objects.filter(
                    service_id=self.service.service_id, is_inner_service=True)
                for tsp in tsps:
                    innerPorts[tsp.container_port] = True

                if len(tsps) > 0:
                    context["hasInnerServices"] = True

                envMap = {}
                envVarlist = TenantServiceEnvVar.objects.filter(
                    service_id=self.service.service_id,
                    scope__in=("outer", "both"),
                    is_change=False)
                if len(envVarlist) > 0:
                    for evnVarObj in envVarlist:
                        arr = envMap.get(evnVarObj.service_id)
                        if arr is None:
                            arr = []
                        arr.append(evnVarObj)
                        envMap[evnVarObj.service_id] = arr
                context["envMap"] = envMap

                containerPortList = []
                opend_service_port_list = TenantServicesPort.objects.filter(
                    service_id=self.service.service_id, is_inner_service=True)
                if len(opend_service_port_list) > 0:
                    for opend_service_port in opend_service_port_list:
                        containerPortList.append(
                            opend_service_port.container_port)
                context["containerPortList"] = containerPortList

                if self.service.code_from != "image_manual":
                    baseservice = ServiceInfo.objects.get(
                        service_key=self.service.service_key,
                        version=self.service.version)
                    if baseservice.update_version != self.service.update_version:
                        context["updateService"] = True

                context["docker_console"] = settings.MODULES["Docker_Console"]
                context["publish_service"] = settings.MODULES[
                    "Publish_Service"]

                # get port type
                context["visit_port_type"] = self.service.port_type
                if self.service.port_type == "multi_outer":
                    context[
                        "http_outer_service_ports"] = self.get_outer_service_port(
                        )

                service_consume_list = ServiceConsume.objects.filter(
                    tenant_id=self.tenant.tenant_id,
                    service_id=self.service.service_id).order_by("-ID")
                last_hour_cost = None
                if service_consume_list:
                    last_hour_cost = service_consume_list[0]
                context["last_hour_cost"] = last_hour_cost

            elif fr == "relations":
                # service relationships
                tsrs = TenantServiceRelation.objects.filter(
                    service_id=self.service.service_id)
                relationsids = []
                if len(tsrs) > 0:
                    for tsr in tsrs:
                        relationsids.append(tsr.dep_service_id)
                context["serviceIds"] = relationsids
                # service map
                map = {}
                sids = []
                tenantServiceList = baseService.get_service_list(
                    self.tenant.pk,
                    self.user,
                    self.tenant.tenant_id,
                    region=self.response_region)
                for tenantService in tenantServiceList:
                    if TenantServicesPort.objects.filter(
                            service_id=tenantService.service_id,
                            is_inner_service=True).exists():
                        sids.append(tenantService.service_id)
                        if tenantService.service_id != self.service.service_id:
                            map[tenantService.service_id] = tenantService
                    if tenantService.service_id in relationsids:
                        map[tenantService.service_id] = tenantService
                context["serviceMap"] = map
                # env map
                envMap = {}
                envVarlist = TenantServiceEnvVar.objects.filter(
                    service_id__in=sids, scope__in=("outer", "both"))
                for evnVarObj in envVarlist:
                    arr = envMap.get(evnVarObj.service_id)
                    if arr is None:
                        arr = []
                    arr.append(evnVarObj)
                    envMap[evnVarObj.service_id] = arr
                context["envMap"] = envMap

                # 当前服务的连接信息
                currentEnvMap = {}
                currentEnvVarlist = TenantServiceEnvVar.objects.filter(
                    service_id=self.service.service_id,
                    scope__in=("outer", "both"),
                    is_change=False)
                if len(currentEnvVarlist) > 0:
                    for evnVarObj in currentEnvVarlist:
                        arr = currentEnvMap.get(evnVarObj.service_id)
                        if arr is None:
                            arr = []
                        arr.append(evnVarObj)
                        currentEnvMap[evnVarObj.service_id] = arr
                context["currentEnvMap"] = currentEnvMap

                containerPortList = []
                opend_service_port_list = TenantServicesPort.objects.filter(
                    service_id=self.service.service_id, is_inner_service=True)
                if len(opend_service_port_list) > 0:
                    for opend_service_port in opend_service_port_list:
                        containerPortList.append(
                            opend_service_port.container_port)
                context["containerPortList"] = containerPortList

                # add dir mnt
                mtsrs = TenantServiceMountRelation.objects.filter(
                    service_id=self.service.service_id)
                mntsids = []
                if len(mtsrs) > 0:
                    for mnt in mtsrs:
                        mntsids.append(mnt.dep_service_id)
                context["mntsids"] = mntsids

            elif fr == "statistic":
                context['statistic_type'] = self.statistic_type
                if self.service.service_type in ('mysql', ):
                    context['ws_topic'] = '{0}.{1}.statistic'.format(
                        self.tenant.tenant_id[-12:],
                        self.service.service_id[-12:])
                else:
                    # context['ws_topic'] = '{0}.{1}.statistic'.format(self.tenant.tenant_name, self.service.service_alias)
                    if self.service.port_type == "multi_outer":
                        context['ws_topic'] = '{0}.{1}.statistic'.format(
                            self.tenant.tenant_name,
                            self.service.service_alias)
                        # tsps = TenantServicesPort.objects.filter(service_id=self.service.service_id, is_outer_service=True)
                        # for tsp in tsps:
                        #     context['ws_topic'] = '{0}.{1}_{2}.statistic'.format(self.tenant.tenant_name, self.service.service_alias, str(tsp.container_port))
                    else:
                        context['ws_topic'] = '{0}.{1}.statistic'.format(
                            self.tenant.tenant_name,
                            self.service.service_alias)
                service_port_list = TenantServicesPort.objects.filter(
                    tenant_id=self.tenant.tenant_id,
                    service_id=self.service.service_id)
                has_outer_port = False
                for p in service_port_list:
                    if (p.is_outer_service and p.protocol
                            == "http") or self.service.service_type == 'mysql':
                        has_outer_port = True
                        break
                context["has_outer_port"] = has_outer_port
                has_analyis_plugin = "no"
                tenant_service_relations = plugin_svc.get_tenant_service_plugin_relation(
                    self.service.service_id)
                for re in tenant_service_relations:
                    plugin = plugin_svc.get_tenant_plugin_by_plugin_id(
                        self.tenant, re.plugin_id)
                    if plugin.category == "analyst-plugin:perf" or plugin.category == "performance_analysis":
                        has_analyis_plugin = "yes"

                context["has_analyis_plugin"] = has_analyis_plugin

            elif fr == "log":
                pass
            elif fr == "settings":
                nodeList = []
                memoryList = []
                port_changeable = self.service.code_from
                context["port_changeable"] = port_changeable
                try:
                    sem = ServiceExtendMethod.objects.get(
                        service_key=self.service.service_key,
                        app_version=self.service.version)
                    nodeList.append(sem.min_node)
                    next_node = sem.min_node + sem.step_node
                    while (next_node <= sem.max_node):
                        nodeList.append(next_node)
                        next_node = next_node + sem.step_node

                    num = 1
                    memoryList.append(str(sem.min_memory))
                    next_memory = sem.min_memory * pow(2, num)
                    while (next_memory <= sem.max_memory):
                        memoryList.append(str(next_memory))
                        num = num + 1
                        next_memory = sem.min_memory * pow(2, num)
                except Exception as e:
                    nodeList.append(1)
                    memoryList.append(str(self.service.min_memory))
                    memoryList.append("256")
                    memoryList.append("512")
                    memoryList.append("1024")
                    memoryList.append("2048")
                    memoryList.append("4096")
                    memoryList.append("8192")

                context["nodeList"] = nodeList
                context["memoryList"] = memoryList
                context["memorydict"] = self.memory_choices()
                context["extends_choices"] = self.extends_choices()
                context["add_port"] = settings.MODULES["Add_Port"]
                if custom_config.GITLAB_SERVICE_API:
                    context["git_tag"] = True
                else:
                    context["git_tag"] = False
                context["mnt_share_choices"] = self.mnt_share_choices()
                context[
                    "http_outer_service_ports"] = self.get_outer_service_port(
                    )
                # service git repository
                try:
                    context["httpGitUrl"] = codeRepositoriesService.showGitUrl(
                        self.service)
                    if self.service.code_from == "gitlab_manual":
                        href_url = self.service.git_url
                        if href_url.startswith('git@'):
                            href_url = "http://" + href_url.replace(":",
                                                                    "/")[4:]
                        context["href_url"] = href_url
                except Exception as e:
                    pass
                if service_domain:
                    # service domain
                    # domain_num = ServiceDomain.objects.filter(service_id=self.service.service_id).count()
                    # if domain_num == 1:
                    #     domain = ServiceDomain.objects.get(service_id=self.service.service_id)
                    #     context["serviceDomain"] = domain
                    serviceDomainlist = ServiceDomain.objects.filter(
                        service_id=self.service.service_id)
                    if len(serviceDomainlist) > 0:
                        data = {}
                        for domain in serviceDomainlist:
                            if data.get(domain.container_port) is None:
                                data[domain.container_port] = [
                                    domain.domain_name
                                ]
                            else:
                                data[domain.container_port].append(
                                    domain.domain_name)
                        context["serviceDomainDict"] = data

                port_list = TenantServicesPort.objects.filter(
                    service_id=self.service.service_id)
                outer_port_exist = False
                if len(port_list) > 0:
                    outer_port_exist = reduce(
                        lambda x, y: x or y,
                        [t.is_outer_service for t in list(port_list)])
                context["ports"] = list(port_list)
                context["outer_port_exist"] = outer_port_exist
                # 付费用户或者免费用户的mysql,免费用户的docker
                context[
                    "outer_auth"] = self.tenant.pay_type != "free" or self.service.service_type == 'mysql' or self.service.language == "docker"
                # 付费用户,管理员的application类型服务可以修改port
                context["port_auth"] = (
                    self.tenant.pay_type != "free" or self.user.is_sys_admin
                ) and self.service.service_type == "application"
                context["envs"] = TenantServiceEnvVar.objects.filter(
                    service_id=self.service.service_id,
                    scope__in=("inner", "both")).exclude(container_port=-1)

                # 获取挂载信息,查询
                volume_list = TenantServiceVolume.objects.filter(
                    service_id=self.service.service_id)
                # result_list = []
                # for volume in list(volume_list):
                #     tmp_path = volume.volume_path
                # if tmp_path:
                #     volume.volume_path = tmp_path.replace("/app", "", 1)
                # result_list.append(volume)
                context["volume_list"] = volume_list

                if self.service.code_from is not None and self.service.code_from in (
                        "image_manual"):
                    context["show_git"] = False
                else:
                    context["show_git"] = True

                # 获取组和服务的关系
                sgrs = ServiceGroupRelation.objects.filter(
                    tenant_id=self.tenant.tenant_id,
                    region_name=self.response_region)
                serviceGroupIdMap = {}
                for sgr in sgrs:
                    serviceGroupIdMap[sgr.service_id] = sgr.group_id
                context["serviceGroupIdMap"] = serviceGroupIdMap

                serviceGroupNameMap = {}
                group_list = context["groupList"]
                for group in group_list:
                    serviceGroupNameMap[group.ID] = group.group_name
                context["serviceGroupNameMap"] = serviceGroupNameMap
                # cloud_assistant为goodrain表示为公有云
                context['cloud_assistant'] = sn.instance.cloud_assistant
                # is_private表示为私有云
                context["is_private"] = sn.instance.is_private()
                # 显示镜像构建的应用的镜像名
                if self.service.service_key == "0000" and self.service.language == "docker-image":
                    isrs = ImageServiceRelation.objects.filter(
                        tenant_id=self.tenant.tenant_id,
                        service_id=self.service.service_id)
                    if isrs:
                        isr = isrs[0]
                        context['image_url'] = isr.image_url

            elif fr == "cost":
                # service_attach_info = None
                # try:
                #     service_attach_info = ServiceAttachInfo.objects.get(tenant_id=self.tenant.tenant_id,
                #                                                         service_id=self.service.service_id)
                # except ServiceAttachInfo.DoesNotExist:
                #     pass
                # if service_attach_info is None:
                #     service_attach_info = self.generate_service_attach_info()

                context["service_attach_info"] = service_attach_info
                context[
                    "total_buy_memory"] = service_attach_info.min_memory * service_attach_info.min_node
                context["service"] = self.service
                service_consume_list = ServiceConsume.objects.filter(
                    tenant_id=self.tenant.tenant_id,
                    service_id=self.service.service_id).order_by("-ID")
                last_hour_consume = None
                if len(list(service_consume_list)) > 0:
                    last_hour_consume = list(service_consume_list)[0]
                context["last_hour_consume"] = last_hour_consume
                service_total_memory_fee = Decimal(0)
                service_total_disk_fee = Decimal(0)
                service_total_net_fee = Decimal(0)
                consume_list = list(service_consume_list)
                for service_consume in consume_list:
                    service_consume.memory_pay_method = "postpaid"
                    service_consume.disk_pay_method = "postpaid"
                    if service_attach_info.buy_start_time <= service_consume.time and service_consume.time <= service_attach_info.buy_end_time:
                        if service_attach_info.memory_pay_method == "prepaid":
                            service_consume.memory_pay_method = "prepaid"
                        if service_attach_info.disk_pay_method == "prepaid":
                            service_consume.disk_pay_method = "prepaid"
                    service_total_memory_fee += service_consume.memory_money
                    service_total_disk_fee += service_consume.disk_money
                    service_total_net_fee += service_consume.net_money

                context["service_consume_list"] = consume_list[:24]
                context["service_total_memory_fee"] = service_total_memory_fee
                context["service_total_disk_fee"] = service_total_disk_fee
                context["service_total_net_fee"] = service_total_net_fee

            elif fr == "mnt":
                pass
            elif fr == "expansion":
                pass
            elif fr == "ports":
                pass
            elif fr == "plugin":
                pass
            else:
                return self.redirect_to('/apps/{0}/{1}/detail/'.format(
                    self.tenant.tenant_name, self.service.service_alias))

        except Exception as e:
            logger.exception(e)
        return TemplateResponse(self.request, "www/service_detail.html",
                                context)