Пример #1
0
    def getServiceModel(self, app_service_list):
        published_service_list = []
        for app_service in app_service_list:
            service = ServiceInfo()
            service.service_key = app_service.service_key
            service.version = app_service.app_version
            service.publisher = app_service.publisher
            service.service_name = app_service.app_alias
            service.pic = app_service.logo
            service.info = app_service.info
            service.desc = app_service.desc
            service.status = app_service.status
            service.category = "app_publish"
            service.is_service = app_service.is_service
            service.is_web_service = app_service.is_web_service
            service.version = app_service.app_version
            service.update_version = app_service.update_version
            service.image = app_service.image
            service.slug = app_service.slug
            service.extend_method = app_service.extend_method
            service.cmd = app_service.cmd
            service.setting = ""
            service.env = app_service.env
            service.dependecy = ""
            service.min_node = app_service.min_node
            service.min_cpu = app_service.min_cpu
            service.min_memory = app_service.min_memory
            service.inner_port = app_service.inner_port
            service.volume_mount_path = app_service.volume_mount_path
            service.service_type = app_service.service_type
            service.is_init_accout = app_service.is_init_accout
            service.creater = app_service.creater
            service.namespace = app_service.namespace
            service.publish_type = "group"
            published_service_list.append(service)

        return published_service_list
Пример #2
0
    def post(self, request, format=None):
        """
        从云市查询服务信息
        ---
        parameters:
            - name: service_key
              description: service_key
              required: true
              type: string
              paramType: form
            - name: app_version
              description: app_version
              required: true
              type: string
              paramType: form
            - name: cloud_assistant
              description: 云帮标识
              required: false
              type: string
              paramType: form
        """
        try:
            print request.data

            service_key = request.POST.get('service_key')
            app_version = request.POST.get('app_version')

            utils = AppSendUtil(service_key, app_version)
            json_data = utils.query_service(service_key, app_version)
            logger.debug('---receive data---{}'.format(json_data))

            service_data = json_data.get('service', None)
            if not service_data:
                logger.error('there is no service data! pls check request')
                return JsonResponse({
                    "success": False,
                    "msg": "参数错误!",
                    "code": 201
                })
            # 保存发布的服务信息
            # 判断service_key, app_version是否存在,不存在则添加
            service_key = service_data.get('service_key')
            app_version = service_data.get('version')
            num = ServiceInfo.objects.filter(service_key=service_key,
                                             version=app_version).count()
            if num == 0:
                # add service
                base_info = ServiceInfo()
                base_info.service_key = service_data.get("service_key")
                base_info.publisher = service_data.get("publisher")
                base_info.service_name = service_data.get("service_name")
                base_info.pic = service_data.get("pic")
                base_info.info = service_data.get("info")
                base_info.desc = service_data.get("desc")
                base_info.status = service_data.get("status")
                base_info.category = service_data.get("category")
                base_info.is_service = service_data.get("is_service")
                base_info.is_web_service = service_data.get("is_web_service")
                base_info.version = service_data.get("app_version")
                base_info.update_version = service_data.get("update_version")
                base_info.image = service_data.get("image")
                base_info.slug = service_data.get("slug")
                base_info.extend_method = service_data.get("extend_method")
                base_info.cmd = service_data.get("cmd")
                base_info.setting = service_data.get("setting")
                base_info.env = service_data.get("env")
                base_info.dependecy = service_data.get("dependecy")
                base_info.min_node = service_data.get("min_node")
                base_info.min_cpu = service_data.get("min_cpu")
                base_info.min_memory = service_data.get("min_memory")
                base_info.inner_port = service_data.get("inner_port")
                # base_info.publish_time = service_data.publish_time
                base_info.volume_mount_path = service_data.get(
                    "volume_mount_path")
                base_info.service_type = service_data.get("service_type")
                base_info.is_init_accout = service_data.get("is_init_accout")
                # base_info.save()
                logger.debug('---add app service---ok---')
                # 保存service_env
                pre_list = json_data.get('pre_list', None)
                suf_list = json_data.get('suf_list', None)
                env_list = json_data.get('env_list', None)
                port_list = json_data.get('port_list', None)
                extend_list = json_data.get('extend_list', None)
                # 新增环境参数
                if env_list:
                    env_data = []
                    for env in env_list:
                        app_env = AppServiceEnv(
                            service_key=env.get("service_key"),
                            app_version=env.get("app_version"),
                            name=env.get("name"),
                            attr_name=env.get("attr_name"),
                            attr_value=env.get("attr_value"),
                            scope=env.get("scope"),
                            is_change=env.get("is_change"),
                            container_port=env.get("container_port"))
                        env_data.append(app_env)
                    AppServiceEnv.objects.bulk_create(env_data)
                logger.debug('---add app service env---ok---')
                # 端口信息
                if port_list:
                    port_data = []
                    for port in port_list:
                        app_port = AppServicePort(
                            service_key=port.get("service_key"),
                            app_version=port.get("app_version"),
                            container_port=port.get("container_port"),
                            protocol=port.get("protocol"),
                            port_alias=port.get("port_alias"),
                            is_inner_service=port.get("is_inner_service"),
                            is_outer_service=port.get("is_outer_service"))
                        port_data.append(app_port)
                    AppServicePort.objects.bulk_create(port_data)
                logger.debug('---add app service port---ok---')
                # 扩展信息
                if extend_list:
                    extend_data = []
                    for extend in extend_list:
                        app_port = ServiceExtendMethod(
                            service_key=extend.get("service_key"),
                            app_version=extend.get("app_version"),
                            min_node=extend.get("min_node"),
                            max_node=extend.get("max_node"),
                            step_node=extend.get("step_node"),
                            min_memory=extend.get("min_memory"),
                            max_memory=extend.get("max_memory"),
                            step_memory=extend.get("step_memory"),
                            is_restart=extend.get("is_restart"))
                        extend_data.append(app_port)
                    ServiceExtendMethod.objects.bulk_create(extend_data)
                logger.debug('---add app service extend---ok---')
                # 服务依赖关系
                relation_data = []
                if pre_list:
                    for relation in pre_list:
                        app_relation = AppServiceRelation(
                            service_key=relation.get("service_key"),
                            app_version=relation.get("app_version"),
                            app_alias=relation.get("app_alias"),
                            dep_service_key=relation.get("dep_service_key"),
                            dep_app_version=relation.get("dep_app_version"),
                            dep_app_alias=relation.get("dep_app_alias"))
                        relation_data.append(app_relation)
                if suf_list:
                    for relation in suf_list:
                        app_relation = AppServiceRelation(
                            service_key=relation.get("service_key"),
                            app_version=relation.get("app_version"),
                            app_alias=relation.get("app_alias"),
                            dep_service_key=relation.get("dep_service_key"),
                            dep_app_version=relation.get("dep_app_version"),
                            dep_app_alias=relation.get("dep_app_alias"))
                        relation_data.append(app_relation)
                AppServiceRelation.objects.bulk_create(relation_data)
                logger.debug('---add app service relation---ok---')
        except Exception as e:
            logger.exception(e)
        return Response({"ok": True}, status=200)
