def save_multi_services(self, region_name, tenant, group_id, service, user, service_infos): service_source = service_source_repo.get_service_source( tenant.tenant_id, service.service_id) tx = transaction.savepoint() for service_info in service_infos: code, msg_show, new_service = app_service \ .create_source_code_app(region_name, tenant, user, service.code_from, service_info["cname"], service.clone_url, service.git_project_id, service.code_version, service.server_type, oauth_service_id=service.oauth_service_id, git_full_name=service.git_full_name) if code != 200: logger.error( "Multiple services; Service alias: {}; error creating service" .format(service.service_alias)) transaction.savepoint_rollback(tx) return code, msg_show # add username and password if service_source: git_password = service_source.password git_user_name = service_source.user_name if git_password or git_user_name: app_service.create_service_source_info( tenant, new_service, git_user_name, git_password) # add group code, msg_show = group_service.add_service_to_group( tenant, region_name, group_id, new_service.service_id) if code != 200: logger.debug( "Group ID: {0}; Service ID: {1}; error adding service to group" .format(group_id, new_service.service_id)) transaction.savepoint_rollback(tx) return code, msg_show # save service info, such as envs, ports, etc code, msg = app_check_service.save_service_info( tenant, new_service, service_info) if code != 200: logger.debug( "Group ID: {0}; Service ID: {1}; error saving services". format(group_id, new_service.service_id)) transaction.savepoint_rollback(tx) return code, msg new_service = app_service.create_region_service( tenant, new_service, user.nick_name) new_service.create_status = "complete" new_service.save() transaction.savepoint_commit(tx) return 200, "success"
def post(self, request, *args, **kwargs): """ 服务构建 --- parameters: - name: tenantName description: 租户名 required: true type: string paramType: path - name: serviceAlias description: 服务别名 required: true type: string paramType: path """ probe = None try: is_deploy = request.data.get("is_deploy", True) # 数据中心创建应用 new_service = app_service.create_region_service(self.tenant, self.service, self.user.nick_name) self.service = new_service # 为服务添加默认探针 if self.is_need_to_add_default_probe(): code, msg, probe = app_service.add_service_default_porbe(self.tenant, self.service) if is_deploy: # 添加服务有无状态标签 label_service.update_service_state_label(self.tenant, self.service) # 部署应用 app_manage_service.deploy(self.tenant, self.service, self.user, is_upgrade=True) # 添加应用部署关系 deploy_repo.create_deploy_relation_by_service_id(service_id=self.service.service_id) result = general_message(200, "success", "构建成功") except Exception as e: logger.exception(e) result = error_message(e.message) # 删除probe # 删除region端数据 if probe: probe_service.delete_service_probe(self.tenant, self.service, probe.probe_id) event_service.delete_service_events(self.service) port_service.delete_region_port(self.tenant, self.service) volume_service.delete_region_volumes(self.tenant, self.service) env_var_service.delete_region_env(self.tenant, self.service) dependency_service.delete_region_dependency(self.tenant, self.service) app_manage_service.delete_region_service(self.tenant, self.service) self.service.create_status = "checked" self.service.save() return Response(result, status=result["code"])
def save_multi_services(self, region_name, tenant, group_id, service, user, service_infos): service_source = service_source_repo.get_service_source( tenant.tenant_id, service.service_id) service_ids = [] for service_info in service_infos: code, msg_show, new_service = app_service \ .create_source_code_app(region_name, tenant, user, service.code_from, service_info["cname"], service.clone_url, service.git_project_id, service.code_version, service.server_type, oauth_service_id=service.oauth_service_id, git_full_name=service.git_full_name) if code != 200: raise AbortRequest( "Multiple services; Service alias: {}; error creating service" .format(service.service_alias), "创建多组件应用失败") # add username and password if service_source: git_password = service_source.password git_user_name = service_source.user_name if git_password or git_user_name: app_service.create_service_source_info( tenant, new_service, git_user_name, git_password) # add group code, msg_show = group_service.add_service_to_group( tenant, region_name, group_id, new_service.service_id) if code != 200: logger.debug( "Group ID: {0}; Service ID: {1}; error adding service to group" .format(group_id, new_service.service_id)) raise AbortRequest("app not found", "创建多组件应用失败", 404, 404) # save service info, such as envs, ports, etc code, msg = app_check_service.save_service_info( tenant, new_service, service_info) if code != 200: logger.debug( "Group ID: {0}; Service ID: {1}; error saving services". format(group_id, new_service.service_id)) raise AbortRequest(msg, "创建多组件应用失败") new_service = app_service.create_region_service( tenant, new_service, user.nick_name) new_service.create_status = "complete" new_service.save() service_ids.append(new_service.service_id) return service_ids
def __create_region_services(self, tenant, user, service_list, service_probe_map): service_prob_id_map = {} new_service_list = [] try: for service in service_list: # 数据中心创建应用 new_service = app_service.create_region_service( tenant, service, user.nick_name) # 为服务添加探针 probe_data = service_probe_map.get(service.service_id) probe_ids = [] if probe_data: for data in probe_data: code, msg, probe = probe_service.add_service_probe( tenant, service, data) if code == 200: probe_ids.append(probe.probe_id) else: code, msg, probe = app_service.add_service_default_porbe( tenant, service) if probe: probe_ids.append(probe.probe_id) if probe_ids: service_prob_id_map[service.service_id] = probe_ids # 添加服务有无状态标签 label_service.update_service_state_label(tenant, new_service) new_service_list.append(new_service) return new_service_list except Exception as e: logger.exception("local market install app error {0}".format(e)) if service_list: for service in service_list: if service_prob_id_map: probe_ids = service_prob_id_map.get(service.service_id) if probe_ids: for probe_id in probe_ids: try: probe_service.delete_service_probe( tenant, service, probe_id) except Exception as le: logger.exception( "local market install app delete service probe {0}" .format(le)) raise e
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 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) for service in services: if service.service_id in change_service_ids: # probe = None 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)) # 添加组件有无状态标签 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)
def __build_services(self, tenant, user, service_list, service_probe_map): service_prob_map = {} try: for service in service_list: # 数据中心创建应用 new_service = app_service.create_region_service( tenant, service, user.nick_name) # 为服务添加探针 probe_data = service_probe_map.get(service.service_id) probe_ids = [] if probe_data: for data in probe_data: code, msg, probe = probe_service.add_service_probe( tenant, service, data) if code == 200: probe_ids.append(probe.probe_id) if probe_ids: service_probe_map[service.service_id] = probe_ids # 添加服务有无状态标签 label_service.update_service_state_label(tenant, new_service) # 部署应用 app_manage_service.deploy(tenant, new_service, user) except Exception as e: logger.exception(e) if service_list: for service in service_list: if service_prob_map: probe_ids = service_prob_map.get(service.service_id) if probe_ids: for probe_id in probe_ids: try: probe_service.delete_service_probe( tenant, service, probe_id) 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 post(self, request, *args, **kwargs): """ 组件构建 --- parameters: - name: tenantName description: 租户名 required: true type: string paramType: path - name: serviceAlias description: 组件别名 required: true type: string paramType: path """ probe = None is_deploy = request.data.get("is_deploy", True) status = 200 try: if self.service.service_source == "third_party": is_deploy = False # 数据中心连接创建第三方组件 new_service = app_service.create_third_party_service( self.tenant, self.service, self.user.nick_name) else: # 数据中心创建组件 new_service = app_service.create_region_service( self.tenant, self.service, self.user.nick_name) self.service = new_service # 为组件添加默认探针 if self.is_need_to_add_default_probe(): code, msg, probe = app_service.add_service_default_porbe( self.tenant, self.service) logger.debug("add default probe; code: {}; msg: {}".format( code, msg)) if is_deploy: # 添加组件有无状态标签 label_service.update_service_state_label( self.tenant, self.service) # 部署组件 app_manage_service.deploy(self.tenant, self.service, self.user, group_version=None) # 添加组件部署关系 deploy_repo.create_deploy_relation_by_service_id( service_id=self.service.service_id) result = general_message(200, "success", "构建成功") return Response(result, status=result["code"]) except HttpClient.CallApiError as e: logger.exception(e) if e.status == 403: result = general_message(10407, "no cloud permission", e.message) status = e.status elif e.status == 400: if "is exist" in e.message.get("body", ""): result = general_message(400, "the service is exist in region", "该组件名称在数据中心已存在") else: result = general_message(400, "call cloud api failure", e.message) status = e.status else: result = general_message(500, "call cloud api failure", e.message) status = 500 # 删除probe # 删除region端数据 if probe: probe_service.delete_service_probe(self.tenant, self.service, probe.probe_id) if self.service.service_source != "third_party": event_service.delete_service_events(self.service) port_service.delete_region_port(self.tenant, self.service) volume_service.delete_region_volumes(self.tenant, self.service) env_var_service.delete_region_env(self.tenant, self.service) dependency_service.delete_region_dependency( self.tenant, self.service) app_manage_service.delete_region_service(self.tenant, self.service) self.service.create_status = "checked" self.service.save() return Response(result, status=status)
def post(self, request, *args, **kwargs): """ docker-compose组件检测 --- parameters: - name: tenantName description: 租户名 required: true type: string paramType: path - name: group_id description: 组ID required: true type: string paramType: path - name: compose_id description: group_compose ID required: true type: string paramType: form """ probe_map = dict() services = None try: compose_id = request.data.get("compose_id", None) if not compose_id: return Response(general_message(400, "params error", "参数异常"), status=400) group_compose = compose_service.get_group_compose_by_compose_id( compose_id) services = compose_service.get_compose_services(compose_id) # 数据中心创建组件 new_app_list = [] for service in services: new_service = app_service.create_region_service( self.tenant, service, self.user.nick_name) new_app_list.append(new_service) # 为组件添加默认探针 code, msg, probe = app_service.add_service_default_porbe( self.tenant, new_service) if probe: probe_map[service.service_id] = probe.probe_id # 添加组件有无状态标签 label_service.update_service_state_label( self.tenant, new_service) group_compose.create_status = "complete" group_compose.save() for s in new_app_list: try: app_manage_service.deploy(self.tenant, s, self.user, group_version=None) except Exception as e: logger.exception(e) continue result = general_message(200, "success", "构建成功") except Exception as e: logger.exception(e) result = error_message(e.message) # 删除probe # 删除region端数据 if services: for service in services: if probe_map: probe_id = probe_map.get(service.service_id) probe_service.delete_service_probe( self.tenant, service, probe_id) event_service.delete_service_events(service) port_service.delete_region_port(self.tenant, service) volume_service.delete_region_volumes(self.tenant, service) env_var_service.delete_region_env(self.tenant, service) dependency_service.delete_region_dependency( self.tenant, service) app_manage_service.delete_region_service( self.tenant, service) service.create_status = "checked" service.save() 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
def post(self, request, *args, **kwargs): """ 组件构建 --- parameters: - name: tenantName description: 租户名 required: true type: string paramType: path - name: serviceAlias description: 组件别名 required: true type: string paramType: path """ probe = None is_deploy = request.data.get("is_deploy", True) try: if not check_memory_quota( self.oauth_instance, self.tenant.enterprise_id, self.service.min_memory, self.service.min_node): raise ServiceHandleException(msg="not enough quota", error_code=20002) if self.service.service_source == "third_party": is_deploy = False # create third component from region new_service = app_service.create_third_party_service( self.tenant, self.service, self.user.nick_name) else: # 数据中心创建组件 new_service = app_service.create_region_service( self.tenant, self.service, self.user.nick_name) self.service = new_service if is_deploy: try: app_manage_service.deploy( self.tenant, self.service, self.user, group_version=None, oauth_instance=self.oauth_instance) except ErrInsufficientResource as e: result = general_message(e.error_code, e.msg, e.msg_show) return Response(result, status=e.status_code) except Exception as e: logger.exception(e) err = ErrComponentBuildFailed() result = general_message(err.error_code, e, err.msg_show) return Response(result, status=400) # 添加组件部署关系 deploy_repo.create_deploy_relation_by_service_id( service_id=self.service.service_id) result = general_message(200, "success", "构建成功") return Response(result, status=result["code"]) except HttpClient.CallApiError as e: logger.exception(e) if e.status == 403: result = general_message(10407, "no cloud permission", e.message) status = e.status elif e.status == 400: if "is exist" in e.message.get("body", ""): result = general_message(400, "the service is exist in region", "该组件在数据中心已存在,你可能重复创建?") else: result = general_message(400, "call cloud api failure", e.message) status = e.status else: result = general_message(400, "call cloud api failure", e.message) status = 400 # 删除probe # 删除region端数据 if probe: probe_service.delete_service_probe(self.tenant, self.service, probe.probe_id) if self.service.service_source != "third_party": event_service.delete_service_events(self.service) port_service.delete_region_port(self.tenant, self.service) volume_service.delete_region_volumes(self.tenant, self.service) env_var_service.delete_region_env(self.tenant, self.service) dependency_service.delete_region_dependency( self.tenant, self.service) app_manage_service.delete_region_service(self.tenant, self.service) self.service.create_status = "checked" self.service.save() return Response(result, status=status)