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 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 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 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_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 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 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) # dependent volume dep_mnt_map = self.get_dep_mnts_by_ids(team.tenant_id, 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 - service.min_memory % 32 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 - service.min_memory % 32 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) service["mnt_relation_list"] = list() if dep_mnt_map.get(service_id): for dep_mnt in dep_mnt_map.get(service_id): if not all_data_map.get(dep_mnt.dep_service_id): continue service["mnt_relation_list"].append({ "service_share_uuid": all_data_map[dep_mnt.dep_service_id] ["service_share_uuid"], "mnt_name": dep_mnt.mnt_name, "mnt_dir": dep_mnt.mnt_dir }) all_data.append(service) return all_data else: return []