示例#1
0
    def __init__(self, tenant, region: RegionConfig, app: ServiceGroup, upgrade_group_id, support_labels=None):
        self.tenant = tenant
        self.tenant_id = tenant.tenant_id
        self.region = region
        self.region_name = region.region_name
        self.app_id = app.app_id
        self.upgrade_group_id = upgrade_group_id
        self.app = group_repo.get_group_by_pk(tenant.tenant_id, region.region_name, app.app_id)
        self.governance_mode = app.governance_mode

        self.support_labels = support_labels

        self._component_ids = self._component_ids()
        self._components = self._create_components(app.app_id, upgrade_group_id)

        # dependency
        component_deps = dep_relation_repo.list_by_component_ids(self.tenant_id,
                                                                 [cpt.component.component_id for cpt in self._components])
        self.component_deps = list(component_deps)
        self.volume_deps = self._volume_deps()

        # plugins
        self.plugin_deps = self._plugin_deps()
        self.plugin_configs = self._plugin_configs()

        # config groups
        self.config_groups = self._config_groups()
        self.config_group_items = self._config_group_items()
        self.config_group_components = self._config_group_components()

        # labels
        self.labels = list(label_repo.get_all_labels())
示例#2
0
    def get_app_detail(self, tenant, region_name, app_id):
        # app metadata
        app = group_repo.get_group_by_pk(tenant.tenant_id, region_name, app_id)

        self.sync_app_services(tenant, region_name, app_id)

        res = app.to_dict()
        res['app_id'] = app.ID
        res['app_name'] = app.group_name
        res['service_num'] = group_service_relation_repo.count_service_by_app_id(
            app_id)
        res['backup_num'] = backup_record_repo.count_by_app_id(app_id)
        res['share_num'] = share_repo.count_by_app_id(app_id)
        res['ingress_num'] = self.count_ingress_by_app_id(
            tenant.tenant_id, region_name, app_id)
        res['config_group_num'] = app_config_group_service.count_by_app_id(
            region_name, app_id)

        try:
            principal = user_repo.get_user_by_username(app.username)
            res['principal'] = principal.get_name()
            res['email'] = principal.email
        except ErrUserNotFound:
            res['principal'] = app.username

        res["create_status"] = "complete"
        res["compose_id"] = None
        if app_id != -1:
            compose_group = compose_repo.get_group_compose_by_group_id(app_id)
            if compose_group:
                res["create_status"] = compose_group.create_status
                res["compose_id"] = compose_group.compose_id

        return res
示例#3
0
    def get_service_mnt_details(self, tenant, service, volume_types, page=1, page_size=20):

        all_mnt_relations = mnt_repo.get_service_mnts_filter_volume_type(tenant.tenant_id, service.service_id, volume_types)
        total = len(all_mnt_relations)
        mnt_paginator = JuncheePaginator(all_mnt_relations, int(page_size))
        mnt_relations = mnt_paginator.page(page)
        mounted_dependencies = []
        if mnt_relations:
            for mount in mnt_relations:
                dep_service = service_repo.get_service_by_service_id(mount.dep_service_id)
                if dep_service:
                    gs_rel = group_service_relation_repo.get_group_by_service_id(dep_service.service_id)
                    group = None
                    if gs_rel:
                        group = group_repo.get_group_by_pk(tenant.tenant_id, service.service_region, gs_rel.group_id)
                    dep_volume = volume_repo.get_service_volume_by_name(dep_service.service_id, mount.mnt_name)
                    if dep_volume:
                        mounted_dependencies.append({
                            "local_vol_path": mount.mnt_dir,
                            "dep_vol_name": dep_volume.volume_name,
                            "dep_vol_path": dep_volume.volume_path,
                            "dep_vol_type": dep_volume.volume_type,
                            "dep_app_name": dep_service.service_cname,
                            "dep_app_group": group.group_name if group else '未分组',
                            "dep_vol_id": dep_volume.ID,
                            "dep_group_id": group.ID if group else -1,
                            "dep_app_alias": dep_service.service_alias
                        })
        return mounted_dependencies, total
 def get_group_by_id(self, tenant, region, group_id):
     # if group_id == -1:
     #     return 200, "success", {"group_id": -1, "group_name": "未分组"}
     group = group_repo.get_group_by_pk(tenant.tenant_id, region, group_id)
     if not group:
         return 404, u"组不存在", None
     rt_bean = {"group_id": group.ID, "group_name": group.group_name}
     return 200, u"success", rt_bean
 def add_service_to_group(self, tenant, region_name, group_id, service_id):
     if group_id:
         group_id = int(group_id)
         if group_id > 0:
             group = group_repo.get_group_by_pk(tenant.tenant_id, region_name, group_id)
             if not group:
                 return 404, "应用不存在"
             group_service_relation_repo.add_service_group_relation(group_id, service_id, tenant.tenant_id, region_name)
     return 200, "success"
 def add_component_to_app(tenant, region_name, app_id, component_id):
     if not app_id:
         return
     app_id = int(app_id)
     if app_id > 0:
         group = group_repo.get_group_by_pk(tenant.tenant_id, region_name, app_id)
         if not group:
             raise ErrApplicationNotFound
         group_service_relation_repo.add_service_group_relation(app_id, component_id, tenant.tenant_id, region_name)
