def save_market_app_template(self, user, tenant, app_templates):
        template_version = app_templates["template_version"]
        is_v1 = bool(template_version == "v1")
        if is_v1:
            v2_template = template_transform_service.v1_to_v2(app_templates)
        else:
            v2_template = app_templates
        rainbond_app = rainbond_app_repo.get_enterpirse_app_by_key_and_version(
            tenant.enterprise_id, v2_template["group_key"],
            v2_template["group_version"])

        if not rainbond_app:
            if common_services.is_public() and user.is_sys_admin:
                enterprise_id = "public"
            else:
                enterprise_id = tenant.enterprise_id
            rainbond_app = RainbondCenterApp(
                group_key=app_templates["group_key"],
                group_name=app_templates["group_name"],
                version=app_templates['group_version'],
                share_user=0,
                record_id=0,
                share_team="",
                source="market",
                scope="goodrain",
                describe=app_templates["info"],
                pic=app_templates["pic"],
                app_template="",
                enterprise_id=enterprise_id,
                template_version=app_templates.get("template_version", ""))
        if is_v1:
            rainbond_app.share_user = v2_template["share_user"]
            rainbond_app.share_team = v2_template["share_team"]
            rainbond_app.pic = v2_template["pic"]
            rainbond_app.describe = v2_template["describe"]
            rainbond_app.app_template = json.dumps(v2_template)
            rainbond_app.is_complete = True
            rainbond_app.update_time = current_time_str("%Y-%m-%d %H:%M:%S")
            rainbond_app.save()
        else:
            user_name = v2_template.get("publish_user", None)
            user_id = 0
            if user_name:
                try:
                    user = user_repo.get_user_by_username(user_name)
                    user_id = user.user_id
                except Exception as e:
                    logger.exception(e)
            rainbond_app.share_user = user_id
            rainbond_app.share_team = v2_template.get("publish_team", "")
            rainbond_app.pic = v2_template.get("pic", rainbond_app.pic)
            rainbond_app.describe = v2_template.get("update_note",
                                                    rainbond_app.describe)
            rainbond_app.app_template = v2_template["template_content"]
            rainbond_app.is_complete = True
            rainbond_app.update_time = current_time_str("%Y-%m-%d %H:%M:%S")
            rainbond_app.save()
    def create_group_compose(self,
                             tenant,
                             region,
                             group_id,
                             compose_content,
                             hub_user="",
                             hub_pass=""):
        gc = compose_repo.get_group_compose_by_group_id(group_id)
        if gc:
            return 409, "该组已与其他compose组关联", None
        # 将yaml格式信息转成json数据
        group_compose_data = {
            "hub_user": hub_user,
            "hub_pass": hub_pass,
            "group_id": group_id,
            "team_id": tenant.tenant_id,
            "region": region,
            "compose_content": compose_content,
            "compose_id": make_uuid(),
            "create_status": "creating",
            "create_time": current_time_str("%Y-%m-%d %H:%M:%S"),
        }

        group_compose = compose_repo.create_group_compose(**group_compose_data)
        return 200, "创建groupcompose成功", group_compose
Exemple #3
0
    def get_service_event(self, tenant, service, page, page_size, start_time_str):
        # 前端传入时间到分钟,默认会加上00,这样一来刚部署的应用的日志无法查询到,所有将当前时间添加一分钟
        if not start_time_str:
            start_time_str = current_time_str(fmt="%Y-%m-%d %H:%M:%S")
        else:
            start_time = str_to_time(start_time_str, fmt="%Y-%m-%d %H:%M")
            start_time_str = time_to_str(start_time + datetime.timedelta(minutes=1))

        events = event_repo.get_events_before_specify_time(tenant.tenant_id, service.service_id, start_time_str)
        event_paginator = JuncheePaginator(events, int(page_size))
        total = event_paginator.count
        page_events = event_paginator.page(page)
        has_next = True
        if page_size * page >= total:
            has_next = False
        self.__sync_region_service_event_status(service.service_region, tenant.tenant_name, page_events)

        re_events = []
        for event in list(page_events):
            event_re = event.to_dict()
            # codeVersion = "版本:4c042b9 上传者:黄峻贤 Commit:Merge branch 'developer' into 'test'"
            version_info = self.wrapper_code_version(service, event)
            if version_info:
                event_re["code_version"] = version_info
            type_cn = self.translate_event_type(event.type)
            event_re["type_cn"] = type_cn
            re_events.append(event_re)
        return re_events, has_next
