Exemplo n.º 1
0
    def create_config_group(self, app_id, config_group_name, config_items,
                            deploy_type, enable, service_ids, region_name,
                            team_name):
        # create application config group
        group_req = {
            "app_id": app_id,
            "config_group_name": config_group_name,
            "deploy_type": deploy_type,
            "enable": enable,
            "region_name": region_name,
            "config_group_id": make_uuid(),
        }

        try:
            app_config_group_repo.get(region_name, app_id, config_group_name)
        except ApplicationConfigGroup.DoesNotExist:
            cgroup = app_config_group_repo.create(**group_req)
            create_items_and_services(cgroup, config_items, service_ids)
            region_app_id = region_app_repo.get_region_app_id(
                region_name, app_id)
            region_api.create_app_config_group(
                region_name, team_name, region_app_id, {
                    "app_id": region_app_id,
                    "config_group_name": config_group_name,
                    "deploy_type": deploy_type,
                    "service_ids": service_ids,
                    "config_items": config_items,
                })
        else:
            raise ErrAppConfigGroupExists
        return self.get_config_group(region_name, app_id, config_group_name)
Exemplo n.º 2
0
    def update_governance_mode(self, tenant, region_name, app_id, governance_mode):
        # update the value of host env. eg. MYSQL_HOST
        component_ids = group_service_relation_repo.list_serivce_ids_by_app_id(tenant.tenant_id, region_name, app_id)

        components = service_repo.list_by_ids(component_ids)
        components = {cpt.component_id: cpt for cpt in components}

        ports = port_repo.list_inner_ports_by_service_ids(tenant.tenant_id, component_ids)
        ports = {port.service_id + str(port.container_port): port for port in ports}

        envs = env_var_repo.list_envs_by_component_ids(tenant.tenant_id, component_ids)
        for env in envs:
            if not env.is_host_env():
                continue
            cpt = components.get(env.service_id)
            if not cpt:
                continue
            port = ports.get(env.service_id + str(env.container_port))
            if not port:
                continue
            if governance_mode == GovernanceModeEnum.KUBERNETES_NATIVE_SERVICE.name:
                env.attr_value = port.k8s_service_name if port.k8s_service_name else cpt.service_alias + "-" + str(
                    port.container_port)
            else:
                env.attr_value = "127.0.0.1"
        env_var_repo.bulk_update(envs)
        group_repo.update_governance_mode(tenant.tenant_id, region_name, app_id, governance_mode)

        region_app_id = region_app_repo.get_region_app_id(region_name, app_id)
        self.sync_envs(tenant.tenant_name, region_name, region_app_id, components.values(), envs)
        region_api.update_app(region_name, tenant.tenant_name, region_app_id, {"governance_mode": governance_mode})
Exemplo n.º 3
0
 def update_config_group(self, region_name, app_id, config_group_name,
                         config_items, enable, service_ids, team_name):
     group_req = {
         "enable":
         enable,
         "update_time":
         time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())),
     }
     try:
         cgroup = app_config_group_repo.get(region_name, app_id,
                                            config_group_name)
     except ApplicationConfigGroup.DoesNotExist:
         raise ErrAppConfigGroupNotFound
     else:
         app_config_group_repo.update(region_name, app_id,
                                      config_group_name, **group_req)
         app_config_group_item_repo.delete(cgroup.config_group_id)
         app_config_group_service_repo.delete(cgroup.config_group_id)
         create_items_and_services(cgroup, config_items, service_ids)
         region_app_id = region_app_repo.get_region_app_id(
             cgroup.region_name, app_id)
         region_api.update_app_config_group(
             cgroup.region_name, team_name, region_app_id,
             cgroup.config_group_name, {
                 "service_ids": service_ids,
                 "config_items": config_items,
             })
     return self.get_config_group(region_name, app_id, config_group_name)
