Beispiel #1
0
    def sync_app_services(self, tenant, region_name, app_id):
        group_services = base_service.get_group_services_list(
            tenant.tenant_id, region_name, app_id)
        service_ids = []
        if group_services:
            for service in group_services:
                service_ids.append(service["service_id"])

        try:
            region_app_id = region_app_repo.get_region_app_id(
                region_name, app_id)
            body = {"service_ids": service_ids}
            region_api.batch_update_service_app_id(region_name,
                                                   tenant.tenant_name,
                                                   region_app_id, body)
        except RegionApp.DoesNotExist:
            app = group_repo.get_group_by_id(app_id)
            create_body = {
                "app_name": app.group_name,
                "service_ids": service_ids
            }
            bean = region_api.create_application(region_name, tenant,
                                                 create_body)
            req = {
                "region_name": region_name,
                "region_app_id": bean["app_id"],
                "app_id": app_id
            }
            region_app_repo.create(**req)
Beispiel #2
0
    def get_group_service_by_group_id(self, group_id, region_name, team_id, team_name, enterprise_id, query=""):
        group_services_list = base_service.get_group_services_list(team_id, region_name, group_id, query)
        if not group_services_list:
            return []
        service_ids = [service.service_id for service in group_services_list]
        status_list = base_service.status_multi_service(region_name, team_name, service_ids, enterprise_id)
        status_cache = {}
        statuscn_cache = {}
        for status in status_list:
            status_cache[status["service_id"]] = status["status"]
            statuscn_cache[status["service_id"]] = status["status_cn"]
        result = []
        for service in group_services_list:
            service_obj = TenantServiceInfo.objects.filter(service_id=service["service_id"]).first()
            if service_obj:
                service["service_source"] = service_obj.service_source
            service["status_cn"] = statuscn_cache.get(service["service_id"], "未知")
            status = status_cache.get(service["service_id"], "unknow")

            if status == "unknow" and service["create_status"] != "complete":
                service["status"] = "creating"
                service["status_cn"] = "创建中"
            else:
                service["status"] = status_cache.get(service["service_id"], "unknow")
            if service["status"] == "closed" or service["status"] == "undeploy":
                service["min_memory"] = 0
            status_map = get_status_info_map(service["status"])
            service.update(status_map)
            result.append(service)
        return result
Beispiel #3
0
    def build_services(self, user, tenant, region_name, group_id,
                       change_services_map):
        group_services = base_service.get_group_services_list(
            tenant.tenant_id, region_name, group_id)
        change_service_ids = [
            change_service["ServiceID"]
            for change_service in change_services_map.values()
        ]
        if not group_services:
            return []
        service_ids = [
            group_service.get("service_id") for group_service in group_services
        ]
        services = service_repo.get_service_by_service_ids(
            service_ids=service_ids)
        for service in services:
            if service.service_id in change_service_ids:
                # probe = None
                if service.service_source == "third_party":
                    # 数据中心连接创建第三方组件
                    new_service = app_service.create_third_party_service(
                        tenant, service, user.nick_name)
                else:
                    # 数据中心创建组件
                    new_service = app_service.create_region_service(
                        tenant, service, user.nick_name)

                service = new_service
                # 为组件添加默认探针
                if self.is_need_to_add_default_probe(service):
                    code, msg, probe = app_service.add_service_default_porbe(
                        tenant, service)
                    logger.debug("add default probe; code: {}; msg: {}".format(
                        code, msg))
                # 添加组件有无状态标签
                label_service.update_service_state_label(tenant, service)
                # 部署组件
                app_manage_service.deploy(tenant,
                                          service,
                                          user,
                                          group_version=None)

                # 添加组件部署关系
                deploy_repo.create_deploy_relation_by_service_id(
                    service_id=service.service_id)
    def get_group_services_with_build_source(self, tenant, region_name,
                                             group_id):
        group_services = base_service.get_group_services_list(
            tenant.tenant_id, region_name, group_id)
        if not group_services:
            return []
        service_ids = [
            group_service.get("service_id") for group_service in group_services
        ]
        build_infos = base_service.get_build_infos(tenant, service_ids)

        for group_service in group_services:
            group_service["app_name"] = group_service.get("group_name")
            if build_infos.get(group_service["service_id"], None):
                group_service["build_source"] = build_infos[
                    group_service["service_id"]]
                group_service["build_source"]["service_id"] = group_service[
                    "service_id"]
        return group_services
