def post(self, request, *args, **kwargs): """ 创建第三方组件 """ group_id = request.data.get("group_id", -1) service_cname = request.data.get("service_cname", None) endpoints = request.data.get("endpoints", None) endpoints_type = request.data.get("endpoints_type", None) if not service_cname: return Response(general_message(400, "service_cname is null", "组件名未指明"), status=400) if not endpoints and endpoints_type != "api": return Response(general_message(400, "end_point is null", "end_point未指明"), status=400) code, msg_show, new_service = app_service.create_third_party_app( self.response_region, self.tenant, self.user, service_cname, endpoints, endpoints_type) if code != 200: return Response(general_message(code, "service create fail", msg_show), status=code) # 添加组件所在组 code, msg_show = group_service.add_service_to_group( self.tenant, self.response_region, group_id, new_service.service_id) if code != 200: logger.debug("service.create", msg_show) if endpoints_type == "discovery": # 添加username,password信息 if "username" in endpoints and "password" in endpoints: if endpoints["username"] or endpoints["password"]: app_service.create_service_source_info( self.tenant, new_service, endpoints["username"], endpoints["password"]) bean = new_service.to_dict() if endpoints_type == "api": # 生成秘钥 deploy = deploy_repo.get_deploy_relation_by_service_id( service_id=new_service.service_id) api_secret_key = pickle.loads( base64.b64decode(deploy)).get("secret_key") # 从环境变量中获取域名,没有在从请求中获取 host = os.environ.get('DEFAULT_DOMAIN', "http://" + request.get_host()) api_url = host + "/console/" + "third_party/{0}".format( new_service.service_id) bean["api_service_key"] = api_secret_key bean["url"] = api_url result = general_message(200, "success", "创建成功", bean=bean) return Response(result, status=result["code"])
def save_compose_services(self, tenant, user, region, group_compose, data): # 开启保存点 sid = transaction.savepoint() service_list = [] try: if data["check_status"] == "success": if group_compose.create_status == "checking": logger.debug("checking compose service install,save info into database") # 先删除原来创建的组件 self.__delete_created_compose_info(tenant, group_compose.compose_id) # 保存compose检测结果 if data["check_status"] == "success": service_info_list = data["service_info"] service_dep_map = {} # 组件列表 name_service_map = {} for service_info in service_info_list: service_cname = service_info.get("cname", service_info["image_alias"]) image = service_info["image"]["name"] + ":" + service_info["image"]["tag"] # 保存信息 service = self.__init_compose_service(tenant, user, service_cname, image, region) # 缓存创建的组件 service_list.append(service) name_service_map[service_cname] = service group_service.add_service_to_group(tenant, region, group_compose.group_id, service.service_id) code, msg = app_check_service.save_service_info(tenant, service, service_info) if code != 200: return code, msg, None # save service info service.save() # 创建组件构建源信息,存储账号密码 envs = service_info.get("envs", []) hub_user = group_compose.hub_user hub_password = group_compose.hub_pass for env in envs: if env.get("name", "") == "HUB_USER": hub_user = env.get("value") if env.get("name", "") == "HUB_PASSWORD": hub_password = env.get("value") app_service.create_service_source_info(tenant, service, hub_user, hub_password) dependencies = service_info.get("depends", None) if dependencies: service_dep_map[service_cname] = dependencies # 保存compose-relation self.__save_compose_relation(service_list, tenant.tenant_id, group_compose.compose_id) # 保存依赖关系 self.__save_service_dep_relation(tenant, service_dep_map, name_service_map) group_compose.create_status = "checked" group_compose.save() transaction.savepoint_commit(sid) except Exception as e: logger.exception(e) if sid: transaction.savepoint_rollback(sid) return 500, "{0}".format(e.message), service_list return 200, "success", service_list
def post(self, request, *args, **kwargs): """ 创建三方服务 """ group_id = request.data.get("group_id", -1) service_cname = request.data.get("service_cname", None) endpoints = request.data.get("endpoints", None) endpoints_type = request.data.get("endpoints_type", None) try: if not service_cname: return Response(general_message(400, "service_cname is null", "服务名未指明"), status=400) if not endpoints and endpoints_type != "api": return Response(general_message(400, "end_point is null", "end_point未指明"), status=400) code, msg_show, new_service = app_service.create_third_party_app(self.response_region, self.tenant, self.user, service_cname, endpoints, endpoints_type) if code != 200: return Response(general_message(code, "service create fail", msg_show), status=code) # 添加服务所在组 code, msg_show = group_service.add_service_to_group(self.tenant, self.response_region, group_id, new_service.service_id) if code != 200: logger.debug("service.create", msg_show) if endpoints_type == "discovery": # 添加username,password信息 logger.debug('========dict=========>{0}'.format(type(endpoints))) if endpoints.has_key("username") and endpoints.has_key("password"): if endpoints["username"] or endpoints["password"]: app_service.create_service_source_info(self.tenant, new_service, endpoints["username"], endpoints["password"]) bean = new_service.to_dict() if endpoints_type == "api": # 生成秘钥 deploy = deploy_repo.get_deploy_relation_by_service_id(service_id=new_service.service_id) api_secret_key = pickle.loads(base64.b64decode(deploy)).get("secret_key") # 从环境变量中获取域名,没有在从请求中获取 host = os.environ.get('DEFAULT_DOMAIN', request.get_host()) api_url = "http://" + host + "/console/" + "third_party/{0}".format(new_service.service_id) bean["api_service_key"] = api_secret_key bean["url"] = api_url result = general_message(200, "success", "创建成功", bean=bean) except ResourceNotEnoughException as re: logger.exception(re) return Response(general_message(10406, "resource is not enough", re.message), status=412) except Exception as e: logger.exception(e) result = error_message(e.message) 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) 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 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 post(self, request, *args, **kwargs): """ 源码创建组件 --- parameters: - name: tenantName description: 租户名 required: true type: string paramType: path - name: group_id description: 组id required: true type: string paramType: form - name: code_from description: 组件代码来源 required: true type: string paramType: form - name: service_cname description: 组件名称 required: true type: string paramType: form - name: git_url description: git地址 required: false type: string paramType: form - name: git_project_id description: 代码ID required: false type: string paramType: form - name: code_version description: 代码版本 required: false type: string paramType: form - name: username description: 私有云用户名称 required: false type: string paramType: form - name: password description: 私有云账户密码 required: false type: string paramType: form - name: server_type description: 仓库类型git或svn required: false type: string paramType: form """ group_id = request.data.get("group_id", -1) service_code_from = request.data.get("code_from", None) service_cname = request.data.get("service_cname", None) service_code_clone_url = request.data.get("git_url", None) git_password = request.data.get("password", None) git_user_name = request.data.get("username", None) service_code_id = request.data.get("git_project_id", None) service_code_version = request.data.get("code_version", "master") server_type = request.data.get("server_type", "git") result = {} try: if not service_code_clone_url: return Response(general_message(400, "code url is null", "仓库地址未指明"), status=400) if not service_code_from: return Response(general_message(400, "params error", "参数service_code_from未指明"), status=400) if not server_type: return Response(general_message(400, "params error", "仓库类型未指明"), status=400) # 创建源码组件 if service_code_clone_url: service_code_clone_url = service_code_clone_url.strip() code, msg_show, new_service = app_service.create_source_code_app( self.response_region, self.tenant, self.user, service_code_from, service_cname, service_code_clone_url, service_code_id, service_code_version, server_type) if code != 200: return Response(general_message(code, "service create fail", msg_show), status=code) # 添加username,password信息 if git_password or git_user_name: app_service.create_service_source_info(self.tenant, new_service, git_user_name, git_password) # 添加组件所在组 code, msg_show = group_service.add_service_to_group( self.tenant, self.response_region, group_id, new_service.service_id) if code != 200: logger.debug("service.create", msg_show) result = general_message(200, "success", "创建成功", bean=new_service.to_dict()) except ResourceNotEnoughException as re: raise re except AccountOverdueException as re: logger.exception(re) return Response(general_message(10410, "resource is not enough", re.message), status=412) except Exception as e: logger.exception(e) result = error_message(e.message) return Response(result, status=result["code"])
def post(self, request, *args, **kwargs): """ 源码创建组件 --- parameters: - name: tenantName description: 租户名 required: true type: string paramType: path - name: group_id description: 组id required: true type: string paramType: form - name: code_from description: 组件代码来源 required: true type: string paramType: form - name: service_cname description: 组件名称 required: true type: string paramType: form - name: git_url description: git地址 required: false type: string paramType: form - name: git_project_id description: 代码ID required: false type: string paramType: form - name: code_version description: 代码版本 required: false type: string paramType: form - name: username description: 私有云用户名称 required: false type: string paramType: form - name: password description: 私有云账户密码 required: false type: string paramType: form - name: server_type description: 仓库类型git或svn required: false type: string paramType: form """ group_id = request.data.get("group_id", -1) service_code_from = request.data.get("code_from", None) service_cname = request.data.get("service_cname", None) service_code_clone_url = request.data.get("git_url", None) git_password = request.data.get("password", None) git_user_name = request.data.get("username", None) service_code_id = request.data.get("git_project_id", None) service_code_version = request.data.get("code_version", "master") is_oauth = request.data.get("is_oauth", False) check_uuid = request.data.get("check_uuid") event_id = request.data.get("event_id") server_type = request.data.get("server_type", "git") user_id = request.user.user_id oauth_service_id = request.data.get("service_id") git_full_name = request.data.get("full_name") git_service = None open_webhook = False host = os.environ.get('DEFAULT_DOMAIN', "http://" + request.get_host()) result = {} if is_oauth: open_webhook = request.data.get("open_webhook", False) try: oauth_service = oauth_repo.get_oauth_services_by_service_id(service_id=oauth_service_id) oauth_user = oauth_user_repo.get_user_oauth_by_user_id(service_id=oauth_service_id, user_id=user_id) except Exception as e: logger.debug(e) rst = {"data": {"bean": None}, "status": 400, "msg_show": "未找到OAuth服务, 请检查该服务是否存在且属于开启状态"} return Response(rst, status=200) try: git_service = get_oauth_instance(oauth_service.oauth_type, oauth_service, oauth_user) except Exception as e: logger.debug(e) rst = {"data": {"bean": None}, "status": 400, "msg_show": "未找到OAuth服务"} return Response(rst, status=200) if not git_service.is_git_oauth(): rst = {"data": {"bean": None}, "status": 400, "msg_show": "该OAuth服务不是代码仓库类型"} return Response(rst, status=200) service_code_from = "oauth_" + oauth_service.oauth_type try: if not service_code_clone_url: return Response(general_message(400, "code url is null", "仓库地址未指明"), status=400) if not service_code_from: return Response(general_message(400, "params error", "参数service_code_from未指明"), status=400) if not server_type: return Response(general_message(400, "params error", "仓库类型未指明"), status=400) # 创建源码组件 if service_code_clone_url: service_code_clone_url = service_code_clone_url.strip() code, msg_show, new_service = app_service.create_source_code_app( self.response_region, self.tenant, self.user, service_code_from, service_cname, service_code_clone_url, service_code_id, service_code_version, server_type, check_uuid, event_id, oauth_service_id, git_full_name) if code != 200: return Response(general_message(code, "service create fail", msg_show), status=code) # 添加username,password信息 if git_password or git_user_name: app_service.create_service_source_info(self.tenant, new_service, git_user_name, git_password) # 自动添加hook if open_webhook and is_oauth and not new_service.open_webhooks: service_webhook = service_webhooks_repo.create_service_webhooks(new_service.service_id, "code_webhooks") service_webhook.state = True service_webhook.deploy_keyword = "deploy" service_webhook.save() try: git_service.create_hook(host, git_full_name, endpoint='console/webhooks/' + new_service.service_id) new_service.open_webhooks = True except Exception as e: logger.exception(e) new_service.open_webhooks = False new_service.save() # 添加组件所在组 code, msg_show = group_service.add_service_to_group(self.tenant, self.response_region, group_id, new_service.service_id) if code != 200: logger.debug("service.create", msg_show) bean = new_service.to_dict() result = general_message(200, "success", "创建成功", bean=bean) except ResourceNotEnoughException as re: raise re except AccountOverdueException as re: logger.exception(re) return Response(general_message(10410, "resource is not enough", re.message), status=412) return Response(result, status=result["code"])
def post(self, request, *args, **kwargs): """ image和docker-run创建应用 --- parameters: - name: tenantName description: 租户名 required: true type: string paramType: path - name: group_id description: 组id required: true type: string paramType: form - name: service_cname description: 应用名称 required: true type: string paramType: form - name: docker_cmd description: docker运行命令 required: true type: string paramType: form - name: image_type description: 创建方式 docker_run或docker_image required: true type: string paramType: form """ image_type = request.data.get("image_type", None) group_id = request.data.get("group_id", -1) service_cname = request.data.get("service_cname", None) docker_cmd = request.data.get("docker_cmd", "") # 私有docker仓库地址 docker_password = request.data.get("password", None) docker_user_name = request.data.get("user_name", None) try: if not image_type: return Response(general_message(400, "image_type cannot be null", "参数错误"), status=400) if not docker_cmd: return Response(general_message(400, "docker_cmd cannot be null", "参数错误"), status=400) code, msg_show, new_service = app_service.create_docker_run_app(self.response_region, self.tenant, self.user, service_cname, docker_cmd, image_type) if code != 200: return Response(general_message(code, "service create fail", msg_show), status=code) # 添加username,password信息 if docker_password or docker_user_name: app_service.create_service_source_info(self.tenant, new_service, docker_user_name, docker_password) code, msg_show = group_service.add_service_to_group(self.tenant, self.response_region, group_id, new_service.service_id) if code != 200: logger.debug("service.create", msg_show) result = general_message(200, "success", "创建成功", bean=new_service.to_dict()) except ResourceNotEnoughException as re: logger.exception(re) return Response(general_message(10406, "resource is not enough", re.message), status=412) except Exception as e: logger.exception(e) result = error_message() return Response(result, status=result["code"])