Exemple #4
0
 def down_market_group_list(self, tenant):
     app_group_list = market_api.get_service_group_list(tenant.tenant_id)
     rainbond_apps = []
     for app_group in app_group_list:
         rbc = rainbond_app_repo.get_rainbond_app_by_key_and_version(
             app_group["group_key"], app_group["group_version"])
         if rbc:
             rbc.describe = app_group["info"] if app_group[
                 "info"] else rbc.describe
             rbc.pic = app_group["pic"] if app_group["pic"] else rbc.pic
             rbc.update_time = current_time_str("%Y-%m-%d %H:%M:%S")
             rbc.template_version = app_group.get("template_version",
                                                  rbc.template_version)
             rbc.save()
         else:
             rainbond_app = RainbondCenterApp(
                 group_key=app_group["group_key"],
                 group_name=app_group["group_name"],
                 version=app_group['group_version'],
                 share_user=0,
                 record_id=0,
                 share_team="",
                 source="market",
                 scope="goodrain",
                 describe=app_group["info"],
                 pic=app_group["pic"],
                 app_template="",
                 template_version=app_group.get("template_version", ""))
             rainbond_apps.append(rainbond_app)
     rainbond_app_repo.bulk_create_rainbond_apps(rainbond_apps)
    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 __v1_2_v2_translate_app(self, app, region):

        new_app = dict()
        new_app["service_type"] = app["service_type"]
        new_app["service_cname"] = app["service_name"]
        new_app["deploy_version"] = current_time_str("%Y%m%d%H%M%S")
        # 老版本如果slug信息有值,则
        slug = app.get("slug", None)
        new_app["language"] = ""
        service_image = {}
        service_slug = {}
        share_slug_path = ""
        if slug:
            new_app["language"] = ""
            service_slug = self.__generate_slug_info()
            share_slug_path = slug.replace("/app_publish/", "")
        else:
            service_image["hub_url"] = "hub.goodrain.com"
            service_image["namespace"] = "goodrain"
            # 云市镜像存储
            new_app["share_image"] = app["image"].replace(
                "goodrain.me", "hub.goodrain.com/goodrain")
        if share_slug_path:
            new_app["share_slug_path"] = share_slug_path
        new_app["service_image"] = service_image
        new_app["service_slug"] = service_slug
        new_app["version"] = app["version"]
        new_app["need_share"] = True
        new_app["service_key"] = app["service_key"]
        new_app["service_alias"] = "gr" + app["service_key"][-6:]
        new_app["extend_method"] = app["extend_method"]
        category = app["category"]
        new_app["category"] = category
        new_app[
            "service_source"] = "source_code" if category == "appliaction" else "market"
        new_app["creater"] = app["creater"]
        new_app["tenant_id"] = app.get("tenant_id", "")
        new_app["service_region"] = region
        new_app["service_id"] = ""
        new_app["memory"] = app["min_memory"]
        new_app["image"] = app["image"]
        new_app["plugin_map_list"] = []
        new_app["probes"] = []
        # 扩展信息
        new_app["extend_method_map"] = self.__v1_2_v2_extends_info(app)
        # 依赖信息
        new_app["dep_service_map_list"] = self.__v1_2_v2_dependencies(app)
        # 端口信息
        new_app["port_map_list"] = self.__v1_2_v2_ports(app)
        # 持久化信息
        new_app["service_volume_map_list"] = self.__v1_2_v2_volumes(app)
        # 环境变量信息
        service_env_map_list, service_connect_info_map_list = self.__v1_2_v2_envs(
            app)
        new_app["service_env_map_list"] = service_env_map_list
        new_app[
            "service_connect_info_map_list"] = service_connect_info_map_list
        return new_app
Exemple #7
0
    def backup_group_apps(self,
                          tenant,
                          user,
                          region,
                          group_id,
                          mode,
                          note,
                          force=False):
        s3_config = EnterpriseConfigService(
            tenant.enterprise_id).get_cloud_obj_storage_info()
        if mode == "full-online" and not s3_config:
            raise ErrObjectStorageInfoNotFound
        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": json.dumps(metadata),
            "service_ids": [s.service_id for s in services],
            "mode": mode,
            "version": version,
            "s3_config": s3_config,
            "force": force,
        }
        # 向数据中心发起备份任务
        try:
            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,
            }
            return backup_record_repo.create_backup_records(**record_data)
        except region_api.CallApiError as e:
            logger.exception(e)
            if e.status == 401:
                raise ServiceHandleException(msg="backup failed",
                                             msg_show="有状态组件必须停止方可进行备份")