Beispiel #5
0
 def get_group_services_with_build_source(self, tenant, region_name,
                                          group_id):
     group_services = base_service.get_group_services_list(
         tenant.tenant_id, region_name, group_id)
     if not group_services:
         return []
     service_ids = [
         group_service.get("service_id") for group_service in group_services
     ]
     services = service_repo.get_service_by_service_ids(
         service_ids=service_ids)
     for group_service in group_services:
         for service in services:
             if group_service["service_id"] == service.service_id:
                 group_service[
                     "build_source"] = base_service.get_build_info(
                         tenant, service)
                 group_service["build_source"][
                     "service_id"] = service.service_id
     return group_services
Beispiel #6
0
    def get_group_service_by_group_id(self, group_id, region_name, team_id,
                                      team_name, enterprise_id):
        group_services_list = base_service.get_group_services_list(
            team_id=team_id, region_name=region_name, group_id=group_id)
        if group_services_list:
            service_ids = [
                service.service_id for service in group_services_list
            ]
            status_list = base_service.status_multi_service(
                region=region_name,
                tenant_name=team_name,
                service_ids=service_ids,
                enterprise_id=enterprise_id)
            status_cache = {}
            statuscn_cache = {}
            for status in status_list:
                status_cache[status["service_id"]] = status["status"]
                statuscn_cache[status["service_id"]] = status["status_cn"]
            result = []
            for service in group_services_list:
                service["status_cn"] = statuscn_cache.get(
                    service["service_id"], "未知")
                status = status_cache.get(service["service_id"], "unknow")

                if status == "unknow" and service[
                        "create_status"] != "complete":
                    service["status"] = "creating"
                    service["status_cn"] = "创建中"
                else:
                    service["status"] = status_cache.get(
                        service["service_id"], "unknow")
                if service["status"] == "closed" or service[
                        "status"] == "undeploy":
                    service["min_memory"] = 0
                status_map = get_status_info_map(service["status"])
                service.update(status_map)
                result.append(service)
            return result
        else:
            return []
    def build_services(self, user, tenant, region_name, group_id,
                       change_services_map):
        group_services = base_service.get_group_services_list(
            tenant.tenant_id, region_name, group_id)
        change_service_ids = [
            change_service["ServiceID"]
            for change_service in list(change_services_map.values())
        ]
        if not group_services:
            return []
        service_ids = [
            group_service.get("service_id") for group_service in group_services
        ]
        services = service_repo.get_service_by_service_ids(
            service_ids=service_ids)
        result = []
        for service in services:
            if service.service_id in change_service_ids:
                if service.service_source == "third_party":
                    # 数据中心连接创建第三方组件
                    new_service = app_service.create_third_party_service(
                        tenant, service, user.nick_name)
                else:
                    # 数据中心创建组件
                    new_service = app_service.create_region_service(
                        tenant, service, user.nick_name)

                service = new_service
                # 为组件添加默认探针
                if self.is_need_to_add_default_probe(service):
                    code, msg, probe = app_service.add_service_default_porbe(
                        tenant, service)
                    logger.debug("add default probe; code: {}; msg: {}".format(
                        code, msg))
                else:
                    probes = probe_repo.get_service_probe(service.service_id)
                    if probes:
                        for probe in probes:
                            prob_data = {
                                "service_id": service.service_id,
                                "scheme": probe.scheme,
                                "path": probe.path,
                                "port": probe.port,
                                "cmd": probe.cmd,
                                "http_header": probe.http_header,
                                "initial_delay_second":
                                probe.initial_delay_second,
                                "period_second": probe.period_second,
                                "timeout_second": probe.timeout_second,
                                "failure_threshold": probe.failure_threshold,
                                "success_threshold": probe.success_threshold,
                                "is_used": (1 if probe.is_used else 0),
                                "probe_id": probe.probe_id,
                                "mode": probe.mode,
                            }
                            try:
                                res, body = region_api.add_service_probe(
                                    service.service_region, tenant.tenant_name,
                                    service.service_alias, prob_data)
                                if res.get("status") != 200:
                                    logger.debug(body)
                                    probe.delete()
                            except Exception as e:
                                logger.debug("error", e)
                                probe.delete()
                # 添加组件有无状态标签
                label_service.update_service_state_label(tenant, service)
                # 部署组件
                app_manage_service.deploy(tenant,
                                          service,
                                          user,
                                          group_version=None)

                # 添加组件部署关系
                deploy_repo.create_deploy_relation_by_service_id(
                    service_id=service.service_id)
                result.append(service)
                # 为组件创建插件
                build_error_plugin_ids = []
                service_plugins = app_plugin_relation_repo.get_service_plugin_relation_by_service_id(
                    service.service_id)
                for service_plugin in service_plugins:
                    plugin = plugin_repo.get_by_plugin_id(
                        tenant.tenant_id, service_plugin.plugin_id)
                    plugin_version = plugin_repo.get_plugin_buildversion(
                        service_plugin.plugin_id, service_plugin.build_version)
                    # 在数据中心创建插件
                    try:
                        event_id = make_uuid()
                        plugin_version.event_id = event_id
                        image_tag = (plugin_version.image_tag
                                     if plugin_version.image_tag else "latest")
                        plugin_service.create_region_plugin(
                            region_name, tenant, plugin, image_tag=image_tag)
                        ret = plugin_service.build_plugin(
                            region_name, plugin, plugin_version, user, tenant,
                            event_id)
                        plugin_version.build_status = ret.get('bean').get(
                            'status')
                        plugin_version.save()
                    except Exception as e:
                        logger.debug(e)
                    # 为组件开通插件
                    try:
                        region_config = app_plugin_service.get_region_config_from_db(
                            service, service_plugin.plugin_id,
                            service_plugin.build_version)
                        data = dict()
                        data["plugin_id"] = service_plugin.plugin_id
                        data["switch"] = True
                        data["version_id"] = service_plugin.build_version
                        data.update(region_config)
                        region_api.install_service_plugin(
                            region_name, tenant.tenant_name,
                            service.service_alias, data)
                    except region_api.CallApiError as e:
                        logger.debug(e)
                        build_error_plugin_ids.append(service_plugin.plugin_id)
                if build_error_plugin_ids:
                    app_plugin_relation_repo.get_service_plugin_relation_by_service_id(
                        service.service_id).filter(
                            plugin_id__in=build_error_plugin_ids).delete()
                # create service_monitor in region
                service_monitors = service_monitor_repo.get_component_service_monitors(
                    tenant.tenant_id, service.service_id)
                for monitor in service_monitors:
                    req = {
                        "name": monitor.name,
                        "path": monitor.path,
                        "port": monitor.port,
                        "service_show_name": monitor.service_show_name,
                        "interval": monitor.interval
                    }
                    try:
                        region_api.create_service_monitor(
                            tenant.enterprise_id, service.service_region,
                            tenant.tenant_name, service.service_alias, req)
                    except region_api.CallApiError as e:
                        ServiceMonitor.objects.filter(
                            tenant_id=tenant.tenant_id,
                            service_id=service.service_id,
                            name=monitor.name).delete()
                        logger.debug(e)
        return result
