예제 #1
0
    def sync_service_plugin_event(self, user, region_name, tenant_name,
                                  record_id, record_event):
        rc_apps = RainbondCenterApp.objects.filter(record_id=record_id)
        if not rc_apps:
            return 404, "分享的应用不存在", None
        rc_app = rc_apps[0]
        app_template = json.loads(rc_app.app_template)
        plugins_info = app_template["plugins"]
        plugin_list = []
        for plugin in plugins_info:
            if record_event.plugin_id == plugin["plugin_id"]:
                event_id = make_uuid()
                body = {
                    "plugin_id":
                    plugin["plugin_id"],
                    "plugin_version":
                    plugin["build_version"],
                    "plugin_key":
                    plugin["plugin_key"],
                    "event_id":
                    event_id,
                    "share_user":
                    user.nick_name,
                    "share_scope":
                    rc_app.scope,
                    "image_info":
                    plugin.get("plugin_image")
                    if plugin.get("plugin_image") else "",
                }

                try:
                    res, body = region_api.share_plugin(
                        region_name, tenant_name, plugin["plugin_id"], body)
                    data = body.get("bean")
                    sid = transaction.savepoint()
                    if not data:
                        transaction.savepoint_rollback(sid)
                        return 400, "数据中心分享错误", None

                    record_event.region_share_id = data.get("share_id", None)
                    record_event.event_id = data.get("event_id", None)
                    record_event.event_status = "start"
                    record_event.update_time = datetime.datetime.now()
                    record_event.save()
                    image_name = data.get("image_name", None)
                    if image_name:
                        plugin["share_image"] = image_name

                    transaction.savepoint_commit(sid)
                except Exception as e:
                    logger.exception(e)
                    if sid:
                        transaction.savepoint_rollback(sid)
                    return 500, "插件分享事件同步发生错误", None

            plugin_list.append(plugin)
        app_template["plugins"] = plugin_list
        rc_app.app_template = json.dumps(app_template)
        rc_app.save()
        return 200, "success", record_event
예제 #2
0
 def create_publish_event(self, record_event, user_name, event_type):
     import datetime
     event = ServiceEvent(event_id=make_uuid(),
                          service_id=record_event.service_id,
                          tenant_id=record_event.team_id,
                          type=event_type,
                          user_name=user_name,
                          start_time=datetime.datetime.now())
     event.save()
     return event