Exemple #8
0
 def save_market_app_template(self, app_templates):
     template_version = app_templates["template_version"]
     is_v1 = bool(template_version == "v1")
     if is_v1:
         v2_template = template_transform_service.v1_to_v2(app_templates)
     else:
         v2_template = app_templates
     rainbond_app = rainbond_app_repo.get_rainbond_app_by_key_and_version(
         v2_template["group_key"], v2_template["group_version"])
     logger.debug("=========> {0}".format(json.dumps(v2_template)))
     if rainbond_app:
         if is_v1:
             rainbond_app.share_user = v2_template["share_user"]
             rainbond_app.share_team = v2_template["share_team"]
             rainbond_app.pic = v2_template["pic"]
             rainbond_app.describe = v2_template["describe"]
             rainbond_app.app_template = json.dumps(v2_template)
             rainbond_app.is_complete = True
             rainbond_app.update_time = current_time_str(
                 "%Y-%m-%d %H:%M:%S")
             rainbond_app.save()
         else:
             user_name = v2_template.get("publish_user", None)
             user_id = 0
             if user_name:
                 try:
                     user = user_repo.get_user_by_username(user_name)
                     user_id = user.user_id
                 except Exception as e:
                     logger.exception(e)
             rainbond_app.share_user = user_id
             rainbond_app.share_team = v2_template.get("publish_team", "")
             rainbond_app.pic = v2_template.get("pic", rainbond_app.pic)
             rainbond_app.describe = v2_template.get(
                 "update_note", rainbond_app.describe)
             rainbond_app.app_template = v2_template["template_content"]
             rainbond_app.is_complete = True
             rainbond_app.update_time = current_time_str(
                 "%Y-%m-%d %H:%M:%S")
             rainbond_app.save()
 def save_market_app_template(self, app_templates):
     v2_template = template_transform_service.v1_to_v2(app_templates)
     rainbond_app = rainbond_app_repo.get_rainbond_app_by_key_and_version(
         v2_template["group_key"], v2_template["group_version"])
     if rainbond_app:
         rainbond_app.share_user = v2_template["share_user"]
         rainbond_app.share_team = v2_template["share_team"]
         rainbond_app.pic = v2_template["pic"]
         rainbond_app.describe = v2_template["describe"]
         rainbond_app.app_template = json.dumps(v2_template)
         rainbond_app.is_complete = True
         rainbond_app.update_time = current_time_str("%Y-%m-%d %H:%M:%S")
         rainbond_app.save()
