def back_up_group_apps(self, tenant, user, region, group_id, mode, note): service_slug = app_store.get_slug_connection_info( "enterprise", tenant.tenant_name) service_image = app_store.get_image_connection_info( "enterprise", tenant.tenant_name) services = group_service.get_group_services(group_id) event_id = make_uuid() group_uuid = self.get_backup_group_uuid(group_id) metadata = self.get_group_app_metadata(group_id, tenant) version = current_time_str("%Y%m%d%H%M%S") data = { "event_id": event_id, "group_id": group_uuid, "metadata": metadata, "service_ids": [s.service_id for s in services], "mode": mode, "version": version, "slug_info": service_slug, "image_info": service_image } body = region_api.backup_group_apps(region, tenant.tenant_name, data) bean = body["bean"] record_data = { "group_id": group_id, "event_id": event_id, "group_uuid": group_uuid, "version": version, "team_id": tenant.tenant_id, "region": region, "status": bean["status"], "note": note, "mode": mode, "backup_id": bean.get("backup_id", ""), "source_dir": bean.get("source_dir", ""), "backup_size": bean.get("backup_size", 0), "user": user.nick_name, "backup_server_info": json.dumps({ "slug_info": service_slug, "image_info": service_image }) } backup_record = backup_record_repo.create_backup_records(**record_data) return backup_record
def start_import_apps(self, scope, event_id, file_names, team_name=None): import_record = app_import_record_repo.get_import_record_by_event_id(event_id) if not import_record: raise RecordNotFound("import_record not found") import_record.scope = scope if team_name: import_record.team_name = team_name service_image = app_store.get_image_connection_info(scope, import_record.enterprise_id, team_name) data = {"service_image": service_image, "event_id": event_id, "apps": file_names} if scope == "enterprise": region_api.import_app_2_enterprise(import_record.region, import_record.enterprise_id, data) else: res, body = region_api.import_app(import_record.region, team_name, data) import_record.status = "importing" import_record.save()
def start_import_apps(self, tenant, region, scope, event_id, file_names): import_record = app_import_record_repo.get_import_record_by_event_id(event_id) import_record.scope = scope service_slug = app_store.get_slug_connection_info(scope, tenant.tenant_name) service_image = app_store.get_image_connection_info(scope, tenant.tenant_name) data = { "service_slug": service_slug, "service_image": service_image, "event_id": event_id, "apps": file_names } logger.debug("params {0}".format(json.dumps(data))) res, body = region_api.import_app(region, tenant.tenant_name, data) logger.debug("response body {0}".format(body)) import_record.status = "importing" import_record.save()
def backup_group_apps(self, tenant, user, region, group_id, mode, note): service_slug = app_store.get_slug_connection_info("enterprise", tenant.tenant_name) service_image = app_store.get_image_connection_info("enterprise", tenant.tenant_name) if mode == "full-online" and not self.is_hub_info_configed(): return 412, "未配置hub仓库信息", None services = group_service.get_group_services(group_id) event_id = make_uuid() group_uuid = self.get_backup_group_uuid(group_id) total_memory, metadata = self.get_group_app_metadata(group_id, tenant) version = current_time_str("%Y%m%d%H%M%S") data = { "event_id": event_id, "group_id": group_uuid, "metadata": metadata, "service_ids": [s.service_id for s in services], "mode": mode, "version": version, "slug_info": service_slug, "image_info": service_image } # 向数据中心发起备份任务 body = region_api.backup_group_apps(region, tenant.tenant_name, data) bean = body["bean"] record_data = { "group_id": group_id, "event_id": event_id, "group_uuid": group_uuid, "version": version, "team_id": tenant.tenant_id, "region": region, "status": bean["status"], "note": note, "mode": mode, "backup_id": bean.get("backup_id", ""), "source_dir": bean.get("source_dir", ""), "source_type": bean.get("source_type", ""), "backup_size": bean.get("backup_size", 0), "user": user.nick_name, "total_memory": total_memory, "backup_server_info": json.dumps({ "slug_info": service_slug, "image_info": service_image }) } backup_record = backup_record_repo.create_backup_records(**record_data) return 200, "success", backup_record
def create_plugin_share_info(self, share_record, share_info, user_id, tenant, region_name): tenant_id = tenant.tenant_id tenant_name = tenant.tenant_name sid = transaction.savepoint() try: PluginShareRecordEvent.objects.filter( record_id=share_record.ID).delete() RainbondCenterPlugin.objects.filter( record_id=share_record.ID).delete() plugin_info = share_info.get("share_plugin_info") if isinstance(plugin_info, unicode): plugin_info = json.loads(plugin_info) if plugin_info.get('scope') == 'goodrain': ent = enterprise_repo.get_enterprise_by_enterprise_id( tenant.enterprise_id) if ent and not ent.is_active: return 10407, "用户未跟云市认证", None plugin_id = plugin_info.get("plugin_id") plugin_version = plugin_svc.get_tenant_plugin_newest_versions( region_name, tenant, plugin_id) if not plugin_version or plugin_version[ 0].build_status != "build_success": return 400, "插件未构建", None plugin_version = plugin_version.first() tenant_plugin = plugin_repo.get_plugin_by_plugin_id( tenant_id, plugin_id) plugin_template = { "plugin_id": plugin_info.get("plugin_id"), "plugin_key": plugin_info.get("plugin_key"), "plugin_name": plugin_info.get("plugin_name"), "plugin_version": plugin_info.get("version"), "code_repo": tenant_plugin.code_repo, "build_source": tenant_plugin.build_source, "image": tenant_plugin.image, "category": tenant_plugin.category } if plugin_version.plugin_version_status != "fixed": plugin_version.plugin_version_status = "fixed" plugin_version.save() plugin_template["build_version"] = plugin_version.to_dict() plugin_info["plugin_image"] = app_store.get_image_connection_info( plugin_info["scope"], tenant_name) if not plugin_info["plugin_image"]: if sid: transaction.savepoint_rollback(sid) return 400, "获取镜像上传地址错误", None event = PluginShareRecordEvent( record_id=share_record.ID, team_name=tenant_name, team_id=tenant_id, plugin_id=plugin_info['plugin_id'], plugin_name=plugin_info['plugin_name'], event_status='not_start') event.save() RainbondCenterPlugin.objects.filter( version=plugin_info["version"], plugin_id=share_record.group_id).delete() plugin_info["source"] = "local" plugin_info["record_id"] = share_record.ID plugin_template['share_plugin_info'] = plugin_info plugin = RainbondCenterPlugin( plugin_key=plugin_info.get("plugin_key"), plugin_name=plugin_info.get("plugin_name"), plugin_id=plugin_info.get("plugin_id"), record_id=share_record.ID, version=plugin_info.get("version"), build_version=plugin_info.get('build_version'), pic=plugin_info.get("pic", ""), scope=plugin_info.get("scope"), source="local", share_user=user_id, share_team=tenant_name, desc=plugin_info.get("desc"), enterprise_id=tenant.enterprise_id, plugin_template=json.dumps(plugin_template), category=plugin_info.get('category')) plugin.save() share_record.step = 2 share_record.update_time = datetime.now() share_record.save() transaction.savepoint_commit(sid) return 200, "分享信息处理成功", plugin.to_dict() except Exception as e: logger.exception(e) if sid: transaction.savepoint_rollback(sid) return 500, "插件分享处理发生错误", None
def create_share_info(self, share_record, share_team, share_user, share_info, use_force): # 开启事务 sid = transaction.savepoint() try: group_info = share_info["share_group_info"] # 删除历史数据 ServiceShareRecordEvent.objects.filter( record_id=share_record.ID).delete() RainbondCenterApp.objects.filter( Q(record_id=share_record.ID) | Q(group_key=group_info["group_key"], version=group_info["version"], enterprise_id=share_team.enterprise_id)).delete() app_templete = {} # 处理基本信息 try: app_templete["template_version"] = "v2" app_templete["group_key"] = group_info["group_key"] app_templete["group_name"] = group_info["group_name"] app_templete["group_version"] = group_info["version"] except Exception as e: if sid: transaction.savepoint_rollback(sid) logger.exception(e) return 500, "基本信息处理错误", None try: # 确定分享的插件ID plugins = share_info.get("share_plugin_list", None) shared_plugin_info = None if plugins: for plugin_info in plugins: # one account for one plugin share_image_info = app_store.get_image_connection_info( group_info["scope"], share_team.tenant_name) plugin_info["plugin_image"] = share_image_info event = PluginShareRecordEvent( record_id=share_record.ID, team_name=share_team.tenant_name, team_id=share_team.tenant_id, plugin_id=plugin_info['plugin_id'], plugin_name=plugin_info['plugin_alias'], event_status='not_start') event.save() shared_plugin_info = self.get_plugins_group_items(plugins) app_templete["plugins"] = shared_plugin_info except ServiceHandleException as e: raise e except Exception as e: if sid: transaction.savepoint_rollback(sid) logger.exception(e) return 500, "插件处理发生错误", None # 处理组件相关 try: services = share_info["share_service_list"] if services: new_services = list() service_ids = [s["service_id"] for s in services] version_list = base_service.get_apps_deploy_versions( services[0]["service_region"], share_team.tenant_name, service_ids) delivered_type_map = { v["service_id"]: v["delivered_type"] for v in version_list } dep_service_keys = { service['service_share_uuid'] for service in services } for service in services: # slug组件 # if image.startswith("goodrain.me/runner") and service["language"] != "dockerfile": if delivered_type_map[service['service_id']] == "slug": service[ 'service_slug'] = app_store.get_slug_connection_info( group_info["scope"], share_team.tenant_name) service["share_type"] = "slug" if not service['service_slug']: if sid: transaction.savepoint_rollback(sid) return 400, "获取源码包上传地址错误", None else: service[ "service_image"] = app_store.get_image_connection_info( group_info["scope"], share_team.tenant_name) service["share_type"] = "image" if not service["service_image"]: if sid: transaction.savepoint_rollback(sid) return 400, "获取镜像上传地址错误", None # 处理依赖关系 self._handle_dependencies(service, dep_service_keys, use_force) service[ "service_related_plugin_config"] = self.wrapper_service_plugin_config( service["service_related_plugin_config"], shared_plugin_info) if service.get("need_share", None): ssre = ServiceShareRecordEvent( team_id=share_team.tenant_id, service_key=service["service_key"], service_id=service["service_id"], service_name=service["service_cname"], service_alias=service["service_alias"], record_id=share_record.ID, team_name=share_team.tenant_name, event_status="not_start") ssre.save() new_services.append(service) app_templete["apps"] = new_services else: if sid: transaction.savepoint_rollback(sid) return 400, "分享的组件信息不能为空", None except ServiceHandleException as e: raise e except Exception as e: if sid: transaction.savepoint_rollback(sid) logger.exception(e) return 500, "组件信息处理发生错误", None # 删除同个应用分享的相同版本 RainbondCenterApp.objects.filter( version=group_info["version"], tenant_service_group_id=share_record.group_id).delete() # 新增加 app = RainbondCenterApp( group_key=app_templete["group_key"], group_name=app_templete["group_name"], share_user=share_user.user_id, share_team=share_team.tenant_name, tenant_service_group_id=share_record.group_id, pic=group_info.get("pic", ""), source="local", record_id=share_record.ID, version=group_info["version"], enterprise_id=share_team.enterprise_id, scope=group_info["scope"], describe=group_info["describe"], details=group_info.get("details", ""), app_template=json.dumps(app_templete)) app.save() share_record.step = 2 share_record.update_time = datetime.datetime.now() share_record.save() # 提交事务 if sid: transaction.savepoint_commit(sid) return 200, "分享信息处理成功", share_record.to_dict() except ServiceHandleException as e: raise e except Exception as e: logger.exception(e) if sid: transaction.savepoint_rollback(sid) return 500, "应用分享处理发生错误", None
def create_share_info(self, share_record, share_team, share_user, share_info): # 开启事务 sid = transaction.savepoint() try: # 删除历史数据 ServiceShareRecordEvent.objects.filter( record_id=share_record.ID).delete() RainbondCenterApp.objects.filter( record_id=share_record.ID).delete() app_templete = {} # 处理基本信息 try: app_templete["template_version"] = "v2" group_info = share_info["share_group_info"] app_templete["group_key"] = group_info["group_key"] app_templete["group_name"] = group_info["group_name"] app_templete["group_version"] = group_info["version"] except Exception as e: if sid: transaction.savepoint_rollback(sid) logger.exception(e) return 500, "基本信息处理错误", None # 处理插件相关,v3.5暂时不实现 try: # 确定分享的插件ID share_plugin_ids = {} plugins = share_info.get("share_plugin_list", None) if plugins: share_plugins = list() for plugin in plugins: version = plugin.get("build_version", "") plugin_id = plugin.get("plugin_id", "") if version and plugin_id: # 只有自己创建的插件需要分享出去 if plugin["origin"] == "source_code" and plugin[ "is_share"]: plugin_version = plugin_repo.get_plugin_buildversion( plugin_id, version) if plugin_version and plugin_version.plugin_version_status != "fixed": plugin_version.plugin_version_status = "fixed" plugin_version.save() plugin["config_groups"] = [ group.to_dict() for group in plugin_repo.get_plugin_config_groups( plugin_id, version) ] plugin["config_items"] = [ item.to_dict() for item in plugin_repo.get_plugin_config_items( plugin_id, version) ] plugin["version"] = plugin_version.to_dict() # TODO: 插件应该单独分享,此处暂时不处理,分享到应用内部 share_plugin_ids[plugin_id] = True share_plugins.append(plugin) app_templete["plugins"] = share_plugins except Exception as e: if sid: transaction.savepoint_rollback(sid) logger.exception(e) return 500, "插件处理发生错误", None # 处理应用相关 try: services = share_info["share_service_list"] if services: new_services = list() for service in services: image = service["image"] # 源码应用 if image.startswith("goodrain.me/runner") and service[ "language"] != "dockerfile": service[ 'service_slug'] = app_store.get_slug_connection_info( group_info["scope"], share_team.tenant_name) if not service['service_slug']: if sid: transaction.savepoint_rollback(sid) return 400, "获取源码包上传地址错误", None else: service[ "service_image"] = app_store.get_image_connection_info( group_info["scope"], share_team.tenant_name) if not service["service_image"]: if sid: transaction.savepoint_rollback(sid) return 400, "获取镜像上传地址错误", None if service.get("need_share", None): ssre = ServiceShareRecordEvent( team_id=share_team.tenant_id, service_key=service["service_key"], service_id=service["service_id"], service_name=service["service_cname"], service_alias=service["service_alias"], record_id=share_record.ID, team_name=share_team.tenant_name, event_status="not_start") ssre.save() new_services.append(service) # TODO:处理应用继承关系RainbondCenterAppInherit app_templete["apps"] = new_services else: if sid: transaction.savepoint_rollback(sid) return 400, "分享的应用信息不能为空", None except Exception as e: if sid: transaction.savepoint_rollback(sid) logger.exception(e) return 500, "应用信息处理发生错误", None # 删除同个应用组分享的相同版本 RainbondCenterApp.objects.filter( version=group_info["version"], tenant_service_group_id=share_record.group_id).delete() # 新增加 app = RainbondCenterApp( group_key=app_templete["group_key"], group_name=app_templete["group_name"], share_user=share_user.user_id, share_team=share_team.tenant_name, tenant_service_group_id=share_record.group_id, pic=group_info.get("pic", ""), source="local", record_id=share_record.ID, version=group_info["version"], enterprise_id=share_team.enterprise_id, scope=group_info["scope"], describe=group_info["describe"], app_template=json.dumps(app_templete)) app.save() share_record.step = 2 share_record.update_time = datetime.datetime.now() share_record.save() # 提交事务 if sid: transaction.savepoint_commit(sid) return 200, "分享信息处理成功", share_record.to_dict() except Exception as e: logger.exception(e) if sid: transaction.savepoint_rollback(sid) return 500, "应用分享处理发生错误", None