def sync_service_plugin_event(self, user, region_name, tenant_name, record_id, record_event): rc_apps = RainbondCenterApp.objects.filter(record_id=record_id) if not rc_apps: return 404, "分享的应用不存在", None rc_app = rc_apps[0] app_template = json.loads(rc_app.app_template) plugins_info = app_template["plugins"] plugin_list = [] for plugin in plugins_info: if record_event.plugin_id == plugin["plugin_id"]: event_id = make_uuid() body = { "plugin_id": plugin["plugin_id"], "plugin_version": plugin["build_version"], "plugin_key": plugin["plugin_key"], "event_id": event_id, "share_user": user.nick_name, "share_scope": rc_app.scope, "image_info": plugin.get("plugin_image") if plugin.get("plugin_image") else "", } try: res, body = region_api.share_plugin( region_name, tenant_name, plugin["plugin_id"], body) data = body.get("bean") sid = transaction.savepoint() if not data: transaction.savepoint_rollback(sid) return 400, "数据中心分享错误", None record_event.region_share_id = data.get("share_id", None) record_event.event_id = data.get("event_id", None) record_event.event_status = "start" record_event.update_time = datetime.datetime.now() record_event.save() image_name = data.get("image_name", None) if image_name: plugin["share_image"] = image_name transaction.savepoint_commit(sid) except Exception as e: logger.exception(e) if sid: transaction.savepoint_rollback(sid) return 500, "插件分享事件同步发生错误", None plugin_list.append(plugin) app_template["plugins"] = plugin_list rc_app.app_template = json.dumps(app_template) rc_app.save() return 200, "success", record_event
def sync_event(self, nick_name, region_name, tenant_name, record_event): rcps = RainbondCenterPlugin.objects.filter( record_id=record_event.record_id) if not rcps: return 404, "分享的插件不存在", None rcp = rcps[0] event_type = "share-yb" if rcp.scope == "goodrain": event_type = "share-ys" event_id = make_uuid() record_event.event_id = event_id plugin_template = json.loads(rcp.plugin_template) share_plugin = plugin_template.get("share_plugin_info") body = { "plugin_id": rcp.plugin_id, "plugin_version": rcp.build_version, "plugin_key": rcp.plugin_key, "event_id": event_id, "share_user": nick_name, "share_scope": rcp.scope, "image_info": share_plugin.get("plugin_image") if share_plugin else "", } sid = transaction.savepoint() try: res, body = region_api.share_plugin(region_name, tenant_name, rcp.plugin_id, body) data = body.get("bean") if not data: transaction.savepoint_rollback(sid) return 400, "数据中心分享错误", None record_event.region_share_id = data.get("share_id", None) record_event.event_id = data.get("event_id", None) record_event.event_status = "start" record_event.update_time = datetime.now() record_event.save() image_name = data.get("image_name", None) if image_name: plugin_template["share_image"] = image_name rcp.plugin_template = json.dumps(plugin_template) rcp.save() transaction.savepoint_commit(sid) return 200, "数据中心分享开始", record_event except Exception as e: logger.exception(e) if sid: transaction.savepoint_rollback(sid) return 500, "插件分享事件同步发生错误", None
def create_publish_event(self, record_event, user_name, event_type): import datetime event = ServiceEvent(event_id=make_uuid(), service_id=record_event.service_id, tenant_id=record_event.team_id, type=event_type, user_name=user_name, start_time=datetime.datetime.now()) event.save() return event
def bind_domain(self, service_id, domain_name): if ServiceDomain.objects.filter(domain_name=domain_name).count() > 0: return False, '域名已存在' service = app_svc.get_service_by_id(service_id) if not service: return False, '应不存在' tenant = app_group_svc.get_tenant_by_pk(service.tenant_id) user = app_group_svc.get_user_by_eid(tenant.enterprise_id) ports = app_group_svc.get_service_http_port(service.service_id) if not ports: return False, '未开通对外端口' data = { "uuid": make_uuid(domain_name), "domain_name": domain_name, "service_alias": service.service_alias, "tenant_id": service.tenant_id, "tenant_name": tenant.tenant_name, "service_port": ports[0].container_port, "protocol": "http", "add_time": datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'), "add_user": user.nick_name if user else "", "enterprise_id": tenant.enterprise_id, "certificate": "", "private_key": "", "certificate_name": "" } try: region_api.bindDomain(service.service_region, tenant.tenant_name, service.service_alias, data) domain = { "service_id": service.service_id, "service_name": service.service_alias, "domain_name": domain_name, "create_time": datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'), "container_port": ports[0].container_port, "protocol": "http", "certificate_id": 0 } domain_info = ServiceDomain(**domain) domain_info.save() return True, domain_info except Exception as e: return False, e.message.get('body').get('msgcn') or '绑定域名失败'
def get_plugins_group_items(self, plugins): rt_list = [] for p in plugins: config_group_list = plugin_config_service.get_config_details(p["plugin_id"], p["build_version"]) p["config_groups"] = config_group_list if p["origin_share_id"] == "new_create": p["plugin_key"] = make_uuid() else: p["plugin_key"] = p["origin_share_id"] rt_list.append(p) return rt_list
def __generate_tenant_service_group(self, region_name, tenant_id, group_id, group_key, group_version, group_alias): group_name = '_'.join([group_alias, make_uuid()[-4:]]) params = { "tenant_id": tenant_id, "group_name": group_name, "group_alias": group_alias, "group_key": group_key, "group_version": group_version, "region_name": region_name, "service_group_id": 0 if group_id == -1 else group_id } return tenant_service_group_repo.create_tenant_service_group(**params)
def query_share_service_info(self, team, group_id): service_list = share_repo.get_service_list_by_group_id( team=team, group_id=group_id) if service_list: array_ids = [x.service_id for x in service_list] deploy_versions = self.get_team_service_deploy_version( service_list[0].service_region, team, array_ids) array_keys = [] for x in service_list: if x.service_key == "application" or x.service_key == "0000" or x.service_key == "": array_keys.append(x.service_key) # 查询服务端口信息 service_port_map = self.get_service_ports_by_ids(array_ids) # 查询服务依赖 dep_service_map = self.get_service_dependencys_by_ids(array_ids) # 查询服务可变参数和不可变参数 # service_env_change_map, service_env_nochange_map = self.get_service_env_by_ids(array_ids) service_env_map = self.get_service_env_by_ids(array_ids) # 查询服务持久化信息 service_volume_map = self.get_service_volume_by_ids(array_ids) # 查询服务伸缩方式信息 extend_method_map = self.get_service_extend_method_by_keys( array_keys) # 获取应用的健康检测设置 probe_map = self.get_service_probes(array_ids) all_data_map = dict() for service in service_list: data = dict() data['service_id'] = service.service_id data['tenant_id'] = service.tenant_id data['service_cname'] = service.service_cname data['service_key'] = service.service_key if service.service_key == 'application' or service.service_key == '0000' or service.service_key == 'mysql': data['service_key'] = make_uuid() service.service_key = data['service_key'] service.save() # data['need_share'] = True # else: # data['need_share'] = False data["service_share_uuid"] = "{0}+{1}".format( data['service_key'], data['service_id']) data['need_share'] = True data['category'] = service.category data['language'] = service.language data['extend_method'] = service.extend_method data['version'] = service.version data['memory'] = service.min_memory data['service_type'] = service.service_type data['service_source'] = service.service_source data['deploy_version'] = deploy_versions[data[ 'service_id']] if deploy_versions else service.deploy_version data['image'] = service.image data['service_alias'] = service.service_alias data['service_name'] = service.service_name data['service_region'] = service.service_region data['creater'] = service.creater data["cmd"] = service.cmd data['probes'] = [ probe.to_dict() for probe in probe_map.get(service.service_id, []) ] extend_method = extend_method_map.get(service.service_key) if extend_method: e_m = dict() e_m['min_node'] = service.min_node e_m['max_node'] = extend_method.max_node e_m['step_node'] = extend_method.step_node e_m['min_memory'] = service.min_memory e_m['max_memory'] = extend_method.max_memory e_m['step_memory'] = extend_method.step_memory e_m['is_restart'] = extend_method.is_restart data['extend_method_map'] = e_m else: data['extend_method_map'] = { "min_node": service.min_node, "max_node": 20, "step_node": 1, "min_memory": service.min_memory, "max_memory": 65536, "step_memory": 128, "is_restart": 0 } data['port_map_list'] = list() if service_port_map.get(service.service_id): for port in service_port_map.get(service.service_id): p = dict() # 写需要返回的port数据 p['protocol'] = port.protocol p['tenant_id'] = port.tenant_id p['port_alias'] = port.port_alias p['container_port'] = port.container_port p['is_inner_service'] = port.is_inner_service p['is_outer_service'] = port.is_outer_service data['port_map_list'].append(p) data['service_volume_map_list'] = list() if service_volume_map.get(service.service_id): for volume in service_volume_map.get(service.service_id): s_v = dict() s_v['file_content'] = '' if volume.volume_type == "config-file": config_file = volume_repo.get_service_config_file( volume.ID) if config_file: s_v['file_content'] = config_file.file_content s_v['category'] = volume.category s_v['volume_type'] = volume.volume_type s_v['volume_path'] = volume.volume_path s_v['volume_name'] = volume.volume_name data['service_volume_map_list'].append(s_v) data['service_env_map_list'] = list() data['service_connect_info_map_list'] = list() if service_env_map.get(service.service_id): for env_change in service_env_map.get(service.service_id): if env_change.container_port == 0: e_c = dict() e_c['name'] = env_change.name e_c['attr_name'] = env_change.attr_name e_c['attr_value'] = env_change.attr_value e_c['is_change'] = env_change.is_change if env_change.scope == "outer": e_c['container_port'] = env_change.container_port data['service_connect_info_map_list'].append( e_c) else: data['service_env_map_list'].append(e_c) data['service_related_plugin_config'] = list() # plugins_attr_list = share_repo.get_plugin_config_var_by_service_ids(service_ids=service_ids) plugins_relation_list = share_repo.get_plugins_relation_by_service_ids( service_ids=[service.service_id]) for spr in plugins_relation_list: service_plugin_config_var = service_plugin_config_repo.get_service_plugin_config_var( spr.service_id, spr.plugin_id, spr.build_version) plugin_data = spr.to_dict() plugin_data["attr"] = [ var.to_dict() for var in service_plugin_config_var ] data['service_related_plugin_config'].append(plugin_data) all_data_map[service.service_id] = data all_data = list() for service_id in all_data_map: service = all_data_map[service_id] service['dep_service_map_list'] = list() if dep_service_map.get(service['service_id']): for dep in dep_service_map.get(service['service_id']): d = dict() if all_data_map.get(dep.service_id): # 通过service_key和service_id来判断依赖关系 d['dep_service_key'] = all_data_map[ dep.service_id]["service_share_uuid"] service['dep_service_map_list'].append(d) all_data.append(service) return all_data else: return []
def install_plugin(self, user, tenant, region_name, market_plugin): plugin_template = json.loads(market_plugin.plugin_template) share_plugin_info = plugin_template.get("share_plugin_info") sid = transaction.savepoint() try: image = None image_tag = None if plugin_template["share_image"]: image_and_tag = plugin_template["share_image"].rsplit(":", 1) if len(image_and_tag) > 1: image = image_and_tag[0] image_tag = image_and_tag[1] else: image = image_and_tag[0] image_tag = "latest" status, msg, plugin_base_info = plugin_service.create_tenant_plugin( tenant, user.user_id, region_name, share_plugin_info.get("desc"), plugin_template["plugin_name"], plugin_template["category"], "image", image, plugin_template["code_repo"] ) if status != 200: return status, msg plugin_base_info.origin = 'local_market' if market_plugin.source == 'local' else market_plugin.source plugin_base_info.origin_share_id = share_plugin_info.get("plugin_key") plugin_base_info.save() build_version = plugin_template.get('build_version') min_memory = build_version.get('min_memory') plugin_build_version = plugin_version_service.create_build_version( region_name, plugin_base_info.plugin_id, tenant.tenant_id, user.user_id, "", "unbuild", min_memory, image_tag=image_tag, code_version="" ) config_groups, config_items = [], [] share_config_groups = share_plugin_info.get('config_groups', []) for group in share_config_groups: plugin_config_group = PluginConfigGroup( plugin_id=plugin_base_info.plugin_id, build_version=plugin_build_version.build_version, config_name=group.get("config_name"), service_meta_type=group.get("service_meta_type"), injection=group.get("injection") ) config_groups.append(plugin_config_group) share_config_items = group.get('config_items', []) for item in share_config_items: plugin_config_item = PluginConfigItems( plugin_id=plugin_base_info.plugin_id, build_version=plugin_build_version.build_version, service_meta_type=item.get("service_meta_type"), attr_name=item.get("attr_name"), attr_alt_value=item.get("attr_alt_value"), attr_type=item.get("attr_type", "string"), attr_default_value=item.get("attr_default_value", None), is_change=item.get("is_change", False), attr_info=item.get("attr_info", ""), protocol=item.get("protocol", "") ) config_items.append(plugin_config_item) PluginConfigGroup.objects.bulk_create(config_groups) PluginConfigItems.objects.bulk_create(config_items) event_id = make_uuid() plugin_build_version.event_id = event_id plugin_build_version.plugin_version_status = "fixed" plugin_service.create_region_plugin(region_name, tenant, plugin_base_info, image_tag=image_tag) ret = plugin_service.build_plugin( region_name, plugin_base_info, plugin_build_version, user, tenant, event_id , share_plugin_info.get("plugin_image", None)) plugin_build_version.build_status = ret.get('bean').get('status') plugin_build_version.save() return 200, '安装成功' except Exception as e: logger.exception(e) if sid: transaction.savepoint_rollback(sid) return 500, '插件安装失败'
def __create_group(self, tenant_id, region_name, group_alias): group_name = '_'.join([group_alias, make_uuid()[-4:]]) new_group = group_repo.add_group(tenant_id, region_name, group_name) return new_group
def query_share_service_info(self, team, group_id): service_list = share_repo.get_service_list_by_group_id( team=team, group_id=group_id) if service_list: array_ids = [x.service_id for x in service_list] array_keys = [] for x in service_list: if x.service_key == "application" or x.service_key == "0000" or x.service_key == "": array_keys.append(x.service_key) # 查询服务端口信息 service_port_map = self.get_service_ports_by_ids(array_ids) # 查询服务依赖 dep_service_map = self.get_service_dependencys_by_ids(array_ids) # 查询服务可变参数和不可变参数 # service_env_change_map, service_env_nochange_map = self.get_service_env_by_ids(array_ids) service_env_map = self.get_service_env_by_ids(array_ids) # 查询服务持久化信息 service_volume_map = self.get_service_volume_by_ids(array_ids) # 查询服务伸缩方式信息 extend_method_map = self.get_service_extend_method_by_keys( array_keys) # 获取应用的健康检测设置 probe_map = self.get_service_probes(array_ids) all_data_map = {} for service in service_list: data = dict() data['service_id'] = service.service_id data['tenant_id'] = service.tenant_id data['service_cname'] = service.service_cname data['service_key'] = service.service_key if service.service_source != AppConstants.MARKET: data['service_key'] = make_uuid() # data['need_share'] = True # else: # data['need_share'] = False data['need_share'] = True data['category'] = service.category data['language'] = service.language data['extend_method'] = service.extend_method data['version'] = service.version data['memory'] = service.min_memory data['service_type'] = service.service_type data['service_source'] = service.service_source data['deploy_version'] = service.deploy_version data['image'] = service.image data['service_alias'] = service.service_alias data['service_region'] = service.service_region data['creater'] = service.creater data["cmd"] = service.cmd data['probes'] = [ probe.to_dict() for probe in probe_map.get(service.service_id, []) ] extend_method = extend_method_map.get(service.service_key) if extend_method: e_m = dict() e_m['min_node'] = extend_method.min_node e_m['max_node'] = extend_method.max_node e_m['step_node'] = extend_method.step_node e_m['min_memory'] = extend_method.min_memory e_m['max_memory'] = extend_method.max_memory e_m['step_memory'] = extend_method.step_memory e_m['is_restart'] = extend_method.is_restart data['extend_method_map'] = e_m else: data['extend_method_map'] = { "min_node": 1, "max_node": 20, "step_node": 1, "min_memory": 128, "max_memory": 65536, "step_memory": 128, "is_restart": 0 } data['port_map_list'] = list() if service_port_map.get(service.service_id): for port in service_port_map.get(service.service_id): p = dict() # 写需要返回的port数据 p['protocol'] = port.protocol p['tenant_id'] = port.tenant_id p['port_alias'] = port.port_alias p['container_port'] = port.container_port p['is_inner_service'] = port.is_inner_service p['is_outer_service'] = port.is_outer_service data['port_map_list'].append(p) data['service_volume_map_list'] = list() if service_volume_map.get(service.service_id): for volume in service_volume_map.get(service.service_id): s_v = dict() s_v['category'] = volume.category s_v['volume_type'] = volume.volume_type s_v['volume_path'] = volume.volume_path s_v['volume_name'] = volume.volume_name data['service_volume_map_list'].append(s_v) data['service_env_map_list'] = list() data['service_connect_info_map_list'] = list() if service_env_map.get(service.service_id): for env_change in service_env_map.get(service.service_id): if env_change.container_port == 0: e_c = dict() e_c['name'] = env_change.name e_c['attr_name'] = env_change.attr_name e_c['attr_value'] = env_change.attr_value e_c['is_change'] = env_change.is_change if env_change.scope == "outer": e_c['container_port'] = env_change.container_port data['service_connect_info_map_list'].append( e_c) else: data['service_env_map_list'].append(e_c) service_ids = [x.service_id for x in service_list] plugins_attr_list = share_repo.get_plugins_attr_by_service_ids( service_ids=service_ids) plugins_relation_list = share_repo.get_plugins_relation_by_service_ids( service_ids=service_ids) data['plugin_map_list'] = list() for p_relation in plugins_relation_list: plugin_data = dict() if service.service_id == p_relation.service_id: plugin_data['plugin_id'] = p_relation.plugin_id plugin_data['build_version'] = p_relation.build_version plugin_data[ 'service_meta_type'] = p_relation.service_meta_type plugin_data['plugin_status'] = p_relation.plugin_status plugin_data['create_time'] = p_relation.create_time plugin_data["attr"] = list() for p_attr in plugins_attr_list: if p_relation.service_id == p_attr.service_id: attr_data = {} attr_data[ 'dest_service_id'] = p_attr.dest_service_id attr_data[ 'dest_service_alias'] = p_attr.dest_service_alias attr_data[ 'container_port'] = p_attr.container_port attr_data['attr_name'] = p_attr.attr_name attr_data['attr_value'] = p_attr.attr_value attr_data[ 'attr_alt_value'] = p_attr.attr_alt_value attr_data['attr_type'] = p_attr.attr_type attr_data[ 'attr_default_value'] = p_attr.attr_default_value attr_data['protocol'] = p_attr.protocol attr_data['attr_info'] = p_attr.attr_info plugin_data["attr"].append(attr_data) data['plugin_map_list'].append(plugin_data) all_data_map[service.service_id] = data all_data = list() for service_id in all_data_map: service = all_data_map[service_id] service['dep_service_map_list'] = list() if dep_service_map.get(service['service_id']): for dep in dep_service_map.get(service['service_id']): d = dict() if all_data_map.get(dep.service_id): d['dep_service_key'] = all_data_map[ dep.service_id]['service_key'] service['dep_service_map_list'].append(d) all_data.append(service) return all_data else: return []