示例#7
0
    def get_service_unmnt_details(self, tenant, service, service_ids, page,
                                  page_size):

        services = service_repo.get_services_by_service_ids(*service_ids)
        current_tenant_services_id = service_ids
        # 已挂载的服务路径
        dep_mnt_names = mnt_repo.get_service_mnts(
            tenant.tenant_id, service.service_id).values_list('mnt_name',
                                                              flat=True)
        # 当前未被挂载的共享路径
        service_volumes = volume_repo.get_services_volumes(
            current_tenant_services_id).filter(
                volume_type__in=[self.SHARE, self.CONFIG]).exclude(
                    service_id=service.service_id).exclude(
                        volume_name__in=dep_mnt_names)
        # 只展示无状态的服务组件(有状态服务的存储类型为config-file也可)
        logger.debug('----------volumes----->{0}'.format(
            type(service_volumes)))
        volumes = list(service_volumes)
        for volume in volumes:
            service_obj = service_repo.get_service_by_service_id(
                volume.service_id)
            if service_obj:
                if service_obj.extend_method != "stateless" and volume.volume_type != "config-file":
                    volumes.remove(volume)
        total = len(volumes)
        volume_paginator = JuncheePaginator(volumes, int(page_size))
        page_volumes = volume_paginator.page(page)
        un_mount_dependencies = []
        for volume in page_volumes:
            gs_rel = group_service_relation_repo.get_group_by_service_id(
                volume.service_id)
            group = None
            if gs_rel:
                group = group_repo.get_group_by_pk(tenant.tenant_id,
                                                   service.service_region,
                                                   gs_rel.group_id)
            un_mount_dependencies.append({
                "dep_app_name":
                services.get(service_id=volume.service_id).service_cname,
                "dep_app_group":
                group.group_name if group else '未分组',
                "dep_vol_name":
                volume.volume_name,
                "dep_vol_path":
                volume.volume_path,
                "dep_vol_type":
                volume.volume_type,
                "dep_vol_id":
                volume.ID,
                "dep_group_id":
                group.ID if group else -1,
                "dep_app_alias":
                services.get(service_id=volume.service_id).service_alias
            })
        return un_mount_dependencies, total
示例#8
0
 def initial(self, request, *args, **kwargs):
     super(ApplicationView, self).initial(request, *args, **kwargs)
     app_id = kwargs.get("app_id")
     app = group_repo.get_group_by_pk(self.tenant.tenant_id,
                                      self.region_name, app_id)
     if not app:
         raise ServiceHandleException("app not found",
                                      "应用不存在",
                                      status_code=404)
     self.app = app
示例#9
0
    def get_service_unmnt_details(self, tenant, service, service_ids, page,
                                  page_size, q):

        services = service_repo.get_services_by_service_ids(service_ids)
        current_tenant_services_id = service_ids
        # 已挂载的组件路径
        dep_mnts = mnt_repo.get_service_mnts(tenant.tenant_id,
                                             service.service_id)
        dep_volume_ids = [dep_mnt.volume_id for dep_mnt in dep_mnts]
        # 当前未被挂载的共享路径
        service_volumes = volume_repo.get_services_volumes(current_tenant_services_id) \
            .filter(volume_type__in=[self.SHARE, self.CONFIG]) \
            .exclude(service_id=service.service_id) \
            .exclude(ID__in=dep_volume_ids).filter(q)
        # 只展示无状态的组件(有状态组件的存储类型为config-file也可)
        volumes = list(service_volumes)
        copy_volumes = copy.copy(volumes)
        for volume in copy_volumes:
            service_obj = service_repo.get_service_by_service_id(
                volume.service_id)
            if service_obj:
                if is_state(service_obj.extend_method):
                    if volume.volume_type != "config-file":
                        volumes.remove(volume)
        total = len(volumes)
        volume_paginator = JuncheePaginator(volumes, int(page_size))
        page_volumes = volume_paginator.page(page)
        un_mount_dependencies = []
        for volume in page_volumes:
            gs_rel = group_service_relation_repo.get_group_by_service_id(
                volume.service_id)
            group = None
            if gs_rel:
                group = group_repo.get_group_by_pk(tenant.tenant_id,
                                                   service.service_region,
                                                   gs_rel.group_id)
            un_mount_dependencies.append({
                "dep_app_name":
                services.get(service_id=volume.service_id).service_cname,
                "dep_app_group":
                group.group_name if group else '未分组',
                "dep_vol_name":
                volume.volume_name,
                "dep_vol_path":
                volume.volume_path,
                "dep_vol_type":
                volume.volume_type,
                "dep_vol_id":
                volume.ID,
                "dep_group_id":
                group.ID if group else -1,
                "dep_app_alias":
                services.get(service_id=volume.service_id).service_alias
            })
        return un_mount_dependencies, total