Exemplo n.º 4
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)
Exemplo n.º 5
0
    def update_governance_mode(tenant, region_name, app_id, governance_mode):
        # update the value of host env. eg. MYSQL_HOST
        service_ids = group_service_relation_repo.list_serivce_ids_by_app_id(
            tenant.tenant_id, region_name, app_id)
        ports = port_repo.list_inner_ports_by_service_ids(
            tenant.tenant_id, service_ids)
        for port in ports:
            env = env_var_repo.get_service_host_env(tenant.tenant_id,
                                                    port.service_id,
                                                    port.container_port)
            service = service_repo.get_service_by_tenant_and_id(
                tenant.tenant_id, port.service_id)
            if governance_mode == GovernanceModeEnum.KUBERNETES_NATIVE_SERVICE.name:
                env.attr_value = port.k8s_service_name if port.k8s_service_name else service.service_alias + "-" + str(
                    port.container_port)
            else:
                env.attr_value = "127.0.0.1"
            env.save()
            if service.create_status == "complete":
                body = {
                    "env_name": env.attr_name,
                    "env_value": env.attr_value,
                    "scope": env.scope
                }
                region_api.update_service_env(service.service_region,
                                              tenant.tenant_name,
                                              service.service_alias, body)

        group_repo.update_governance_mode(tenant.tenant_id, region_name,
                                          app_id, governance_mode)
        region_app_id = region_app_repo.get_region_app_id(region_name, app_id)
        region_api.update_app(region_name, tenant.tenant_name, region_app_id,
                              {"governance_mode": governance_mode})
Exemplo n.º 6
0
 def get_app_status(tenant, region_name, app_id):
     region_app_id = region_app_repo.get_region_app_id(region_name, app_id)
     status = region_api.get_app_status(region_name, tenant.tenant_name,
                                        region_app_id)
     if status.get("status") == "NIL":
         status["status"] = None
     return status
Exemplo n.º 7
0
 def _delete_app(tenant_name, region_name, app_id):
     group_repo.delete_group_by_pk(app_id)
     upgrade_repo.delete_app_record_by_group_id(app_id)
     try:
         region_app_id = region_app_repo.get_region_app_id(region_name, app_id)
     except RegionApp.DoesNotExist:
         return
     region_api.delete_app(region_name, tenant_name, region_app_id)
Exemplo n.º 8
0
    def install_app(self, tenant, region_name, app_id, overrides):
        if overrides:
            overrides = self._parse_overrides(overrides)

        region_app_id = region_app_repo.get_region_app_id(region_name, app_id)
        region_api.install_app(region_name, tenant.tenant_name, region_app_id, {
            "overrides": overrides,
        })
Exemplo n.º 9
0
 def get_app_status(tenant, region_name, app_id):
     region_app_id = region_app_repo.get_region_app_id(region_name, app_id)
     status = region_api.get_app_status(region_name, tenant.tenant_name, region_app_id)
     if status.get("status") == "NIL":
         status["status"] = None
     overrides = status.get("overrides", [])
     if overrides:
         status["overrides"] = [{override.split("=")[0]: override.split("=")[1]} for override in overrides]
     return status
Exemplo n.º 10
0
 def _delete_app(tenant_name, region_name, app_id):
     group_repo.delete_group_by_pk(app_id)
     upgrade_repo.delete_app_record_by_group_id(app_id)
     try:
         region_app_id = region_app_repo.get_region_app_id(region_name, app_id)
     except RegionApp.DoesNotExist:
         return
     keys = []
     migrate_record = migrate_repo.get_by_original_group_id(app_id)
     if migrate_record:
         for record in migrate_record:
             keys.append(record.restore_id)
     region_api.delete_app(region_name, tenant_name, region_app_id, {"etcd_keys": keys})