예제 #3
0
 def get_plugins_group_items(self, plugins):
     rt_list = []
     for p in plugins:
         config_group_list = plugin_config_service.get_config_details(
             p["plugin_id"], p["build_version"])
         p["config_groups"] = config_group_list
         if p["origin_share_id"] == "new_create":
             p["plugin_key"] = make_uuid()
         else:
             p["plugin_key"] = p["origin_share_id"]
         rt_list.append(p)
     return rt_list
 def sync_event(self, nick_name, region_name, tenant_name, record_event):
     rcps = RainbondCenterPlugin.objects.filter(
         record_id=record_event.record_id)
     if not rcps:
         return 404, "分享的插件不存在", None
     rcp = rcps[0]
     event_id = make_uuid()
     record_event.event_id = event_id
     plugin_template = json.loads(rcp.plugin_template)
     share_plugin = plugin_template.get("share_plugin_info")
     body = {
         "plugin_id": rcp.plugin_id,
         "plugin_version": rcp.build_version,
         "plugin_key": rcp.plugin_key,
         "event_id": event_id,
         "share_user": nick_name,
         "share_scope": rcp.scope,
         "image_info":
         share_plugin.get("plugin_image") if share_plugin else "",
     }
     sid = transaction.savepoint()
     try:
         res, body = region_api.share_plugin(region_name, tenant_name,
                                             rcp.plugin_id, body)
         data = body.get("bean")
         if not data:
             transaction.savepoint_rollback(sid)
             return 400, "数据中心分享错误", None
         record_event.region_share_id = data.get("share_id", None)
         record_event.event_id = data.get("event_id", None)
         record_event.event_status = "start"
         record_event.update_time = datetime.now()
         record_event.save()
         image_name = data.get("image_name", None)
         if image_name:
             plugin_template["share_image"] = image_name
         rcp.plugin_template = json.dumps(plugin_template)
         rcp.save()
         transaction.savepoint_commit(sid)
         return 200, "数据中心分享开始", record_event
     except Exception as e:
         logger.exception(e)
         if sid:
             transaction.savepoint_rollback(sid)
         return 500, "插件分享事件同步发生错误", None
    def install_plugin(self, user, tenant, region_name, market_plugin):
        plugin_template = json.loads(market_plugin.plugin_template)
        share_plugin_info = plugin_template.get("share_plugin_info")

        sid = transaction.savepoint()

        try:
            image = None
            image_tag = None
            if plugin_template["share_image"]:
                image_and_tag = plugin_template["share_image"].rsplit(":", 1)
                if len(image_and_tag) > 1:
                    image = image_and_tag[0]
                    image_tag = image_and_tag[1]
                else:
                    image = image_and_tag[0]
                    image_tag = "latest"

            status, msg, plugin_base_info = plugin_service.create_tenant_plugin(
                tenant, user.user_id, region_name,
                share_plugin_info.get("desc"), plugin_template["plugin_name"],
                plugin_template["category"], "image", image,
                plugin_template["code_repo"])

            if status != 200:
                return status, msg

            plugin_base_info.origin = 'local_market' if market_plugin.source == 'local' else market_plugin.source
            plugin_base_info.origin_share_id = share_plugin_info.get(
                "plugin_key")
            plugin_base_info.save()

            build_version = plugin_template.get('build_version')
            min_memory = build_version.get('min_memory')

            plugin_build_version = plugin_version_service.create_build_version(
                region_name,
                plugin_base_info.plugin_id,
                tenant.tenant_id,
                user.user_id,
                "",
                "unbuild",
                min_memory,
                image_tag=image_tag,
                code_version="")

            config_groups, config_items = [], []
            share_config_groups = share_plugin_info.get('config_groups', [])

            for group in share_config_groups:
                plugin_config_group = PluginConfigGroup(
                    plugin_id=plugin_base_info.plugin_id,
                    build_version=plugin_build_version.build_version,
                    config_name=group.get("config_name"),
                    service_meta_type=group.get("service_meta_type"),
                    injection=group.get("injection"))
                config_groups.append(plugin_config_group)

                share_config_items = group.get('config_items', [])
                for item in share_config_items:
                    plugin_config_item = PluginConfigItems(
                        plugin_id=plugin_base_info.plugin_id,
                        build_version=plugin_build_version.build_version,
                        service_meta_type=item.get("service_meta_type"),
                        attr_name=item.get("attr_name"),
                        attr_alt_value=item.get("attr_alt_value"),
                        attr_type=item.get("attr_type", "string"),
                        attr_default_value=item.get("attr_default_value",
                                                    None),
                        is_change=item.get("is_change", False),
                        attr_info=item.get("attr_info", ""),
                        protocol=item.get("protocol", ""))
                    config_items.append(plugin_config_item)

            PluginConfigGroup.objects.bulk_create(config_groups)
            PluginConfigItems.objects.bulk_create(config_items)

            event_id = make_uuid()
            plugin_build_version.event_id = event_id
            plugin_build_version.plugin_version_status = "fixed"

            plugin_service.create_region_plugin(region_name,
                                                tenant,
                                                plugin_base_info,
                                                image_tag=image_tag)

            ret = plugin_service.build_plugin(
                region_name, plugin_base_info, plugin_build_version, user,
                tenant, event_id, share_plugin_info.get("plugin_image", None))
            plugin_build_version.build_status = ret.get('bean').get('status')
            plugin_build_version.save()

            return 200, '安装成功'
        except Exception as e:
            logger.exception(e)
            if sid:
                transaction.savepoint_rollback(sid)
            return 500, '插件安装失败'