示例#10
0
 def get_group_by_id(self, tenant, region, group_id):
     group = group_repo.get_group_by_pk(tenant.tenant_id, region, group_id)
     if not group:
         raise ServiceHandleException(status_code=404,
                                      msg="app not found",
                                      msg_show="目标应用不存在")
     return {
         "group_id": group.ID,
         "group_name": group.group_name,
         "group_note": group.note
     }
示例#11
0
 def initial(self, request, *args, **kwargs):
     super(ComposeGroupBaseView, self).initial(request, *args, **kwargs)
     group_id = kwargs.get("group_id", None)
     if not group_id:
         raise ImportError("You url not contains args - group_id -")
     group = group_repo.get_group_by_pk(self.tenant.tenant_id, self.response_region, group_id)
     if group:
         self.group = group
     else:
         raise BusinessException(Response(general_message(404, "group not found", "组ID{0}不存在".format(group_id)), status=404))
     self.initial_header_info(request)
示例#12
0
    def initial(self, request, *args, **kwargs):
        super(ApplicationView, self).initial(request, *args, **kwargs)
        app_id = kwargs.get("app_id") if kwargs.get("app_id") else kwargs.get("group_id")
        app = group_repo.get_group_by_pk(self.tenant.tenant_id, self.region_name, app_id)
        if not app:
            raise ServiceHandleException("app not found", "应用不存在", status_code=404)
        self.app = app

        # update update_time if the http method is not a get.
        if request.method != 'GET':
            group_repo.update_group_time(app_id)
示例#13
0
    def get_service_unmount_volume_list(self, tenant, service, service_ids, page, page_size, is_config=False):
        """
        1. 获取租户下其他所有组件列表,方便后续进行名称的冗余
        2. 获取其他组件的所有可共享的存储
        3. 获取已经使用的存储,方便后续过滤
        4. 遍历存储,组装信息
        """

        for serviceID in service_ids:
            if serviceID == service.service_id:
                service_ids.remove(serviceID)
        services = service_repo.get_services_by_service_ids(service_ids)
        state_services = []  # 有状态组件
        for svc in services:
            if is_state(svc.extend_method):
                state_services.append(svc)
        state_service_ids = [svc.service_id for svc in state_services]

        current_tenant_services_id = service_ids
        # 已挂载的组件路径
        mounted = mnt_repo.get_service_mnts(tenant.tenant_id, service.service_id)
        mounted_ids = [mnt.volume_id for mnt in mounted]
        # 当前未被挂载的共享路径
        service_volumes = []
        # 配置文件无论组件是否是共享存储都可以共享,只需过滤掉已经挂载的存储;其他存储类型则需要考虑排除有状态组件的存储
        if is_config:
            service_volumes = volume_repo.get_services_volumes(current_tenant_services_id).filter(volume_type=self.CONFIG) \
                .exclude(ID__in=mounted_ids)
        else:
            service_volumes = volume_repo.get_services_volumes(current_tenant_services_id).filter(volume_type=self.SHARE) \
                .exclude(ID__in=mounted_ids).exclude(service_id__in=state_service_ids)
        # TODO 使用函数进行存储的排查,确定哪些存储不可以进行共享,哪些存储可以共享,而不是现在这样简单的提供一个self.SHARE

        total = len(service_volumes)
        volume_paginator = JuncheePaginator(service_volumes, int(page_size))
        page_volumes = volume_paginator.page(page)
        un_mount_dependencies = []
        for volume in page_volumes:
            gs_rel = group_service_relation_repo.get_group_by_service_id(volume.service_id)
            group = None
            if gs_rel:
                group = group_repo.get_group_by_pk(tenant.tenant_id, service.service_region, gs_rel.group_id)
            un_mount_dependencies.append({
                "dep_app_name": services.get(service_id=volume.service_id).service_cname,
                "dep_app_group": group.group_name if group else '未分组',
                "dep_vol_name": volume.volume_name,
                "dep_vol_path": volume.volume_path,
                "dep_vol_type": volume.volume_type,
                "dep_vol_id": volume.ID,
                "dep_group_id": group.ID if group else -1,
                "dep_app_alias": services.get(service_id=volume.service_id).service_alias
            })
        return un_mount_dependencies, total