Exemplo n.º 11
0
    def create_third_party_service(self, tenant, service, user_name):
        data = self.__init_third_party_data(tenant, service, user_name)
        # env var
        envs_info = env_var_repo.get_service_env(tenant.tenant_id,
                                                 service.service_id).values(
                                                     'container_port', 'name',
                                                     'attr_name', 'attr_value',
                                                     'is_change', 'scope')
        if envs_info:
            data["envs_info"] = list(envs_info)
        # 端口
        ports = port_repo.get_service_ports(tenant.tenant_id,
                                            service.service_id)
        ports_info = ports.values('container_port', 'mapping_port', 'protocol',
                                  'port_alias', 'is_inner_service',
                                  'is_outer_service', 'k8s_service_name')

        for port_info in ports_info:
            port_info["is_inner_service"] = False
            port_info["is_outer_service"] = False

        if ports_info:
            data["ports_info"] = list(ports_info)

        # endpoints
        endpoints = service_endpoints_repo.get_service_endpoints_by_service_id(
            service.service_id).first()
        if endpoints:
            if endpoints.endpoints_type == "static":
                eps = json.loads(endpoints.endpoints_info)
                validate_endpoints_info(eps)
            endpoints_dict = dict()
            endpoints_dict[endpoints.endpoints_type] = endpoints.endpoints_info
            data["endpoints"] = endpoints_dict
        data["kind"] = service.service_source

        # etcd keys
        data["etcd_key"] = service.check_uuid
        # 数据中心创建
        logger.debug('-----------data-----------_>{0}'.format(data))
        app_id = service_group_relation_repo.get_group_id_by_service(service)
        region_app_id = region_app_repo.get_region_app_id(
            service.service_region, app_id)
        data["app_id"] = region_app_id
        region_api.create_service(service.service_region, tenant.tenant_name,
                                  data)
        # 将组件创建状态变更为创建完成
        service.create_status = "complete"
        self.__handle_service_ports(tenant, service, ports)
        service.save()
        return service
Exemplo n.º 12
0
 def get_monitor_metrics(region_name,
                         tenant,
                         target,
                         app_id="",
                         component_id=""):
     region_app_id = ""
     if app_id:
         region_app_id = region_app_repo.get_region_app_id(
             region_name, app_id)
     data = region_api.get_monitor_metrics(region_name, tenant, target,
                                           region_app_id, component_id)
     if not data:
         return None
     return data.get("list", [])
Exemplo n.º 13
0
    def __init__(self,
                 tenant,
                 region_name,
                 app: ServiceGroup,
                 component_group: ComponentGroup,
                 new_components,
                 update_components,
                 component_deps,
                 volume_deps,
                 plugins: [Plugin],
                 plugin_deps,
                 plugin_configs,
                 new_plugins: [Plugin] = None,
                 config_groups=None,
                 config_group_items=None,
                 config_group_components=None):
        self.tenant = tenant
        self.tenant_id = tenant.tenant_id
        self.region_name = region_name
        self.app_id = app.app_id
        self.app = app
        self.component_group = component_group
        self.upgrade_group_id = component_group.upgrade_group_id
        self.version = component_group.version
        self.region_app_id = region_app_repo.get_region_app_id(
            self.region_name, self.app_id)
        self.governance_mode = app.governance_mode
        self.new_components = new_components
        self.update_components = update_components
        self.component_ids = [
            cpt.component.component_id for cpt in self._components()
        ]

        # plugins
        self.plugins = plugins
        self.new_plugins = new_plugins
        self.plugin_deps = plugin_deps
        self.plugin_configs = plugin_configs

        # component dependencies
        self.component_deps = component_deps if component_deps else []
        # volume dependencies
        self.volume_deps = volume_deps if volume_deps else []
        # config groups
        self.config_groups = config_groups if config_groups else []
        self.config_group_items = config_group_items if config_group_items else []
        self.config_group_components = config_group_components if config_group_components else []
