def put(self, request, *args, **kwargs): """ 修改构建源 --- """ s_id = transaction.savepoint() try: image = request.data.get("image", None) cmd = request.data.get("cmd", None) service_source = request.data.get("service_source") git_url = request.data.get("git_url", None) code_version = request.data.get("code_version", None) user_name = request.data.get("user_name", None) password = request.data.get("password", None) if not service_source: return Response(general_message(400, "param error", "参数错误"), status=400) service_source_user = service_source_repo.get_service_source(team_id=self.service.tenant_id, service_id=self.service.service_id) if not service_source_user: service_source_info = { "service_id": self.service.service_id, "team_id": self.service.tenant_id, "user_name": user_name, "password": password, "create_time": datetime.datetime.now().strftime('%Y%m%d%H%M%S') } service_source_repo.create_service_source(**service_source_info) else: service_source_user.user_name = user_name service_source_user.password = password service_source_user.save() if service_source == "source_code": if code_version: self.service.code_version = code_version else: self.service.code_version = "master" if git_url: self.service.git_url = git_url self.service.save() transaction.savepoint_commit(s_id) elif service_source == "docker_run": if image: version = image.split(':')[-1] if not version: version = "latest" image = image + ":" + version self.service.image = image self.service.version = version self.service.cmd = cmd self.service.save() transaction.savepoint_commit(s_id) result = general_message(200, "success", "修改成功") except Exception as e: logger.exception(e) result = error_message(e.message) transaction.savepoint_rollback(s_id) return Response(result, status=result["code"])
def _create_components(self, app_id, upgrade_group_id): components = group_service.list_components_by_upgrade_group_id(app_id, upgrade_group_id) component_ids = [cpt.component_id for cpt in components] http_rules = self._list_http_rules(component_ids) tcp_rules = self._list_tcp_rules(component_ids) result = [] # TODO(huangrh): get the attributes at once, don't get it iteratively for cpt in components: component_source = service_source_repo.get_service_source(cpt.tenant_id, cpt.service_id) envs = env_var_repo.get_service_env(cpt.tenant_id, cpt.service_id) ports = port_repo.get_service_ports(cpt.tenant_id, cpt.service_id) volumes = volume_repo.get_service_volumes_with_config_file(cpt.service_id) config_files = volume_repo.get_service_config_files(cpt.service_id) probes = probe_repo.list_probes(cpt.service_id) monitors = service_monitor_repo.list_by_service_ids(cpt.tenant_id, [cpt.service_id]) graphs = component_graph_repo.list(cpt.service_id) component = Component( cpt, component_source, envs, ports, volumes, config_files, probes, None, monitors, graphs, [], http_rules=http_rules.get(cpt.component_id), tcp_rules=tcp_rules.get(cpt.component_id), support_labels=self.support_labels) result.append(component) return result
def __init__(self, service, tenant, all_component_one_model=None, only_one_component=False, install_from_cloud=False): self.service = service self.tenant = tenant self.service_source = service_source_repo.get_service_source( service.tenant_id, service.service_id) self.current_version = self.service_source.version self.install_from_cloud = False self.market_name = None self.only_one_component = only_one_component self.market = None self.all_component_one_model = all_component_one_model if self.service_source and self.service_source.extend_info: extend_info = json.loads(self.service_source.extend_info) if extend_info and extend_info.get("install_from_cloud", False): self.install_from_cloud = True if self.install_from_cloud: self.market_name = extend_info.get("market_name", None) self.market = app_market_repo.get_app_market_by_name( tenant.enterprise_id, self.market_name, raise_exception=True)
def __init__(self, tenant, service, version): self.tenant = tenant self.service = service self.service_source = service_source_repo.get_service_source( tenant.tenant_id, service.service_id) if self.service_source.extend_info: extend_info = json.loads(self.service_source.extend_info) self.install_from_cloud = extend_info.get("install_from_cloud", False) if self.install_from_cloud: logger.info("service {0} imstall from cloud".format( service.service_alias)) else: self.install_from_cloud = False # If no version is specified, the default version is used. if not version: version = self.service_source.version self.version = version self.group_key = self.service_source.group_key self.changes = {} # data that has been successfully changed self.changed = {} self.backup = None self.async_action = None self.update_funcs = self._create_update_funcs() self.sync_funcs = self._create_sync_funcs() self.restore_func = self._create_restore_funcs() self.async_build, self.async_update = self._create_async_action_tbl() self.app_restore = AppRestore(tenant, service) self.auto_restore = True
def create_plugin_cfg_4marketsvc(self, tenant, service, version, plugin_id, build_version, service_plugin_config_vars): service_source = service_source_repo.get_service_source( tenant.tenant_id, service.service_id) config_list = [] for config in service_plugin_config_vars: dest_service_id, dest_service_alias = "", "" if config["service_meta_type"] == "downstream_port": service_key = rbd_center_app_service.get_service_key_by_service_id( tenant, service_source, version, config["dest_service_id"]) dest_service = app_service.get_service_by_service_key( service, service_key) dest_service_id = dest_service.service_id dest_service_alias = dest_service.service_alias config_list.append( ServicePluginConfigVar( service_id=service.service_id, plugin_id=plugin_id, build_version=build_version, service_meta_type=config["service_meta_type"], injection=config["injection"], dest_service_id=dest_service_id, dest_service_alias=dest_service_alias, container_port=config["container_port"], attrs=config["attrs"], protocol=config["protocol"])) ServicePluginConfigVar.objects.bulk_create(config_list)
def get(self, request, *args, **kwargs): """ 应用详情信息 --- parameters: - name: tenantName description: 租户名 required: true type: string paramType: path - name: serviceAlias description: 服务别名 required: true type: string paramType: path """ try: if self.service.service_source == "market": service_source = service_source_repo.get_service_source(self.tenant.tenant_id, self.service.service_id) if not service_source: result = general_message(200, "success", "当前云市应用已删除", bean=self.service.to_dict()) return Response(result, status=result["code"]) rain_app = rainbond_app_repo.get_rainbond_app_by_key_and_version(service_source.group_key, service_source.version) if not rain_app: result = general_message(200, "success", "当前云市应用已删除", bean=self.service.to_dict()) return Response(result, status=result["code"]) result = general_message(200, "success", "查询成功", bean=self.service.to_dict()) except Exception as e: logger.exception(e) result = error_message(e.message) return Response(result, status=result["code"])
def _app_template_source(app_id, app_model_key, upgrade_group_id): components = group_service.get_rainbond_services(app_id, app_model_key, upgrade_group_id) if not components: raise AbortRequest("components not found", "找不到组件", status_code=404, error_code=404) component = components[0] component_source = service_source_repo.get_service_source(component.tenant_id, component.service_id) return component_source
def get(self, request, *args, **kwargs): """ 查询构建源信息 --- """ try: service_source = service_source_repo.get_service_source( team_id=self.service.tenant_id, service_id=self.service.service_id) bean = { "user_name": "", "password": "", "service_source": self.service.service_source, "image": self.service.image, "cmd": self.service.cmd, "code_from": self.service.code_from, "version": self.service.version, "docker_cmd": self.service.docker_cmd, "create_time": self.service.create_time, "git_url": self.service.git_url, "code_version": self.service.code_version, "server_type": self.service.server_type, "language": self.service.language, } if service_source: bean["user"] = service_source.user_name bean["password"] = service_source.password if self.service.service_source == 'market': if service_source: # get from cloud rain_app = None if service_source.extend_info: extend_info = json.loads(service_source.extend_info) if extend_info and extend_info.get( "install_from_cloud", False): rain_app = market_app_service.get_app_from_cloud( self.tenant, service_source.group_key, service_source.version) bean["install_from_cloud"] = True bean["app_detail_url"] = rain_app.describe if not rain_app: rain_app = rainbond_app_repo.get_rainbond_app_by_key_and_version( service_source.group_key, service_source.version) if rain_app: bean["rain_app_name"] = rain_app.group_name bean["details"] = rain_app.details logger.debug("app_version: {}".format( rain_app.version)) bean["app_version"] = rain_app.version bean["version"] = rain_app.version bean["group_key"] = rain_app.group_key result = general_message(200, "success", "查询成功", bean=bean) except ServiceHandleException as e: raise e except Exception as e: logger.exception(e) result = error_message(e.message) return Response(result, status=result["code"])
def check_service(self, tenant, service, is_again): # if service.create_status == "complete": # return 409, "应用完成创建,请勿重复检测", None body = dict() body["tenant_id"] = tenant.tenant_id body["source_type"] = self.__get_service_region_type( service.service_source) source_body = "" service_source = service_source_repo.get_service_source( tenant.tenant_id, service.service_id) user_name = "" password = "" service.service_source = self.__get_service_source(service) if service_source: user_name = service_source.user_name password = service_source.password if service.service_source == AppConstants.SOURCE_CODE: sb = { "server_type": service.server_type, "repository_url": service.git_url, "branch": service.code_version, "user": user_name, "password": password, "tenant_id": tenant.tenant_id } source_body = json.dumps(sb) elif service.service_source == AppConstants.DOCKER_RUN or service.service_source == AppConstants.DOCKER_IMAGE: source_body = service.docker_cmd elif service.service_source == AppConstants.THIRD_PARTY: # endpoints信息 service_endpoints = service_endpoints_repo.get_service_endpoints_by_service_id( service.service_id) if service_endpoints: if service_endpoints.endpoints_type == "discovery": source_body = service_endpoints.endpoints_info body["username"] = user_name body["password"] = password body["source_body"] = source_body logger.debug('======body========>{0}'.format(json.dumps(body))) res, body = region_api.service_source_check(service.service_region, tenant.tenant_name, body) bean = body["bean"] service.check_uuid = bean["check_uuid"] service.check_event_id = bean["event_id"] # 更新创建状态 if not is_again: service.create_status = "checking" service.save() bean = dict() bean.update(service.to_dict()) bean.update({"user_name": user_name, "password": password}) bean.update(self.__wrap_check_service(service)) return 200, u"success", bean
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 get(self, request, *args, **kwargs): """ 查询构建源信息 --- """ try: service_source = service_source_repo.get_service_source(team_id=self.service.tenant_id, service_id=self.service.service_id) bean = { "user_name": "", "password": "" } if service_source: bean["user"] = service_source.user_name bean["password"] = service_source.password if self.service.service_source == 'market': if service_source: # 获取内部市场对象 rain_app = rainbond_app_repo.get_rainbond_app_by_key_and_version(service_source.group_key, service_source.version) if rain_app: bean["rain_app_name"] = rain_app.group_name bean["details"] = rain_app.details logger.debug("app_version: {}".format(rain_app.version)) bean["app_version"] = rain_app.version bean["group_key"] = rain_app.group_key bean["service_source"] = self.service.service_source bean["image"] = self.service.image bean["cmd"] = self.service.cmd bean["code_from"] = self.service.code_from bean["version"] = self.service.version bean["docker_cmd"] = self.service.docker_cmd bean["create_time"] = self.service.create_time bean["git_url"] = self.service.git_url bean["code_version"] = self.service.code_version bean["server_type"] = self.service.server_type bean["language"] = self.service.language if self.service.service_source == 'market': if service_source: # 获取内部市场对象 rain_app = rainbond_app_repo.get_rainbond_app_by_key_and_version(service_source.group_key, service_source.version) if rain_app: bean["rain_app_name"] = rain_app.group_name bean["details"] = rain_app.details logger.debug("version: {}".format(rain_app.version)) bean["version"] = rain_app.version bean["group_key"] = rain_app.group_key result = general_message(200, "success", "查询成功", bean=bean) except Exception as e: logger.exception(e) result = error_message(e.message) return Response(result, status=result["code"])
def get(self, request, *args, **kwargs): """ 查询构建源信息 --- """ service_alias = self.service.service_alias try: service_source = team_services.get_service_source( service_alias=service_alias) service_source_user = service_source_repo.get_service_source( team_id=self.service.tenant_id, service_id=self.service.service_id) user = "" password = "" bean = {} if service_source_user: user = service_source_user.user_name password = service_source_user.password bean["user_name"] = user bean["password"] = password if not service_source: return Response(general_message(404, "no found source", "没有这个应用的构建源"), status=404) if service_source.service_source == 'market': # 获取组对象 group_obj = tenant_service_group_repo.get_group_by_service_group_id( service_source.tenant_service_group_id) if group_obj: # 获取内部市场对象 rain_app = rainbond_app_repo.get_rainbond_app_by_key_and_version( group_obj.group_key, group_obj.group_version) if rain_app: bean["rain_app_name"] = rain_app.group_name bean["details"] = rain_app.details bean["app_version"] = rain_app.version bean["group_key"] = rain_app.group_key bean["service_source"] = service_source.service_source bean["image"] = service_source.image bean["cmd"] = service_source.cmd bean["code_from"] = service_source.code_from bean["version"] = service_source.version bean["docker_cmd"] = service_source.docker_cmd bean["create_time"] = service_source.create_time bean["git_url"] = service_source.git_url bean["code_version"] = service_source.code_version bean["server_type"] = service_source.server_type bean["language"] = service_source.language result = general_message(200, "success", "查询成功", bean=bean) except Exception as e: logger.exception(e) result = error_message(e.message) return Response(result, status=result["code"])
def __init__(self, service, tenant, all_component_one_model=None, only_one_component=False, install_from_cloud=False): self.service = service self.tenant = tenant self.service_source = service_source_repo.get_service_source(service.tenant_id, service.service_id) self.current_version = self.service_source.version self.install_from_cloud = self.service_source.is_install_from_cloud() self.market_name = self.service_source.get_market_name() self.only_one_component = only_one_component self.market = None self.all_component_one_model = all_component_one_model if self.install_from_cloud and self.market_name: self.market = app_market_repo.get_app_market_by_name(tenant.enterprise_id, self.market_name, raise_exception=True)
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 __init__(self, service, tenant, install_from_cloud=False): self.service = service self.tenant = tenant self.current_version = None self.current_app = None self.template = None self.service_source = service_source_repo.get_service_source( service.tenant_id, service.service_id) self.install_from_cloud = False if self.service_source and self.service_source.extend_info: self.current_version_str = self.service_source.version extend_info = json.loads(self.service_source.extend_info) if extend_info and extend_info.get("install_from_cloud", False): self.install_from_cloud = True self.__get_current_app_and_version()
def app_template_source(self): """ Optimization: the component group should save the source of the app template itself. """ components = group_service.get_rainbond_services( self.app_id, self.app_model_key, self.upgrade_group_id) if not components: raise AbortRequest("components not found", "找不到组件", status_code=404, error_code=404) component = components[0] component_source = service_source_repo.get_service_source( component.tenant_id, component.service_id) return component_source
def check_service(self, tenant, service): if service.create_status == "complete": return 409, "应用完成创建,请勿重复检测", None body = dict() body["tenant_id"] = tenant.tenant_id body["source_type"] = self.__get_service_region_type( service.service_source) source_body = "" service_source = service_source_repo.get_service_source( tenant.tenant_id, service.service_id) user_name = "" password = "" service.service_source = self.__get_service_source(service) if service_source: user_name = service_source.user_name password = service_source.password if service.service_source == AppConstants.SOURCE_CODE: sb = { "server_type": service.server_type, "repository_url": service.git_url, "branch": service.code_version, "user": user_name, "password": password, "tenant_id": tenant.tenant_id } source_body = json.dumps(sb) elif service.service_source == AppConstants.DOCKER_RUN or service.service_source == AppConstants.DOCKER_IMAGE: source_body = service.docker_cmd body["username"] = user_name body["password"] = password body["source_body"] = source_body res, body = region_api.service_source_check(service.service_region, tenant.tenant_name, body) bean = body["bean"] service.check_uuid = bean["check_uuid"] service.check_event_id = bean["event_id"] # 更新创建状态 service.create_status = "checking" service.save() bean = dict() bean.update(service.to_dict()) bean.update({"user_name": user_name, "password": password}) bean.update(self.__wrap_check_service(service)) return 200, u"success", bean
def modify_property(self): """ Perform modifications to the given properties. must be called after `set_changes`. """ service_source = service_source_repo.get_service_source( self.tenant.tenant_id, self.service.service_id) app = rbd_center_app_service.get_version_app(self.tenant.enterprise_id, self.version, service_source) self._update_service(app) self._update_service_source(app, self.version) changes = deepcopy(self.changes) for k, v in changes.items(): func = self.update_funcs.get(k, None) if func is None: continue func(v)
def get_service_details(self, tenant, service): service_base = service.to_dict() service_labels = service_label_repo.get_service_labels(service.service_id) service_domains = domain_repo.get_service_domains(service.service_id) service_tcpdomains = tcp_domain.get_service_tcpdomains(service.service_id) service_events = event_repo.get_specified_num_events(tenant.tenant_id, service.service_id) service_perms = service_perm_repo.get_service_perms_by_service_pk(service.ID) service_probes = probe_repo.get_service_probe(service.service_id) service_source = service_source_repo.get_service_source(tenant.tenant_id, service.service_id) service_auths = auth_repo.get_service_auth(service.service_id) service_env_vars = env_var_repo.get_service_env(tenant.tenant_id, service.service_id) service_compile_env = compile_env_repo.get_service_compile_env(service.service_id) service_extend_method = extend_repo.get_extend_method_by_service(service) image_service_relation = image_service_relation_repo.get_image_service_relation(tenant.tenant_id, service.service_id) service_mnts = mnt_repo.get_service_mnts(tenant.tenant_id, service.service_id) service_plugin_relation = app_plugin_relation_repo.get_service_plugin_relation_by_service_id(service.service_id) service_plugin_config = service_plugin_config_repo.get_service_plugin_all_config(service.service_id) service_relation = dep_relation_repo.get_service_dependencies(tenant.tenant_id, service.service_id) service_volumes = volume_repo.get_service_volumes(service.service_id) service_config_file = volume_repo.get_service_config_files(service.service_id) service_ports = port_repo.get_service_ports(tenant.tenant_id, service.service_id) app_info = { "service_base": service_base, "service_labels": [label.to_dict() for label in service_labels], "service_domains": [domain.to_dict() for domain in service_domains], "service_tcpdomains": [tcpdomain.to_dict() for tcpdomain in service_tcpdomains], "service_events": [event.to_dict() for event in service_events], "service_perms": [perm.to_dict() for perm in service_perms], "service_probes": [probe.to_dict() for probe in service_probes], "service_source": service_source.to_dict() if service_source else None, "service_auths": [auth.to_dict() for auth in service_auths], "service_env_vars": [env_var.to_dict() for env_var in service_env_vars], "service_compile_env": service_compile_env.to_dict() if service_compile_env else None, "service_extend_method": service_extend_method.to_dict() if service_extend_method else None, "image_service_relation": image_service_relation.to_dict() if image_service_relation else None, "service_mnts": [mnt.to_dict() for mnt in service_mnts], "service_plugin_relation": [plugin_relation.to_dict() for plugin_relation in service_plugin_relation], "service_plugin_config": [config.to_dict() for config in service_plugin_config], "service_relation": [relation.to_dict() for relation in service_relation], "service_volumes": [volume.to_dict() for volume in service_volumes], "service_config_file": [config_file.to_dict() for config_file in service_config_file], "service_ports": [port.to_dict() for port in service_ports] } return app_info
def __init__(self, tenant, service, version): self.tenant = tenant self.service = service if version is None: service_source = service_source_repo.get_service_source( tenant.tenant_id, service.service_id) version = service_source.version self.version = version # data that has been successfully changed self.changed = {} self.backup = None self.async_action = None self.update_funcs = self._create_update_funcs() self.sync_funcs = self._create_sync_funcs() self.restore_func = self._create_restore_funcs() self.async_build, self.async_update = self._create_async_action_tbl()
def __init__(self, tenant, service, version, all_component_one_model=None, component_change_info=None, app_version=None): self.tenant = tenant self.service = service self.market_name = None # tenant service models self.all_component_one_model = all_component_one_model self.service_source = service_source_repo.get_service_source( tenant.tenant_id, service.service_id) self.install_from_cloud = self.service_source.is_install_from_cloud() self.market_name = self.service_source.get_market_name() # If no version is specified, the default version is used. self.async_action = None if not version: version = self.service_source.version self.async_action = AsyncAction.BUILD.value self.version = version self.group_key = self.service_source.group_key self.changes = component_change_info if app_version: self.template = json.loads(app_version.app_template) self.template_update_time = app_version.update_time else: self.template = None self.template_update_time = None self.update_source = False # data that has been successfully changed self.changed = {} self.backup = None self.update_funcs = self._create_update_funcs() self.sync_funcs = self._create_sync_funcs() self.restore_func = self._create_restore_funcs() self.async_build, self.async_update = self._create_async_action_tbl() self.app_restore = AppRestore(tenant, service) self.auto_restore = True
def update_check_app(self, tenant, service, data): service_source = service_source_repo.get_service_source( tenant.tenant_id, service.service_id) service_cname = data.get("service_cname", service.service_cname) image = data.get("image", service.image) cmd = data.get("cmd", service.cmd) docker_cmd = data.get("docker_cmd", service.docker_cmd) git_url = data.get("git_url", service.git_url) min_memory = data.get("min_memory", service.min_memory) min_memory = int(min_memory) min_cpu = baseService.calculate_service_cpu(service.service_region, min_memory) extend_method = data.get("extend_method", service.extend_method) service.service_cname = service_cname service.min_memory = min_memory service.min_cpu = min_cpu service.extend_method = extend_method service.image = image service.cmd = cmd service.git_url = git_url service.docker_cmd = docker_cmd service.save() user_name = data.get("user_name", None) password = data.get("password", None) if user_name is not None: if not service_source: params = { "team_id": tenant.tenant_id, "service_id": service.service_id, "user_name": user_name, "password": password, } service_source_repo.create_service_source(**params) else: service_source.user_name = user_name service_source.password = password service_source.save() return 200, "success"
def __init__(self, service, tenant, install_from_cloud=False): self.service = service self.tenant = tenant self.current_version = None self.current_app = None self.template = None self.service_source = service_source_repo.get_service_source(service.tenant_id, service.service_id) self.install_from_cloud = False self.market_name = None self.market = None if self.service_source and self.service_source.extend_info: self.current_version_str = self.service_source.version extend_info = json.loads(self.service_source.extend_info) if extend_info and extend_info.get("install_from_cloud", False): self.install_from_cloud = True if self.install_from_cloud: self.market_name = extend_info.get("market_name", None) self.market = app_market_repo.get_app_market_by_name( tenant.enterprise_id, self.market_name, raise_exception=True) self.__get_current_app_and_version()
def upgrade_component(self, tenant, region, user, app, component: TenantServiceInfo, version): component_group = tenant_service_group_repo.get_component_group(component.upgrade_group_id) app_template_source = service_source_repo.get_service_source(component.tenant_id, component.component_id) app_template = self._app_template(user.enterprise_id, component_group.group_key, version, app_template_source) app_upgrade = AppUpgrade( tenant.enterprise_id, tenant, region, user, app, version, component_group, app_template, app_template_source.is_install_from_cloud(), app_template_source.get_market_name(), component_keys=[component.service_key], is_deploy=True, is_upgrade_one=True) app_upgrade.upgrade()
def __init__(self, service, tenant, install_from_cloud=False): self.service = service self.tenant = tenant self.install_from_cloud = install_from_cloud self.service_source = service_source_repo.get_service_source( service.tenant_id, service.service_id)
def get_build_info(self, tenant, service): service_source = service_source_repo.get_service_source( team_id=service.tenant_id, service_id=service.service_id) code_from = service.code_from oauth_type = support_oauth_type.keys() if code_from in oauth_type: result_url = re_split("[:,@]", service.git_url) service.git_url = result_url[0] + '//' + result_url[-1] bean = { "user_name": "", "password": "", "service_source": service.service_source, "image": service.image, "cmd": service.cmd, "code_from": service.code_from, "version": service.version, "docker_cmd": service.docker_cmd, "create_time": service.create_time, "git_url": service.git_url, "code_version": service.code_version, "server_type": service.server_type, "language": service.language, "oauth_service_id": service.oauth_service_id, "full_name": service.git_full_name } if service_source: bean["user"] = service_source.user_name bean["password"] = service_source.password if service.service_source == 'market': from console.services.market_app_service import market_app_service if service_source: # get from cloud app = None app_version = None if service_source.extend_info: extend_info = json.loads(service_source.extend_info) if extend_info and extend_info.get("install_from_cloud", False): app, app_version = market_app_service.get_app_from_cloud( tenant, service_source.group_key, service_source.version) bean["install_from_cloud"] = True bean["app_detail_url"] = app.describe if not app: try: app, app_version = market_app_service.get_rainbond_app_and_version( tenant.enterprise_id, service_source.group_key, service_source.version) except RbdAppNotFound: logger.warning( "not found app {0} version {1} in local market". format(service_source.group_key, service_source.version)) if app and app_version: bean["rain_app_name"] = app.app_name bean["details"] = app.details logger.debug("app_version: {}".format(app_version.version)) bean["app_version"] = app_version.version bean["version"] = app_version.version bean["group_key"] = app.app_id return bean
def get(self, request, *args, **kwargs): try: bean = dict() upgrate_version_list = [] # 判断服务状态,未部署的服务不提供升级数据 try: body = region_api.check_service_status( self.service.service_region, self.tenant.tenant_name, self.service.service_alias, self.tenant.enterprise_id) bean = body["bean"] status = bean["cur_status"] except Exception as e: logger.exception(e) status = "unKnow" if status == "undeploy": result = general_message(200, "success", "查询成功", bean=bean, list=upgrate_version_list) return Response(result, status=result["code"]) if self.service.service_source != "market": return Response(general_message( 400, "non-cloud installed applications require no judgment", "非云市安装的应用无需判断"), status=400) # 获取组对象 group_obj = tenant_service_group_repo.get_group_by_service_group_id( self.service.tenant_service_group_id) if group_obj: # 获取内部市场对象 rain_app = rainbond_app_repo.get_rainbond_app_by_key_and_version( group_obj.group_key, group_obj.group_version) if not rain_app: result = general_message(200, "success", "当前云市应用已删除") return Response(result, status=result["code"]) else: apps_template = json.loads(rain_app.app_template) apps_list = apps_template.get("apps") for app in apps_list: if app["service_key"] == self.service.service_key: if app["deploy_version"] > self.service.deploy_version: self.service.is_upgrate = True self.service.save() try: apps_template = json.loads(rain_app.app_template) apps_list = apps_template.get("apps") service_source = service_source_repo.get_service_source( self.service.tenant_id, self.service.service_id) if service_source and service_source.extend_info: extend_info = json.loads( service_source.extend_info) if extend_info: for app in apps_list: logger.debug( '---------====app===============>{0}'. format(json.dumps(app))) logger.debug( '---------=====extend_info==============>{0}' .format(json.dumps(extend_info))) if app.has_key("service_share_uuid"): if app["service_share_uuid"] == extend_info[ "source_service_share_uuid"]: new_version = int( app["deploy_version"]) old_version = int(extend_info[ "source_deploy_version"]) if new_version > old_version: self.service.is_upgrate = True self.service.save() elif not app.has_key("service_share_uuid" ) and app.has_key( "service_key"): if app["service_key"] == extend_info[ "source_service_share_uuid"]: new_version = int( app["deploy_version"]) old_version = int(extend_info[ "source_deploy_version"]) if new_version > old_version: self.service.is_upgrate = True self.service.save() bean["is_upgrate"] = self.service.is_upgrate except Exception as e: logger.exception(e) result = error_message(e.message) return Response(result, status=result["code"]) # 通过group_key获取不同版本的应用市场对象 rain_apps = rainbond_app_repo.get_rainbond_app_by_key( group_obj.group_key) if rain_apps: for r_app in rain_apps: if r_app.version > group_obj.group_version and r_app.version not in upgrate_version_list: upgrate_version_list.append(r_app.version) elif r_app.version == group_obj.group_version and self.service.is_upgrate: upgrate_version_list.append(r_app.version) upgrate_version_list.sort() result = general_message(200, "success", "查询成功", bean=bean, list=upgrate_version_list) except Exception as e: logger.exception(e) result = error_message(e.message) return Response(result, status=result["code"])
def put(self, request, *args, **kwargs): """ 修改构建源 --- """ s_id = transaction.savepoint() try: image = request.data.get("image", None) cmd = request.data.get("cmd", None) service_source = request.data.get("service_source") git_url = request.data.get("git_url", None) code_version = request.data.get("code_version", None) user_name = request.data.get("user_name", None) password = request.data.get("password", None) is_oauth = request.data.get("is_oauth", False) user_id = request.user.user_id oauth_service_id = request.data.get("service_id") git_full_name = request.data.get("full_name") if not service_source: return Response(general_message(400, "param error", "参数错误"), status=400) service_source_user = service_source_repo.get_service_source( team_id=self.service.tenant_id, service_id=self.service.service_id) if not service_source_user: service_source_info = { "service_id": self.service.service_id, "team_id": self.service.tenant_id, "user_name": user_name, "password": password, "create_time": datetime.datetime.now().strftime('%Y%m%d%H%M%S') } service_source_repo.create_service_source( **service_source_info) else: service_source_user.user_name = user_name service_source_user.password = password service_source_user.save() if service_source == "source_code": if code_version: self.service.code_version = code_version else: self.service.code_version = "master" if git_url: if is_oauth: 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) try: instance = 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": u"未找到OAuth服务" } return Response(rst, status=200) if not instance.is_git_oauth(): rst = { "data": { "bean": None }, "status": 400, "msg_show": u"该OAuth服务不是代码仓库类型" } return Response(rst, status=200) service_code_from = "oauth_" + oauth_service.oauth_type self.service.code_from = service_code_from self.service.git_url = git_url self.service.git_full_name = git_full_name self.service.oauth_service_id = oauth_service_id else: self.service.git_url = git_url self.service.save() transaction.savepoint_commit(s_id) elif service_source == "docker_run": if image: version = image.split(':')[-1] if not version: version = "latest" image = image + ":" + version self.service.image = image self.service.version = version self.service.cmd = cmd self.service.save() transaction.savepoint_commit(s_id) result = general_message(200, "success", "修改成功") except Exception as e: logger.exception(e) result = error_message(e.message) transaction.savepoint_rollback(s_id) return Response(result, status=result["code"])
def get(self, request, *args, **kwargs): """ 组件详情信息 --- parameters: - name: tenantName description: 租户名 required: true type: string paramType: path - name: serviceAlias description: 组件别名 required: true type: string paramType: path """ bean = dict() try: # status_map = app_service.get_service_status(self.tenant, self.service) # used_resource = app_service.get_service_resource_with_plugin(self.tenant, self.service, # status_map["status"]) # service_abled_plugins = app_plugin_service.get_service_abled_plugin(self.service) # plugin_list = [p.to_dict() for p in service_abled_plugins] # bean.update(status_map) # bean.update(used_resource) # bean.update({"plugin_list": plugin_list}) service_model = self.service.to_dict() group_map = group_service.get_services_group_name( [self.service.service_id]) group_name = group_map.get(self.service.service_id)["group_name"] group_id = group_map.get(self.service.service_id)["group_id"] service_model["group_name"] = group_name service_model["group_id"] = group_id bean.update({"service": service_model}) tenant_actions = self.user.actions.tenant_actions bean.update({"tenant_actions": tenant_actions}) service_actions = self.user.actions.service_actions bean.update({"service_actions": service_actions}) event_websocket_url = ws_service.get_event_log_ws( self.request, self.service.service_region) bean.update({"event_websocket_url": event_websocket_url}) if self.service.service_source == "market": service_source = service_source_repo.get_service_source( self.tenant.tenant_id, self.service.service_id) if not service_source: result = general_message(200, "success", "查询成功", bean=bean) return Response(result, status=result["code"]) rain_app = rainbond_app_repo.get_rainbond_app_by_key_and_version( service_source.group_key, service_source.version) if not rain_app: result = general_message(200, "success", "当前云市组件已删除", bean=bean) return Response(result, status=result["code"]) else: bean.update({"rain_app_name": rain_app.group_name}) apps_template = json.loads(rain_app.app_template) apps_list = apps_template.get("apps") for app in apps_list: if app["service_key"] == self.service.service_key: if self.service.deploy_version and int( app["deploy_version"]) > int( self.service.deploy_version): self.service.is_upgrate = True self.service.save() bean.update({"service": service_model}) try: apps_template = json.loads(rain_app.app_template) apps_list = apps_template.get("apps") service_source = service_source_repo.get_service_source( self.service.tenant_id, self.service.service_id) if service_source and service_source.extend_info: extend_info = json.loads( service_source.extend_info) if extend_info: for app in apps_list: if "service_share_uuid" in app: if app["service_share_uuid"] == extend_info[ "source_service_share_uuid"]: new_version = int( app["deploy_version"]) old_version = int(extend_info[ "source_deploy_version"]) if new_version > old_version: self.service.is_upgrate = True self.service.save() service_model[ "is_upgrade"] = True bean.update( {"service": service_model}) elif "service_share_uuid" not in app and "service_key" in app: if app["service_key"] == extend_info[ "source_service_share_uuid"]: new_version = int( app["deploy_version"]) old_version = int(extend_info[ "source_deploy_version"]) if new_version > old_version: self.service.is_upgrate = True self.service.save() service_model[ "is_upgrade"] = True bean.update( {"service": service_model}) except Exception as e: logger.exception(e) if self.service.service_source == AppConstants.DOCKER_COMPOSE: if self.service.create_status != "complete": compose_service_relation = compose_service.get_service_compose_id( self.service) if compose_service_relation: service_model[ "compose_id"] = compose_service_relation.compose_id bean.update({"service": service_model}) bean["is_third"] = False if self.service.service_source == "third_party": bean["is_third"] = True service_endpoints = service_endpoints_repo.get_service_endpoints_by_service_id( self.service.service_id) if service_endpoints: bean["register_way"] = service_endpoints.endpoints_type if service_endpoints.endpoints_type == "api": # 从环境变量中获取域名,没有在从请求中获取 host = os.environ.get('DEFAULT_DOMAIN', request.get_host()) bean["api_url"] = "http://" + host + "/console/" + \ "third_party/{0}".format(self.service.service_id) key_repo = deploy_repo.get_service_key_by_service_id( service_id=self.service.service_id) if key_repo: bean["api_service_key"] = pickle.loads( base64.b64decode( key_repo.secret_key)).get("secret_key") if service_endpoints.endpoints_type == "discovery": # 返回类型和key endpoints_info_dict = json.loads( service_endpoints.endpoints_info) bean["discovery_type"] = endpoints_info_dict["type"] bean["discovery_key"] = endpoints_info_dict["key"] result = general_message(200, "success", "查询成功", bean=bean) except Exception as e: logger.exception(e) result = error_message(e.message) return Response(result, status=result["code"])
def check_service(self, tenant, service, is_again, user=None): body = dict() body["tenant_id"] = tenant.tenant_id body["source_type"] = self.__get_service_region_type( service.service_source) source_body = "" service_source = service_source_repo.get_service_source( tenant.tenant_id, service.service_id) user_name = "" password = "" service.service_source = self.__get_service_source(service) if service_source: user_name = service_source.user_name password = service_source.password if service.service_source == AppConstants.SOURCE_CODE: if service.oauth_service_id: try: oauth_service = oauth_repo.get_oauth_services_by_service_id( service.oauth_service_id) oauth_user = oauth_user_repo.get_user_oauth_by_user_id( service_id=service.oauth_service_id, user_id=user.user_id) except Exception as e: logger.debug(e) return 400, "未找到oauth服务, 请检查该服务是否存在且属于开启状态", None if oauth_user is None: return 400, "未成功获取第三方用户信息", None try: instance = get_oauth_instance(oauth_service.oauth_type, oauth_service, oauth_user) except Exception as e: logger.debug(e) return 400, "未找到OAuth服务", None if not instance.is_git_oauth(): return 400, "该OAuth服务不是代码仓库类型", None tenant = Tenants.objects.get(tenant_name=tenant.tenant_name) try: service_code_clone_url = instance.get_clone_url( service.git_url) except Exception as e: logger.debug(e) return 400, "Access Token 已过期", None else: service_code_clone_url = service.git_url sb = { "server_type": service.server_type, "repository_url": service_code_clone_url, "branch": service.code_version, "user": user_name, "password": password, "tenant_id": tenant.tenant_id } source_body = json.dumps(sb) elif service.service_source == AppConstants.DOCKER_RUN or service.service_source == AppConstants.DOCKER_IMAGE: source_body = service.docker_cmd elif service.service_source == AppConstants.THIRD_PARTY: # endpoints信息 service_endpoints = service_endpoints_repo.get_service_endpoints_by_service_id( service.service_id).first() if service_endpoints and service_endpoints.endpoints_type == "discovery": source_body = service_endpoints.endpoints_info body["username"] = user_name body["password"] = password body["source_body"] = source_body res, body = region_api.service_source_check(service.service_region, tenant.tenant_name, body) bean = body["bean"] service.check_uuid = bean["check_uuid"] service.check_event_id = bean["event_id"] # 更新创建状态 if not is_again: service.create_status = "checking" service.save() bean = dict() bean.update(service.to_dict()) bean.update({"user_name": user_name, "password": password}) bean.update(self.__wrap_check_service(service)) return 200, "success", bean