示例#14
0
 def get_group_by_id(self, tenant, region, group_id):
     principal_info = dict()
     principal_info["email"] = ""
     principal_info["is_delete"] = False
     group = group_repo.get_group_by_pk(tenant.tenant_id, region, group_id)
     if not group:
         raise ServiceHandleException(status_code=404, msg="app not found", msg_show="目标应用不存在")
     try:
         user = user_repo.get_user_by_username(group.username)
         principal_info["real_name"] = user.get_name()
         principal_info["username"] = user.nick_name
         principal_info["email"] = user.email
     except ErrUserNotFound:
         principal_info["is_delete"] = True
         principal_info["real_name"] = group.username
         principal_info["username"] = group.username
     return {"group_id": group.ID, "group_name": group.group_name, "group_note": group.note, "principal": principal_info}
示例#15
0
    def get_service_unmnt_details(self, tenant, service, service_ids, page,
                                  page_size):

        services = service_repo.get_services_by_service_ids(*service_ids)
        current_tenant_services_id = service_ids
        # 已挂载的服务路径
        dep_mnt_names = mnt_repo.get_service_mnts(
            tenant.tenant_id, service.service_id).values_list('mnt_name',
                                                              flat=True)
        # 当前未被挂载的共享路径
        volumes = volume_repo.get_services_volumes(
            current_tenant_services_id).filter(volume_type=self.SHARE).exclude(
                service_id=service.service_id).exclude(
                    volume_name__in=dep_mnt_names)
        total = len(volumes)
        volume_paginator = JuncheePaginator(volumes, int(page_size))
        page_volumes = volume_paginator.page(page)
        un_mount_dependencies = []
        for volume in page_volumes:
            gs_rel = group_service_relation_repo.get_group_by_service_id(
                volume.service_id)
            group = None
            if gs_rel:
                group = group_repo.get_group_by_pk(tenant.tenant_id,
                                                   service.service_region,
                                                   gs_rel.group_id)
            un_mount_dependencies.append({
                "dep_app_name":
                services.get(service_id=volume.service_id).service_cname,
                "dep_app_group":
                group.group_name if group else '未分组',
                "dep_vol_name":
                volume.volume_name,
                "dep_vol_path":
                volume.volume_path,
                "dep_vol_type":
                volume.volume_type,
                "dep_vol_id":
                volume.ID,
                "dep_group_id":
                group.ID if group else -1,
                "dep_app_alias":
                services.get(service_id=volume.service_id).service_alias
            })
        return un_mount_dependencies, total
示例#16
0
 def check_compose(self, region, tenant, compose_id):
     group_compose = compose_repo.get_group_compose_by_compose_id(compose_id)
     if not group_compose:
         return 404, "未找到对应的compose内容", None
     body = dict()
     body["tenant_id"] = tenant.tenant_id
     body["source_type"] = "docker-compose"
     body["source_body"] = group_compose.compose_content
     res, body = region_api.service_source_check(region, tenant.tenant_name, body)
     bean = body["bean"]
     group_compose.check_uuid = bean["check_uuid"]
     group_compose.check_event_id = bean["event_id"]
     group_compose.create_status = "checking"
     group_compose.save()
     group = group_repo.get_group_by_pk(tenant.tenant_id, region, group_compose.group_id)
     compose_bean = group_compose.to_dict()
     if group:
         compose_bean["group_name"] = group.group_name
     return 200, "success", compose_bean
示例#17
0
 def get_group_by_id(self, tenant, region, group_id):
     group = group_repo.get_group_by_pk(tenant.tenant_id, region, group_id)
     if not group:
         return 404, u"应用不存在", None
     rt_bean = {"group_id": group.ID, "group_name": group.group_name}
     return 200, u"success", rt_bean
示例#18
0
 def get_app_by_id(self, tenant, region, app_id):
     return group_repo.get_group_by_pk(tenant.tenant_id, region, app_id)