Exemplo n.º 14
0
    def delete_config_group(self, region_name, team_name, app_id,
                            config_group_name):
        cgroup = app_config_group_repo.get(region_name, app_id,
                                           config_group_name)
        region_app_id = region_app_repo.get_region_app_id(
            cgroup.region_name, app_id)
        try:
            region_api.delete_app_config_group(cgroup.region_name, team_name,
                                               region_app_id,
                                               cgroup.config_group_name)
        except region_api.CallApiError as e:
            if e.status != 404:
                raise e

        app_config_group_item_repo.delete(cgroup.config_group_id)
        app_config_group_service_repo.delete(cgroup.config_group_id)
        app_config_group_repo.delete(cgroup.region_name, app_id,
                                     config_group_name)
Exemplo n.º 15
0
    def update_group(self, tenant, region_name, app_id, app_name, note="", username=None, overrides="", version="", revision=0):
        # check app id
        if not app_id or not str.isdigit(app_id) or int(app_id) < 0:
            raise ServiceHandleException(msg="app id illegal", msg_show="应用ID不合法")
        # check username
        if username:
            try:
                data = {"username": username}
                user_repo.get_user_by_username(username)
                group_repo.update(app_id, **data)
                return
            except ErrUserNotFound:
                raise ServiceHandleException(msg="user not exists", msg_show="用户不存在,请选择其他应用负责人", status_code=404)
        # check app name
        if app_name:
            self.check_app_name(tenant, region_name, app_name)
        if overrides:
            overrides = self._parse_overrides(overrides)

        group = group_repo.get_group_by_unique_key(tenant.tenant_id, region_name, app_name)
        if group and int(group.ID) != int(app_id):
            raise ServiceHandleException(msg="app already exists", msg_show="应用名{0}已存在".format(app_name))
        data = {
            "note": note,
        }
        if app_name:
            data["group_name"] = app_name
        if version:
            data["version"] = version

        group_repo.update(app_id, **data)

        region_app_id = region_app_repo.get_region_app_id(region_name, app_id)
        region_api.update_app(region_name, tenant.tenant_name, region_app_id, {
            "overrides": overrides,
            "version": version,
            "revision": revision,
        })
Exemplo n.º 16
0
    def update_kubernetes_services(self, tenant, region_name, app_id,
                                   k8s_services):
        service_ids = group_service_relation_repo.list_serivce_ids_by_app_id(
            tenant.tenant_id, region_name, app_id)
        for k8s_service in k8s_services:
            # check k8s_service_name
            try:
                # whether k8s_service_name exists
                port_repo.get_by_k8s_service_name(
                    tenant.tenant_id, k8s_service["k8s_service_name"])
                try:
                    # k8s_service_name belong to the current k8s_service?
                    port_repo.check_k8s_service_name(
                        tenant.tenant_id, k8s_service["service_id"],
                        k8s_service["port"], k8s_service["k8s_service_name"])
                except TenantServicesPort.DoesNotExist:
                    raise ErrK8sServiceNameExists
            except TenantServicesPort.DoesNotExist:
                pass

            # check if the given k8s_services belong to the app based on app_id
            if k8s_service["service_id"] not in service_ids:
                raise AbortRequest("service({}) not belong to app({})".format(
                    k8s_service["service_id"], app_id))

        # bulk_update is only available after django 2.2
        for k8s_service in k8s_services:
            port_repo.update_port(
                tenant.tenant_id, k8s_service["service_id"],
                k8s_service["port"], **{
                    "port_alias": k8s_service["port_alias"],
                    "k8s_service_name": k8s_service["k8s_service_name"],
                })
            k8s_service["container_port"] = k8s_service["port"]

        region_app_id = region_app_repo.get_region_app_id(region_name, app_id)
        region_api.update_app_ports(region_name, tenant.tenant_name,
                                    region_app_id, k8s_services)
Exemplo n.º 17
0
 def list_services(tenant_name, region_name, app_id):
     region_app_id = region_app_repo.get_region_app_id(region_name, app_id)
     services = region_api.list_app_services(region_name, tenant_name,
                                             region_app_id)
     return services if services else []
