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())
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
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)
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
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
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
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 }
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)
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)
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
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}
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
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
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
def get_app_by_id(self, tenant, region, app_id): return group_repo.get_group_by_pk(tenant.tenant_id, region, app_id)