Beispiel #8
0
    def build_services(self, user, tenant, region_name, group_id,
                       change_services_map):
        group_services = base_service.get_group_services_list(
            tenant.tenant_id, region_name, group_id)
        change_service_ids = [
            change_service["ServiceID"]
            for change_service in list(change_services_map.values())
        ]
        if not group_services:
            return []
        service_ids = [
            group_service.get("service_id") for group_service in group_services
        ]
        services = service_repo.list_by_component_ids(service_ids=service_ids)
        result = []
        for service in services:
            if service.service_id in change_service_ids:
                if service.service_source == "third_party":
                    # 数据中心连接创建第三方组件
                    new_service = app_service.create_third_party_service(
                        tenant, service, user.nick_name)
                else:
                    # 数据中心创建组件
                    new_service = app_service.create_region_service(
                        tenant, service, user.nick_name)
                service = new_service
                # 部署组件
                app_manage_service.deploy(tenant,
                                          service,
                                          user,
                                          group_version=None)

                # 添加组件部署关系
                deploy_repo.create_deploy_relation_by_service_id(
                    service_id=service.service_id)
                result.append(service)
                # 为组件创建插件
                build_error_plugin_ids = []
                service_plugins = app_plugin_relation_repo.get_service_plugin_relation_by_service_id(
                    service.service_id)
                for service_plugin in service_plugins:
                    plugin = plugin_repo.get_by_plugin_id(
                        tenant.tenant_id, service_plugin.plugin_id)
                    plugin_version = plugin_repo.get_plugin_buildversion(
                        service_plugin.plugin_id, service_plugin.build_version)
                    # 在数据中心创建插件
                    try:
                        event_id = make_uuid()
                        plugin_version.event_id = event_id
                        image_tag = (plugin_version.image_tag
                                     if plugin_version.image_tag else "latest")
                        plugin_service.create_region_plugin(
                            region_name, tenant, plugin, image_tag=image_tag)
                        ret = plugin_service.build_plugin(
                            region_name, plugin, plugin_version, user, tenant,
                            event_id)
                        plugin_version.build_status = ret.get('bean').get(
                            'status')
                        plugin_version.save()
                    except Exception as e:
                        logger.debug(e)
                    # 为组件开通插件
                    try:
                        region_config = app_plugin_service.get_region_config_from_db(
                            service, service_plugin.plugin_id,
                            service_plugin.build_version)
                        data = dict()
                        data["plugin_id"] = service_plugin.plugin_id
                        data["switch"] = True
                        data["version_id"] = service_plugin.build_version
                        data["plugin_cpu"] = service_plugin.min_cpu
                        data["plugin_memory"] = service_plugin.min_memory
                        data.update(region_config)
                        region_api.install_service_plugin(
                            region_name, tenant.tenant_name,
                            service.service_alias, data)
                    except region_api.CallApiError as e:
                        logger.debug(e)
                        build_error_plugin_ids.append(service_plugin.plugin_id)
                if build_error_plugin_ids:
                    app_plugin_relation_repo.get_service_plugin_relation_by_service_id(
                        service.service_id).filter(
                            plugin_id__in=build_error_plugin_ids).delete()
        return result
