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
Exemple #2
0
    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()
Exemple #3
0
    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