예제 #6
0
    def query_share_service_info(self, team, group_id):
        service_list = share_repo.get_service_list_by_group_id(
            team=team, group_id=group_id)
        if service_list:
            array_ids = [x.service_id for x in service_list]
            deploy_versions = self.get_team_service_deploy_version(
                service_list[0].service_region, team, array_ids)
            array_keys = []
            for x in service_list:
                if x.service_key == "application" or x.service_key == "0000" or x.service_key == "":
                    array_keys.append(x.service_key)
            # 查询组件端口信息
            service_port_map = self.get_service_ports_by_ids(array_ids)
            # 查询组件依赖
            dep_service_map = self.get_service_dependencys_by_ids(array_ids)
            # 查询组件可变参数和不可变参数
            # service_env_change_map, service_env_nochange_map = self.get_service_env_by_ids(array_ids)
            service_env_map = self.get_service_env_by_ids(array_ids)
            # 查询组件持久化信息
            service_volume_map = self.get_service_volume_by_ids(array_ids)
            # dependent volume
            dep_mnt_map = self.get_dep_mnts_by_ids(team.tenant_id, array_ids)
            # 查询组件伸缩方式信息
            extend_method_map = self.get_service_extend_method_by_keys(
                array_keys)
            # 获取组件的健康检测设置
            probe_map = self.get_service_probes(array_ids)

            all_data_map = dict()

            for service in service_list:
                data = dict()
                data['service_id'] = service.service_id
                data['tenant_id'] = service.tenant_id
                data['service_cname'] = service.service_cname
                data['service_key'] = service.service_key
                if (service.service_key == 'application'
                        or service.service_key == '0000'
                        or service.service_key == 'mysql'):
                    data['service_key'] = make_uuid()
                    service.service_key = data['service_key']
                    service.save()
                #     data['need_share'] = True
                # else:
                #     data['need_share'] = False
                data["service_share_uuid"] = "{0}+{1}".format(
                    data['service_key'], data['service_id'])
                data['need_share'] = True
                data['category'] = service.category
                data['language'] = service.language
                data['extend_method'] = service.extend_method
                data['version'] = service.version
                data['memory'] = service.min_memory - service.min_memory % 32
                data['service_type'] = service.service_type
                data['service_source'] = service.service_source
                data['deploy_version'] = deploy_versions[data[
                    'service_id']] if deploy_versions else service.deploy_version
                data['image'] = service.image
                data['service_alias'] = service.service_alias
                data['service_name'] = service.service_name
                data['service_region'] = service.service_region
                data['creater'] = service.creater
                data["cmd"] = service.cmd
                data['probes'] = [
                    probe.to_dict()
                    for probe in probe_map.get(service.service_id, [])
                ]
                extend_method = extend_method_map.get(service.service_key)
                if extend_method:
                    e_m = dict()
                    e_m['min_node'] = service.min_node
                    e_m['max_node'] = extend_method.max_node
                    e_m['step_node'] = extend_method.step_node
                    e_m['min_memory'] = service.min_memory - service.min_memory % 32
                    e_m['max_memory'] = extend_method.max_memory
                    e_m['step_memory'] = extend_method.step_memory
                    e_m['is_restart'] = extend_method.is_restart
                    data['extend_method_map'] = e_m
                else:
                    data['extend_method_map'] = {
                        "min_node": service.min_node,
                        "max_node": 20,
                        "step_node": 1,
                        "min_memory": service.min_memory,
                        "max_memory": 65536,
                        "step_memory": 128,
                        "is_restart": 0
                    }
                data['port_map_list'] = list()
                if service_port_map.get(service.service_id):
                    for port in service_port_map.get(service.service_id):
                        p = dict()
                        # 写需要返回的port数据
                        p['protocol'] = port.protocol
                        p['tenant_id'] = port.tenant_id
                        p['port_alias'] = port.port_alias
                        p['container_port'] = port.container_port
                        p['is_inner_service'] = port.is_inner_service
                        p['is_outer_service'] = port.is_outer_service
                        data['port_map_list'].append(p)

                data['service_volume_map_list'] = list()
                if service_volume_map.get(service.service_id):
                    for volume in service_volume_map.get(service.service_id):
                        s_v = dict()
                        s_v['file_content'] = ''
                        if volume.volume_type == "config-file":
                            config_file = volume_repo.get_service_config_file(
                                volume.ID)
                            if config_file:
                                s_v['file_content'] = config_file.file_content
                        s_v['category'] = volume.category
                        s_v['volume_type'] = volume.volume_type
                        s_v['volume_path'] = volume.volume_path
                        s_v['volume_name'] = volume.volume_name
                        data['service_volume_map_list'].append(s_v)

                data['service_env_map_list'] = list()
                data['service_connect_info_map_list'] = list()
                if service_env_map.get(service.service_id):
                    for env_change in service_env_map.get(service.service_id):
                        if env_change.container_port == 0:
                            e_c = dict()
                            e_c['name'] = env_change.name
                            e_c['attr_name'] = env_change.attr_name
                            e_c['attr_value'] = env_change.attr_value
                            e_c['is_change'] = env_change.is_change
                            if env_change.scope == "outer":
                                e_c['container_port'] = env_change.container_port
                                data['service_connect_info_map_list'].append(
                                    e_c)
                            else:
                                data['service_env_map_list'].append(e_c)

                data['service_related_plugin_config'] = list()
                # plugins_attr_list = share_repo.get_plugin_config_var_by_service_ids(service_ids=service_ids)
                plugins_relation_list = share_repo.get_plugins_relation_by_service_ids(
                    service_ids=[service.service_id])
                for spr in plugins_relation_list:
                    service_plugin_config_var = service_plugin_config_repo.get_service_plugin_config_var(
                        spr.service_id, spr.plugin_id, spr.build_version)
                    plugin_data = spr.to_dict()
                    plugin_data["attr"] = [
                        var.to_dict() for var in service_plugin_config_var
                    ]
                    data['service_related_plugin_config'].append(plugin_data)

                all_data_map[service.service_id] = data

            all_data = list()
            for service_id in all_data_map:
                service = all_data_map[service_id]
                service['dep_service_map_list'] = list()
                if dep_service_map.get(service['service_id']):
                    for dep in dep_service_map.get(service['service_id']):
                        d = dict()
                        if all_data_map.get(dep.service_id):
                            # 通过service_key和service_id来判断依赖关系
                            d['dep_service_key'] = all_data_map[
                                dep.service_id]["service_share_uuid"]
                            service['dep_service_map_list'].append(d)

                service["mnt_relation_list"] = list()

                if dep_mnt_map.get(service_id):
                    for dep_mnt in dep_mnt_map.get(service_id):
                        if not all_data_map.get(dep_mnt.dep_service_id):
                            continue
                        service["mnt_relation_list"].append({
                            "service_share_uuid":
                            all_data_map[dep_mnt.dep_service_id]
                            ["service_share_uuid"],
                            "mnt_name":
                            dep_mnt.mnt_name,
                            "mnt_dir":
                            dep_mnt.mnt_dir
                        })
                all_data.append(service)
            return all_data
        else:
            return []