def move_service_into_recycle_bin(self, service): """将服务移入回收站""" data = service.toJSON() data.pop("ID") trash_service = recycle_bin_repo.create_trash_service(**data) # 如果这个应用属于应用组, 则删除应用组最后一个应用后同时删除应用组 if service.tenant_service_group_id > 0: count = service_repo.get_services_by_service_group_id(service.tenant_service_group_id).count() if count <= 1: tenant_service_group_repo.delete_tenant_service_group_by_pk(service.tenant_service_group_id) service.delete() return trash_service
def again_delete_service(self, tenant, service, user=None): """二次删除应用""" try: region_api.delete_service(service.service_region, tenant.tenant_name, service.service_alias, tenant.enterprise_id) except region_api.CallApiError as e: if int(e.status) != 404: logger.exception(e) return 500, "删除应用失败 {0}".format(e.message) if service.create_status == "complete": data = service.toJSON() data.pop("ID") delete_service_repo.create_delete_service(**data) env_var_repo.delete_service_env(tenant.tenant_id, service.service_id) auth_repo.delete_service_auth(service.service_id) domain_repo.delete_service_domain(service.service_id) tcp_domain.delete_service_tcp_domain(service.service_id) dep_relation_repo.delete_service_relation(tenant.tenant_id, service.service_id) mnt_repo.delete_mnt(service.service_id) port_repo.delete_service_port(tenant.tenant_id, service.service_id) volume_repo.delete_service_volumes(service.service_id) group_service_relation_repo.delete_relation_by_service_id( service.service_id) service_attach_repo.delete_service_attach(service.service_id) create_step_repo.delete_create_step(service.service_id) event_service.delete_service_events(service) probe_repo.delete_service_probe(service.service_id) service_payment_repo.delete_service_payment(service.service_id) service_source_repo.delete_service_source(tenant.tenant_id, service.service_id) service_perm_repo.delete_service_perm(service.ID) compose_relation_repo.delete_relation_by_service_id(service.service_id) service_label_repo.delete_service_all_labels(service.service_id) # 删除应用和插件的关系 share_repo.delete_tenant_service_plugin_relation(service.service_id) # 如果这个应用属于应用组, 则删除应用组最后一个应用后同时删除应用组 if service.tenant_service_group_id > 0: count = service_repo.get_services_by_service_group_id( service.tenant_service_group_id).count() if count <= 1: tenant_service_group_repo.delete_tenant_service_group_by_pk( service.tenant_service_group_id) self.__create_service_delete_event(tenant, service, user) service.delete() return 200, "success"
def install_service_group(self, user, tenant_name, group_key, group_version, region_name, template_version): tenant_service_group = None new_group = None try: logger.debug('prepared install [{}-{}] to [{}] on [{}]'.format( group_key, group_version, tenant_name, region_name)) if tenant_name: tenant = self.get_tenant_by_name(tenant_name) else: tenant = self.get_default_tenant_by_user(user.user_id) if not tenant: logger.error('tenant does not existed!') return False, '租户不存在', None logger.debug('login_user_id: {}'.format(user.user_id)) logger.debug('login_user: {}'.format(user.nick_name)) logger.debug('tenant_name: {}'.format(tenant.tenant_name)) # 查看安装的目标数据中心是否已初始化, 如果未初始化则先初始化 if not tenant_svc.init_region_tenant(tenant, region_name): return False, '初始化数据中心失败: {}'.format(region_name), None app = market_sycn_service.download_app_service_group_from_market( user, tenant, group_key, group_version) new_group = self.__create_group(tenant.tenant_id, region_name, app.group_name) tenant_service_group, _ = market_app_service.install_service( tenant, region_name, user, new_group.ID, app, True) if tenant_service_group: tenant_service_group = self.get_group_services_by_pk( tenant_service_group.pk) return True, "success", tenant_service_group except Exception as e: logger.exception(e) # 回滚数据 if tenant_service_group: tenant_service_group_repo.delete_tenant_service_group_by_pk( tenant_service_group.ID) if new_group: group_repo.delete_group_by_pk(new_group.ID) return False, str(e.message), None
def truncate_service(self, tenant, service): """彻底删除应用""" if service.create_status == "complete": data = service.toJSON() delete_service_repo.create_delete_service(**data) try: region_api.delete_service(service.service_region, tenant.tenant_name, service.service_alias, tenant.enterprise_id) except region_api.CallApiError as e: if int(e.status) != 404: return 500, "删除应用失败 {0}".format(e.message) env_var_repo.delete_service_env(tenant.tenant_id, service.service_id) auth_repo.delete_service_auth(service.service_id) domain_repo.delete_service_domain(service.service_id) dep_relation_repo.delete_service_relation(tenant.tenant_id, service.service_id) env_var_repo.delete_service_env(tenant.tenant_id, service.service_id) mnt_repo.delete_mnt(service.service_id) port_repo.delete_service_port(tenant.tenant_id, service.service_id) volume_repo.delete_service_volumes(service.service_id) group_service_relation_repo.delete_relation_by_service_id( service.service_id) service_attach_repo.delete_service_attach(service.service_id) create_step_repo.delete_create_step(service.service_id) event_service.delete_service_events(service) probe_repo.delete_service_probe(service.service_id) service_payment_repo.delete_service_payment(service.service_id) # 如果这个应用属于应用组, 则删除应用组最后一个应用后同时删除应用组 if service.tenant_service_group_id > 0: count = service_repo.get_services_by_service_group_id( service.tenant_service_group_id).count() if count <= 1: tenant_service_group_repo.delete_tenant_service_group_by_pk( service.tenant_service_group_id) service.delete() return 200, "success"
def install_service(self, tenant, region, user, group_id, market_app): service_list = [] service_key_dep_key_map = {} key_service_map = {} tenant_service_group = None service_probe_map = {} try: app_templates = json.loads(market_app.app_template) apps = app_templates["apps"] tenant_service_group = self.__create_tenant_service_group( region, tenant.tenant_id, group_id, market_app.group_key, market_app.version, market_app.group_name) for app in apps: ts = self.__init_market_app(tenant.tenant_id, region, user, app, tenant_service_group.ID) group_service.add_service_to_group(tenant, region, group_id, ts.service_id) service_list.append(ts) # 先保存env,再保存端口,因为端口需要处理env code, msg = self.__save_env( tenant, ts, app["service_env_map_list"], app["service_connect_info_map_list"]) if code != 200: raise Exception(msg) code, msg = self.__save_port(tenant, ts, app["port_map_list"]) if code != 200: raise Exception(msg) code, msg = self.__save_volume(tenant, ts, app["service_volume_map_list"]) if code != 200: raise Exception(msg) # 保存应用探针信息 probe_infos = app.get("probes", None) if probe_infos: service_probe_map[ts.service_id] = probe_infos self.__save_extend_info(ts, app["extend_method_map"]) dep_apps_key = app.get("dep_service_map_list", None) if dep_apps_key: service_key_dep_key_map[ts.service_key] = dep_apps_key key_service_map[ts.service_key] = ts # 保存依赖关系 self.__save_service_deps(tenant, service_key_dep_key_map, key_service_map) # 构建应用 self.__build_services(tenant, user, service_list, service_probe_map) except Exception as e: logger.exception(e) if tenant_service_group: tenant_service_group_repo.delete_tenant_service_group_by_pk( tenant_service_group.ID) for service in service_list: try: app_manage_service.truncate_service(tenant, service) except Exception as le: logger.exception(le) raise e
def install_market_apps_directly(self, user, tenant, region_name, app_service_json_str, service_origin): app_templates = json.loads(app_service_json_str) apps = app_templates["apps"] service_list = [] service_key_dep_key_map = {} key_service_map = {} tenant_service_group = None new_group = None try: # 生成分类 group_name = self.__generator_group_name( app_templates["group_name"]) new_group = group_repo.add_group(tenant.tenant_id, region_name, group_name) group_id = new_group.ID tenant_service_group = self.__generate_tenant_service_group( region_name, tenant.tenant_id, new_group.ID, app_templates["group_key"], app_templates["group_version"], app_templates["group_name"]) for app in apps: ts = self.__init_market_app(tenant, region_name, user, app, tenant_service_group.ID, service_origin) group_service.add_service_to_group(tenant, region_name, group_id, ts.service_id) # 先保存env,再保存端口,因为端口需要处理env code, msg = self.__save_env( tenant, ts, app["service_env_map_list"], app["service_connect_info_map_list"]) if code != 200: raise Exception(msg) code, msg = self.__save_port(tenant, ts, app["port_map_list"]) if code != 200: raise Exception(msg) code, msg = self.__save_volume(tenant, ts, app["service_volume_map_list"]) if code != 200: raise Exception(msg) # 保存应用探针信息 probe_infos = app.get("probes", None) if probe_infos: for prob_data in probe_infos: code, msg, probe = probe_service.add_service_probe( tenant, ts, prob_data) if code != 200: logger.exception(msg) self.__save_extend_info(ts, app["extend_method_map"]) dep_apps_key = app.get("dep_service_map_list", None) if dep_apps_key: service_key_dep_key_map[ts.service_key] = dep_apps_key key_service_map[ts.service_key] = ts service_list.append(ts) # 保存依赖关系,需要等应用都创建完成才能使用 self.__save_service_deps(tenant, service_key_dep_key_map, key_service_map) # 数据中心创建应用 for service in service_list: new_service = app_service.create_region_service( tenant, service, user.nick_name) logger.debug("build service ===> {0} success".format( service.service_cname)) # 为服务添加探针 self.__create_service_probe(tenant, new_service) # 添加服务有无状态标签 label_service.update_service_state_label(tenant, new_service) return True, "success", tenant_service_group, service_list except Exception as e: logger.exception(e) # 回滚数据 if tenant_service_group: tenant_service_group_repo.delete_tenant_service_group_by_pk( tenant_service_group.ID) if new_group: group_repo.delete_group_by_pk(new_group.ID) for service in service_list: try: app_manage_service.truncate_service(tenant, service) except Exception as delete_error: logger.exception(delete_error) return False, "create tenant_services from market directly failed !", None, service_list
def install_service(self, tenant, region, user, group_id, market_app, is_deploy): service_list = [] service_key_dep_key_map = {} key_service_map = {} tenant_service_group = None service_probe_map = {} app_plugin_map = {} # 新装服务对应的安装的插件映射 old_new_id_map = {} # 新旧服务映射关系 try: app_templates = json.loads(market_app.app_template) apps = app_templates["apps"] tenant_service_group = self.__create_tenant_service_group( region, tenant.tenant_id, group_id, market_app.group_key, market_app.version, market_app.group_name) status, msg = self.__create_plugin_for_tenant( region, user, tenant, app_templates.get("plugins", [])) if status != 200: raise Exception(msg) for app in apps: ts = self.__init_market_app(tenant, region, user, app, tenant_service_group.ID) group_service.add_service_to_group(tenant, region, group_id, ts.service_id) service_list.append(ts) old_new_id_map[app["service_id"]] = ts # 先保存env,再保存端口,因为端口需要处理env code, msg = self.__save_env( tenant, ts, app["service_env_map_list"], app["service_connect_info_map_list"]) if code != 200: raise Exception(msg) code, msg = self.__save_port(tenant, ts, app["port_map_list"]) if code != 200: raise Exception(msg) code, msg = self.__save_volume(tenant, ts, app["service_volume_map_list"]) if code != 200: raise Exception(msg) # 保存应用探针信息 probe_infos = app.get("probes", None) if probe_infos: service_probe_map[ts.service_id] = probe_infos self.__save_extend_info(ts, app["extend_method_map"]) if app.get("service_share_uuid", None): dep_apps_key = app.get("dep_service_map_list", None) if dep_apps_key: service_key_dep_key_map[app.get( "service_share_uuid")] = dep_apps_key key_service_map[app.get("service_share_uuid")] = ts else: dep_apps_key = app.get("dep_service_map_list", None) if dep_apps_key: service_key_dep_key_map[ts.service_key] = dep_apps_key key_service_map[ts.service_key] = ts app_plugin_map[ts.service_id] = app.get( "service_related_plugin_config") # 保存依赖关系 self.__save_service_deps(tenant, service_key_dep_key_map, key_service_map) # 数据中心创建应用 new_service_list = self.__create_region_services( tenant, user, service_list, service_probe_map) # 创建应用插件 self.__create_service_plugins(region, tenant, service_list, app_plugin_map, old_new_id_map) if is_deploy: # 部署所有应用 self.__deploy_services(tenant, user, new_service_list) except Exception as e: logger.exception(e) if tenant_service_group: tenant_service_group_repo.delete_tenant_service_group_by_pk( tenant_service_group.ID) for service in service_list: try: app_manage_service.truncate_service(tenant, service) except Exception as le: logger.exception(le) raise e