Exemplo n.º 18
0
 def parse_services(region_name: str, tenant_name: str, app_id: int, values: str):
     region_app_id = region_app_repo.get_region_app_id(region_name, app_id)
     return region_api.parse_app_services(region_name, tenant_name, region_app_id, values)
Exemplo n.º 19
0
 def list_releases(region_name: str, tenant_name: str, app_id: int):
     region_app_id = region_app_repo.get_region_app_id(region_name, app_id)
     return region_api.list_app_releases(region_name, tenant_name, region_app_id)
Exemplo n.º 20
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)
Exemplo n.º 21
0
 def get_detect_process(tenant, region_name, app_id):
     region_app_id = region_app_repo.get_region_app_id(region_name, app_id)
     process = region_api.get_app_detect_process(region_name, tenant.tenant_name, region_app_id)
     return process
Exemplo n.º 22
0
    def create_region_service(self,
                              tenant,
                              service,
                              user_name,
                              do_deploy=True,
                              dep_sids=None):
        data = self.__init_create_data(tenant, service, user_name, do_deploy,
                                       dep_sids)
        service_dep_relations = dep_relation_repo.get_service_dependencies(
            tenant.tenant_id, service.service_id)
        # 依赖
        depend_ids = [{
            "dep_order": dep.dep_order,
            "dep_service_type": dep.dep_service_type,
            "depend_service_id": dep.dep_service_id,
            "service_id": dep.service_id,
            "tenant_id": dep.tenant_id
        } for dep in service_dep_relations]
        data["depend_ids"] = depend_ids
        # 端口
        ports = port_repo.get_service_ports(tenant.tenant_id,
                                            service.service_id)
        ports_info = ports.values('container_port', 'mapping_port', 'protocol',
                                  'port_alias', 'is_inner_service',
                                  'is_outer_service', 'k8s_service_name')

        for port_info in ports_info:
            port_info["is_inner_service"] = False
            port_info["is_outer_service"] = False

        if ports_info:
            data["ports_info"] = list(ports_info)
        # 环境变量
        envs_info = env_var_repo.get_service_env(tenant.tenant_id,
                                                 service.service_id).values(
                                                     'container_port', 'name',
                                                     'attr_name', 'attr_value',
                                                     'is_change', 'scope')
        if envs_info:
            data["envs_info"] = list(envs_info)
        # 持久化目录
        volume_info = volume_repo.get_service_volumes_with_config_file(
            service.service_id)
        if volume_info:
            volume_list = []
            for volume in volume_info:
                volume_info = model_to_dict(volume)
                if volume.volume_type == "config-file":
                    config_file = volume_repo.get_service_config_file(
                        volume.ID)
                    if config_file:
                        volume_info.update(
                            {"file_content": config_file.file_content})
                volume_list.append(volume_info)
            data["volumes_info"] = volume_list

        logger.debug(tenant.tenant_name + " start create_service:" +
                     datetime.datetime.now().strftime('%Y%m%d%H%M%S'))
        # 挂载信息
        mnt_info = mnt_repo.get_service_mnts(service.tenant_id,
                                             service.service_id)
        if mnt_info:
            data["dep_volumes_info"] = [{
                "dep_service_id": mnt.dep_service_id,
                "volume_path": mnt.mnt_dir,
                "volume_name": mnt.mnt_name
            } for mnt in mnt_info]

        # etcd keys
        data["etcd_key"] = service.check_uuid

        # runtime os name
        data["os_type"] = label_service.get_service_os_name(service)
        # 数据中心创建
        app_id = service_group_relation_repo.get_group_id_by_service(service)
        region_app_id = region_app_repo.get_region_app_id(
            service.service_region, app_id)
        data["app_id"] = region_app_id
        region_api.create_service(service.service_region, tenant.tenant_name,
                                  data)
        # 将组件创建状态变更为创建完成
        service.create_status = "complete"
        self.__handle_service_ports(tenant, service, ports)
        service.save()
        return service