Пример #3
0
    def post(self, request, format=None):
        """
        获取某个租户信息(tenant_id或者tenant_name)
        ---
        parameters:
            - name: service_key
              description: 服务key
              required: true
              type: string
              paramType: form
            - name: app_version
              description: 服务版本
              required: true
              type: string
              paramType: form
            - name: image
              description: 镜像名
              required: false
              type: string
              paramType: form
            - name: slug
              description: slug包
              required: false
              type: string
              paramType: form
            - name: dest_yb
              description: dest_yb
              required: false
              type: boolean
              paramType: form
            - name: dest_ys
              description: dest_ys
              required: false
              type: boolean
              paramType: form
            - name: share_id
              description: share_id
              required: false
              type: string
              paramType: form

        """
        data = {}
        isys = False
        serviceInfo = None
        try:
            service_key = request.data.get('service_key', "")
            app_version = request.data.get('app_version', "")
            logger.debug(
                "group.publish",
                "invoke publish service method  service_key:" + service_key +
                " service_version" + app_version)
            image = request.data.get('image', "")
            slug = request.data.get('slug', "")
            dest_yb = request.data.get('dest_yb', False)
            dest_ys = request.data.get('dest_ys', False)

            app = AppService.objects.get(service_key=service_key,
                                         app_version=app_version)
            logger.debug(
                "group.publish",
                "dest_yb ==> {0} dest_ys ==> {1}".format(dest_yb, dest_ys))
            if not app.dest_yb:
                app.dest_yb = dest_yb
            if not app.dest_ys:
                app.dest_ys = dest_ys
            isok = False
            if app.is_outer and app.dest_yb and app.dest_ys:
                isok = True
            # if app.is_outer and app.dest_ys:
            #     isok = True
            #     app.dest_yb = True
            if not app.is_outer and app.dest_yb:
                isok = True
            if slug != "" and not slug.startswith("/"):
                slug = "/" + slug
            if isok:
                update_version = 1
                try:
                    serviceInfo = ServiceInfo.objects.get(
                        service_key=service_key, version=app_version)
                    update_version = serviceInfo.update_version + 1
                except Exception:
                    pass
                if serviceInfo is None:
                    serviceInfo = ServiceInfo()
                serviceInfo.service_key = app.service_key
                serviceInfo.publisher = app.publisher
                serviceInfo.service_name = app.app_alias
                serviceInfo.pic = app.logo
                serviceInfo.info = app.info
                serviceInfo.desc = app.desc
                serviceInfo.status = "published"
                if app.status == "private":
                    serviceInfo.status = app.status
                serviceInfo.category = "app_publish"
                serviceInfo.is_service = app.is_service
                serviceInfo.is_web_service = app.is_web_service
                serviceInfo.version = app.app_version
                serviceInfo.update_version = update_version
                if image != "":
                    serviceInfo.image = image
                else:
                    serviceInfo.image = app.image
                serviceInfo.slug = slug
                serviceInfo.extend_method = app.extend_method
                serviceInfo.cmd = app.cmd
                serviceInfo.setting = ""
                # SLUG_PATH=/app_publish/redis-stat/20151201175854.tgz,
                if slug != "":
                    serviceInfo.env = app.env + ",SLUG_PATH=" + slug + ","
                else:
                    serviceInfo.env = app.env
                serviceInfo.dependecy = ""
                serviceInfo.min_node = app.min_node
                serviceInfo.min_cpu = app.min_cpu
                serviceInfo.min_memory = app.min_memory
                serviceInfo.inner_port = app.inner_port
                serviceInfo.volume_mount_path = app.volume_mount_path
                serviceInfo.service_type = app.service_type
                serviceInfo.is_init_accout = app.is_init_accout
                serviceInfo.creater = app.creater
                serviceInfo.namespace = app.namespace
                # 判断是否为组发布
                key = request.data.get('share_id', None)
                if key:
                    serviceInfo.publish_type = "group"
                else:
                    serviceInfo.publish_type = "single"
                serviceInfo.save()
            app.is_ok = isok
            if slug != "":
                app.slug = slug
            if image != "":
                app.image = image
            app.save()
            isys = app.dest_ys
        except Exception as e:
            logger.exception(e)
            return Response({"ok": False}, status=500)

        logger.debug("group.publish", " ==> isok:{0}".format(isok))
        logger.debug("group.publish", " ==> isys:{0}".format(isys))
        logger.debug(
            "group.publish", " ==> Publish_YunShi:{0}".format(
                settings.MODULES["Publish_YunShi"]))

        # 发布到云市,调用http接口发送数据
        if isok and isys and settings.MODULES["Publish_YunShi"]:
            logger.debug("group.publish", " =====> publish to app market!")
            data = self.init_data(app, slug, image)
            apputil = AppSendUtil(service_key, app_version)
            # 发送服务参数不发送图片参数
            if data.get("pic") is not None:
                data.pop('pic')
            data["show_category"] = app.show_category
            # 添加租户信息
            try:
                tenant = Tenants.objects.get(tenant_id=data["tenant_id"])
                data["tenant_name"] = tenant.tenant_name
            except Tenants.DoesNotExist:
                logger.error(
                    "group.publish",
                    "tenant is not exists,tenant_id={}".format(
                        data["tenant_id"]))
            # 添加发布类型信息: publish or share
            # AppServiceExtend存在信息
            num = AppServiceExtend.objects.filter(
                service_key=service_key, app_version=app_version).count()
            if num == 1:
                data["publish_flow_type"] = 1

            share_id = None
            try:
                share_id = request.data.get('share_id', None)
                logger.debug("group.publish", "====> share id is " + share_id)
            except Exception as e:
                logger.exception(e)
            data["share_id"] = share_id
            apputil.send_services(data)
            # 发送图片
            if str(app.logo) is not None and str(app.logo) != "":
                image_url = str(app.logo)
                logger.debug("group.publish",
                             'send service logo:{}'.format(image_url))
                apputil.send_image('app_logo', image_url)
            # 发送请求到所有的数据中心进行数据同步
            # self.downloadImage(serviceInfo)

            # 判断是否服务组发布,发布是否成功
            logger.debug("group.publish", "========> before send app group !")
            app_service_group = None
            try:
                logger.debug(dest_ys)
                if share_id is not None and dest_ys:
                    try:
                        app_service_group = AppServiceGroup.objects.get(
                            ID=share_id)
                    except AppServiceGroup.DoesNotExist as e:
                        logger.exception(e)
                    if app_service_group is not None:
                        curr_step = app_service_group.step
                        if curr_step > 0:
                            logger.debug(
                                "group.publish",
                                "before remove one app from app_group ! step {}"
                                .format(curr_step))
                            curr_step -= 1
                            logger.debug(
                                "group.publish",
                                "after remove one app from app_group ! step {}"
                                .format(curr_step))
                            app_service_group.step = curr_step
                            app_service_group.save()
                        # 判断是否为最后一次调用,发布到最后一个应用后将组信息填写到云市
                        if curr_step == 0 and app_service_group.is_market:
                            logger.info(
                                "group.publish",
                                "send group publish info to app_market")
                            # 将服务组信息发送到云市
                            tenant_id = data["tenant_id"]
                            param_data = {
                                "group_name":
                                app_service_group.group_share_alias,
                                "group_key": app_service_group.group_share_id,
                                "tenant_id": tenant_id,
                                "group_version":
                                app_service_group.group_version,
                                "publish_type": app_service_group.publish_type,
                                "desc": app_service_group.desc,
                                "installable": app_service_group.installable
                            }
                            # tmp_ids = app_service_group.service_ids
                            # service_id_list = json.loads(tmp_ids)
                            logger.debug(
                                "group.publish", "===> group_id {0}".format(
                                    app_service_group.group_id))
                            service_id_list = ServiceGroupRelation.objects.filter(
                                group_id=app_service_group.group_id
                            ).values_list("service_id", flat=True)
                            if len(service_id_list) > 0:
                                # 查询最新发布的信息发送到云市。现在同一service_id会发布不同版本存在于云市,取出最新发布的
                                app_service_list = self.get_newest_published_service(
                                    service_id_list)
                                tenant_service_list = TenantServiceInfo.objects.filter(
                                    service_id__in=service_id_list,
                                    tenant_id=tenant_id)
                                service_category_map = {
                                    x.service_id: "self"
                                    if x.category == "application" else "other"
                                    for x in tenant_service_list
                                }
                                logger.debug(
                                    "group.publish",
                                    "===> service_category_map {}".format(
                                        service_category_map))
                                service_data = []
                                for app in app_service_list:
                                    owner = service_category_map.get(
                                        app.service_id, "other")
                                    service_map = {
                                        "service_key": app.service_key,
                                        "version": app.app_version,
                                        "owner": owner
                                    }

                                    service_data.append(service_map)
                                param_data["data"] = service_data
                                # 执行后台安装应用组流程,仅公有云
                                is_publish = sn.instance.cloud_assistant == "goodrain" and (
                                    not sn.instance.is_private())
                                if is_publish:
                                    backServiceInstall = BackServiceInstall()
                                    group_id, grdemo_service_ids, url_map, region_name = backServiceInstall.install_services(
                                        share_id)
                                    grdemo_console_url = "https://user.goodrain.com/apps/grdemo/myservice/?gid={0}&region={1}".format(
                                        str(group_id), region_name)

                                    param_data.update(
                                        {"console_url": grdemo_console_url})
                                    param_data.update(
                                        {"preview_urls": url_map})
                                # 发送组信息到云市
                                num = apputil.send_group(param_data)
                                if num != 0:
                                    logger.exception(
                                        "publish service group failed!")
                            # 应用组发布成功
                            app_service_group.is_success = True
                            app_service_group.save()
            except Exception as e:
                app_service_group.is_success = False
                app_service_group.save()
                logger.exception("group.publish", e)
                logger.error("group.publish", "publish service group failed!")

        return Response({"ok": True}, status=200)