def put(self, request, plugin_id, *args, **kwargs): """ 应用插件配置更新 --- parameters: - name: tenantName description: 租户名 required: true type: string paramType: path - name: serviceAlias description: 服务别名 required: true type: string paramType: path - name: plugin_id description: 插件ID required: true type: string paramType: path - name: body description: 配置内容 required: true type: string paramType: body """ sid = None try: logger.debug("update service plugin config ") config = json.loads(request.body) logger.debug("====> {0}".format(config)) if not config: return Response(general_message(400, "params error", "参数配置不可为空"), status=400) pbv = plugin_version_service.get_newest_usable_plugin_version(plugin_id) if not pbv: return Response(general_message(400, "no usable plugin version", "无最新更新的版本信息,无法更新配置"), status=400) sid = transaction.savepoint() # 删除原有配置 app_plugin_service.delete_service_plugin_config(self.service, plugin_id) # 全量插入新配置 app_plugin_service.update_service_plugin_config(self.service, plugin_id, pbv.build_version, config) # 更新数据中心配置 region_config = app_plugin_service.get_region_config_from_db(self.service, plugin_id, pbv.build_version) region_api.update_service_plugin_config(self.response_region, self.tenant.tenant_name, self.service.service_alias, plugin_id, region_config) # 提交操作 transaction.savepoint_commit(sid) result = general_message(200, "success", "配置更新成功") except Exception as e: logger.exception(e) if sid: transaction.savepoint_rollback(sid) result = error_message(e.message) return Response(result, result["code"])
def __create_service_plugins(self, region, tenant, service_list, app_plugin_map, old_new_id_map): try: plugin_version_service.update_plugin_build_status(region, tenant) for service in service_list: plugins = app_plugin_map.get(service.service_id) if plugins: for plugin_config in plugins: plugin_key = plugin_config["plugin_key"] p = plugin_repo.get_plugin_by_origin_share_id( tenant.tenant_id, plugin_key) plugin_id = p[0].plugin_id service_plugin_config_vars = plugin_config["attr"] plugin_version = plugin_version_service.get_newest_plugin_version( plugin_id) build_version = plugin_version.build_version self.__save_service_config_values( service, plugin_id, build_version, service_plugin_config_vars, old_new_id_map) # 2.从console数据库取数据生成region数据 region_config = app_plugin_service.get_region_config_from_db( service, plugin_id, build_version) data = dict() data["plugin_id"] = plugin_id data["switch"] = True data["version_id"] = build_version data.update(region_config) code, msg, relation = app_plugin_service.create_service_plugin_relation( service.service_id, plugin_id, build_version, "", True) if code != 200: raise Exception("msg") region_api.install_service_plugin( service.service_region, tenant.tenant_name, service.service_alias, data) except Exception as e: logger.exception(e)
def post(self, request, plugin_id, *args, **kwargs): """ 应用安装插件 --- parameters: - name: tenantName description: 租户名 required: true type: string paramType: path - name: serviceAlias description: 服务别名 required: true type: string paramType: path - name: plugin_id description: 插件ID required: true type: string paramType: path - name: build_version description: 插件版本 required: true type: string paramType: form """ result = {} build_version = request.data.get("build_version", None) try: if not plugin_id: return Response(general_message(400, "params error", "参数错误"), status=400) if not build_version: plugin_version = plugin_version_service.get_newest_usable_plugin_version(plugin_id) build_version = plugin_version.build_version logger.debug("start install plugin ! plugin_id {0} build_version {1}".format(plugin_id, build_version)) # 1.生成console数据,存储 code, msg = app_plugin_service.save_default_plugin_config(self.tenant, self.service, plugin_id, build_version) if code != 200: return Response(general_message(code, "install plugin fail", msg), status=code) # 2.从console数据库取数据生成region数据 region_config = app_plugin_service.get_region_config_from_db(self.service, plugin_id, build_version) data = dict() data["plugin_id"] = plugin_id data["switch"] = True data["version_id"] = build_version data.update(region_config) code, msg, relation = app_plugin_service.create_service_plugin_relation(self.service.service_id, plugin_id, build_version, "", True) if code != 200: return Response(general_message(code, "install plugin fail", msg), status=code) region_api.install_service_plugin(self.response_region, self.tenant.tenant_name, self.service.service_alias, data) result = general_message(200, "success", "安装成功") except Exception as e: logger.exception(e) app_plugin_service.delete_service_plugin_config(self.service, plugin_id) app_plugin_service.delete_service_plugin_relation(self.service, plugin_id) if e.message.has_key("body"): if e.message["body"].has_key("msg"): if e.message["body"]["msg"] == "can not add this kind plugin, a same kind plugin has been linked": result = general_message(409, "install plugin fail", "网络类插件不能重复安装") else: result = general_message(500, e.message, "插件安装失败") return Response(result, status=result["code"])
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
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