Exemple #10
0
    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:
            body = region_api.get_service_build_versions(self.response_region, self.tenant.tenant_name,
                                                         self.service.service_alias)

            events = event_repo.get_events_before_specify_time(self.tenant.tenant_id, self.service.service_id,
                                                               current_time_str(fmt="%Y-%m-%d %H:%M:%S")).filter(type="deploy")
            version_user_map = {event.deploy_version: event.user_name for event in events}

            versions_info = body["list"]
            version_list = []
            for info in versions_info:
                version_list.append({
                    "build_version": info["BuildVersion"],
                    "kind": BUILD_KIND_MAP.get(info["Kind"]),
                    "service_type": info["DeliveredType"],
                    "image_url": info["ImageName"],
                    "repo_url": info["RepoURL"],
                    "commit_msg": info["CommitMsg"],
                    "author": info["Author"],
                    "create_time": info["CreatedAt"],
                    "status": info["FinalStatus"],
                    "build_user": version_user_map.get(info["BuildVersion"], "未知")
                })
            res_versions = sorted(version_list,
                                  key=lambda version: version["build_version"], reverse=True)

            result = general_message(200, "success", "查询成功", list=res_versions)
        except Exception as e:
            logger.exception(e)
            result = error_message(e.message)
        return Response(result, status=result["code"])
 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 backup_group_apps(self, tenant, user, region, group_id, mode, note):
        s3_config = config_service.get_cloud_obj_storage_info()
        if mode == "full-online" and not s3_config:
            raise ErrObjectStorageInfoNotFound
        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,
            "s3_config": s3_config,
        }
        # 向数据中心发起备份任务
        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,
        }
        return backup_record_repo.create_backup_records(**record_data)
    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:
            page = request.GET.get("page_num", 1)
            page_size = request.GET.get("page_size", 10)
            body = region_api.get_service_build_versions(
                self.response_region, self.tenant.tenant_name,
                self.service.service_alias)
            build_version_sort = body["list"]
            build_version_sort.sort(key=operator.itemgetter('BuildVersion'),
                                    reverse=True)
            paginator = Paginator(build_version_sort, page_size)
            build_version_list = paginator.page(int(page)).object_list

            events = event_repo.get_events_before_specify_time(
                self.tenant.tenant_id, self.service.service_id,
                current_time_str(fmt="%Y-%m-%d %H:%M:%S")).filter(
                    type="deploy")
            version_user_map = {
                event.deploy_version: event.user_name
                for event in events
            }

            versions_info = build_version_list
            version_list = []
            for info in versions_info:
                version_list.append({
                    "build_version":
                    info["BuildVersion"],
                    "kind":
                    BUILD_KIND_MAP.get(info["Kind"]),
                    "service_type":
                    info["DeliveredType"],
                    "image_url":
                    info["ImageName"],
                    "repo_url":
                    info["RepoURL"],
                    "commit_msg":
                    info["CommitMsg"],
                    "author":
                    info["Author"],
                    "create_time":
                    info["CreatedAt"],
                    "status":
                    info["FinalStatus"],
                    "build_user":
                    version_user_map.get(info["BuildVersion"], "未知")
                })
            res_versions = sorted(version_list,
                                  key=lambda version: version["build_version"],
                                  reverse=True)
            # try:
            #     result = paginator.page(page).object_list
            # except PageNotAnInteger:
            #     result = paginator.page(1).object_list
            # except EmptyPage:
            #     result = paginator.page(paginator.num_pages).object_list
            result = general_message(200,
                                     "success",
                                     "查询成功",
                                     list=res_versions,
                                     total=paginator.count)
            return Response(result, status=result["code"])
        except Exception as e:
            result = error_message(e.message)
            return Response(result, status=500)
    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:
            page = request.GET.get("page_num", 1)
            page_size = request.GET.get("page_size", 10)
            body = region_api.get_service_build_versions(
                self.response_region, self.tenant.tenant_name,
                self.service.service_alias)
            logger.debug('---------body------>{0}'.format(body))
            build_version_sort = body["bean"]["list"]
            run_version = body["bean"]["deploy_version"]
            total_num_list = list()
            for build_version_info in build_version_sort:
                if build_version_info["FinalStatus"] in ("success", "failure"):
                    total_num_list.append(build_version_info)
            total_num = len(total_num_list)
            success_num = 0
            failure_num = 0
            for build_info in build_version_sort:
                if build_info["FinalStatus"]:
                    if build_info["FinalStatus"] == "success":
                        success_num += 1
                    else:
                        failure_num += 1
            logger.debug(
                '---------------build_version_sort---------->{0}'.format(
                    build_version_sort))
            build_version_sort.sort(key=operator.itemgetter('BuildVersion'),
                                    reverse=True)
            paginator = Paginator(build_version_sort, page_size)
            build_version_list = paginator.page(int(page)).object_list

            events = event_repo.get_events_before_specify_time(
                self.tenant.tenant_id, self.service.service_id,
                current_time_str(fmt="%Y-%m-%d %H:%M:%S")).filter(
                    type="deploy")
            version_user_map = {
                event.event_id: event.user_name
                for event in events
            }

            versions_info = build_version_list
            version_list = []
            for info in versions_info:
                version_list.append({
                    "build_version":
                    info["BuildVersion"],
                    "kind":
                    BUILD_KIND_MAP.get(info["Kind"]),
                    "service_type":
                    info["DeliveredType"],
                    "image_url":
                    info["ImageName"],
                    "repo_url":
                    info["RepoURL"],
                    "commit_msg":
                    info["CommitMsg"],
                    "author":
                    info["Author"],
                    "create_time":
                    info["CreatedAt"],
                    "status":
                    info["FinalStatus"],
                    "build_user":
                    version_user_map.get(info["EventID"], "未知")
                })
            res_versions = sorted(version_list,
                                  key=lambda version: version["build_version"],
                                  reverse=True)
            for res_version in res_versions:
                # get deploy version from region
                if int(res_version["build_version"]) > int(run_version):
                    upgrade_or_rollback = 1
                elif int(res_version["build_version"]) == int(run_version):
                    upgrade_or_rollback = 0
                else:
                    upgrade_or_rollback = -1
                res_version.update(
                    {"upgrade_or_rollback": upgrade_or_rollback})
            # try:
            #     result = paginator.page(page).object_list
            # except PageNotAnInteger:
            #     result = paginator.page(1).object_list
            # except EmptyPage:
            #     result = paginator.page(paginator.num_pages).object_list
            is_upgrade = False
            if res_versions:
                latest_version = res_versions[0]["build_version"]
                if int(latest_version) > int(run_version):
                    is_upgrade = True
            bean = {
                "is_upgrade": is_upgrade,
                "current_version": run_version,
                "success_num": str(success_num),
                "failure_num": str(failure_num)
            }
            result = general_message(200,
                                     "success",
                                     "查询成功",
                                     bean=bean,
                                     list=res_versions,
                                     total=str(total_num))
            return Response(result, status=result["code"])
        except Exception as e:
            logger.exception(e)
            result = error_message(e.message)
            return Response(result, status=500)