Beispiel #9
0
    def get(self, request, *args, **kwargs):
        """
        总览 团队信息
        ---
        parameters:
            - name: team_name
              description: 团队名
              required: true
              type: string
              paramType: path
        """
        overview_detail = dict()
        users = team_services.get_team_users(self.team)
        if users:
            user_nums = len(users)
            overview_detail["user_nums"] = user_nums
            team_service_num = service_repo.get_team_service_num_by_team_id(
                team_id=self.team.tenant_id, region_name=self.response_region)
            source = common_services.get_current_region_used_resource(self.team, self.response_region)
            # 获取tcp和http策略数量
            region = region_repo.get_region_by_region_name(self.response_region)
            if not region:
                overview_detail["region_health"] = False
                return Response(general_message(200, "success", "查询成功", bean=overview_detail))
            total_tcp_domain = tcp_domain.get_all_domain_count_by_tenant_and_region(self.team.tenant_id, region.region_id)
            overview_detail["total_tcp_domain"] = total_tcp_domain

            total_http_domain = domain_repo.get_all_domain_count_by_tenant_and_region_id(self.team.tenant_id, region.region_id)
            overview_detail["total_http_domain"] = total_http_domain

            # 获取分享应用数量
            groups = group_repo.get_tenant_region_groups(self.team.tenant_id, region.region_name)
            share_app_num = 0

            batch_create_app_body = []
            if groups:
                for group in groups:
                    share_record = share_repo.get_service_share_record_by_groupid(group_id=group.ID)
                    if share_record and share_record.step == 3:
                        share_app_num += 1

                    try:
                        region_app_repo.get_region_app_id(region.region_name, group.ID)
                    except RegionApp.DoesNotExist:
                        create_app_body = dict()
                        group_services = base_service.get_group_services_list(self.team.tenant_id, region.region_name, group.ID)
                        service_ids = []
                        if group_services:
                            service_ids = [service["service_id"] for service in group_services]
                        create_app_body["app_name"] = group.group_name
                        create_app_body["console_app_id"] = group.ID
                        create_app_body["service_ids"] = service_ids
                        batch_create_app_body.append(create_app_body)

            if len(batch_create_app_body) > 0:
                try:
                    body = {"apps_info": batch_create_app_body}
                    applist = region_api.batch_create_application(region.region_name, self.tenant_name, body)
                    app_list = []
                    if applist:
                        for app in applist:
                            data = RegionApp(
                                app_id=app["app_id"], region_app_id=app["region_app_id"], region_name=region.region_name)
                            app_list.append(data)
                    RegionApp.objects.bulk_create(app_list)
                except Exception as e:
                    logger.exception(e)

            team_app_num = group_repo.get_tenant_region_groups_count(self.team.tenant_id, self.response_region)
            overview_detail["share_app_num"] = share_app_num
            overview_detail["team_app_num"] = team_app_num
            overview_detail["team_service_num"] = team_service_num
            overview_detail["eid"] = self.team.enterprise_id
            overview_detail["team_service_memory_count"] = 0
            overview_detail["team_service_total_disk"] = 0
            overview_detail["team_service_total_cpu"] = 0
            overview_detail["team_service_total_memory"] = 0
            overview_detail["team_service_use_cpu"] = 0
            overview_detail["cpu_usage"] = 0
            overview_detail["memory_usage"] = 0
            if source:
                try:
                    overview_detail["region_health"] = True
                    overview_detail["team_service_memory_count"] = int(source["memory"])
                    overview_detail["team_service_total_disk"] = int(source["disk"])
                    overview_detail["team_service_total_cpu"] = int(source["limit_cpu"])
                    overview_detail["team_service_total_memory"] = int(source["limit_memory"])
                    overview_detail["team_service_use_cpu"] = int(source["cpu"])
                    cpu_usage = 0
                    memory_usage = 0
                    if int(source["limit_cpu"]) != 0:
                        cpu_usage = float(int(source["cpu"])) / float(int(source["limit_cpu"])) * 100
                    if int(source["limit_memory"]) != 0:
                        memory_usage = float(int(source["memory"])) / float(int(source["limit_memory"])) * 100
                    overview_detail["cpu_usage"] = round(cpu_usage, 2)
                    overview_detail["memory_usage"] = round(memory_usage, 2)
                except Exception as e:
                    logger.debug(source)
                    logger.exception(e)
            else:
                overview_detail["region_health"] = False
            return Response(general_message(200, "success", "查询成功", bean=overview_detail))
        else:
            data = {"user_nums": 1, "team_service_num": 0, "total_memory": 0, "eid": self.team.enterprise_id}
            result = general_message(200, "success", "团队信息总览获取成功", bean=data)
            return Response(result, status=200)