Exemple #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
Exemple #2
0
    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_type = "share-yb"
        if rcp.scope == "goodrain":
            event_type = "share-ys"

        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
Exemple #3
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
Exemple #4
0
    def bind_domain(self, service_id, domain_name):
        if ServiceDomain.objects.filter(domain_name=domain_name).count() > 0:
            return False, '域名已存在'

        service = app_svc.get_service_by_id(service_id)
        if not service:
            return False, '应不存在'

        tenant = app_group_svc.get_tenant_by_pk(service.tenant_id)
        user = app_group_svc.get_user_by_eid(tenant.enterprise_id)

        ports = app_group_svc.get_service_http_port(service.service_id)
        if not ports:
            return False, '未开通对外端口'

        data = {
            "uuid": make_uuid(domain_name),
            "domain_name": domain_name,
            "service_alias": service.service_alias,
            "tenant_id": service.tenant_id,
            "tenant_name": tenant.tenant_name,
            "service_port": ports[0].container_port,
            "protocol": "http",
            "add_time": datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
            "add_user": user.nick_name if user else "",
            "enterprise_id": tenant.enterprise_id,
            "certificate": "",
            "private_key": "",
            "certificate_name": ""
        }

        try:
            region_api.bindDomain(service.service_region, tenant.tenant_name,
                                  service.service_alias, data)
            domain = {
                "service_id":
                service.service_id,
                "service_name":
                service.service_alias,
                "domain_name":
                domain_name,
                "create_time":
                datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
                "container_port":
                ports[0].container_port,
                "protocol":
                "http",
                "certificate_id":
                0
            }
            domain_info = ServiceDomain(**domain)
            domain_info.save()
            return True, domain_info
        except Exception as e:
            return False, e.message.get('body').get('msgcn') or '绑定域名失败'
Exemple #5
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
Exemple #6
0
 def __generate_tenant_service_group(self, region_name, tenant_id, group_id,
                                     group_key, group_version, group_alias):
     group_name = '_'.join([group_alias, make_uuid()[-4:]])
     params = {
         "tenant_id": tenant_id,
         "group_name": group_name,
         "group_alias": group_alias,
         "group_key": group_key,
         "group_version": group_version,
         "region_name": region_name,
         "service_group_id": 0 if group_id == -1 else group_id
     }
     return tenant_service_group_repo.create_tenant_service_group(**params)
Exemple #7
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)
            # 查询服务伸缩方式信息
            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
                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
                    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)

                all_data.append(service)
            return all_data
        else:
            return []
Exemple #8
0
    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, '插件安装失败'
Exemple #9
0
 def __create_group(self, tenant_id, region_name, group_alias):
     group_name = '_'.join([group_alias, make_uuid()[-4:]])
     new_group = group_repo.add_group(tenant_id, region_name, group_name)
     return new_group
    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]
            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)
            # 查询服务伸缩方式信息
            extend_method_map = self.get_service_extend_method_by_keys(
                array_keys)
            # 获取应用的健康检测设置
            probe_map = self.get_service_probes(array_ids)

            all_data_map = {}
            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_source != AppConstants.MARKET:
                    data['service_key'] = make_uuid()
                #     data['need_share'] = True
                # else:
                #     data['need_share'] = False
                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
                data['service_type'] = service.service_type
                data['service_source'] = service.service_source
                data['deploy_version'] = service.deploy_version
                data['image'] = service.image
                data['service_alias'] = service.service_alias
                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'] = extend_method.min_node
                    e_m['max_node'] = extend_method.max_node
                    e_m['step_node'] = extend_method.step_node
                    e_m['min_memory'] = extend_method.min_memory
                    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": 1,
                        "max_node": 20,
                        "step_node": 1,
                        "min_memory": 128,
                        "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['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)
                service_ids = [x.service_id for x in service_list]
                plugins_attr_list = share_repo.get_plugins_attr_by_service_ids(
                    service_ids=service_ids)
                plugins_relation_list = share_repo.get_plugins_relation_by_service_ids(
                    service_ids=service_ids)
                data['plugin_map_list'] = list()
                for p_relation in plugins_relation_list:
                    plugin_data = dict()
                    if service.service_id == p_relation.service_id:
                        plugin_data['plugin_id'] = p_relation.plugin_id
                        plugin_data['build_version'] = p_relation.build_version
                        plugin_data[
                            'service_meta_type'] = p_relation.service_meta_type
                        plugin_data['plugin_status'] = p_relation.plugin_status
                        plugin_data['create_time'] = p_relation.create_time
                        plugin_data["attr"] = list()
                        for p_attr in plugins_attr_list:
                            if p_relation.service_id == p_attr.service_id:
                                attr_data = {}
                                attr_data[
                                    'dest_service_id'] = p_attr.dest_service_id
                                attr_data[
                                    'dest_service_alias'] = p_attr.dest_service_alias
                                attr_data[
                                    'container_port'] = p_attr.container_port
                                attr_data['attr_name'] = p_attr.attr_name
                                attr_data['attr_value'] = p_attr.attr_value
                                attr_data[
                                    'attr_alt_value'] = p_attr.attr_alt_value
                                attr_data['attr_type'] = p_attr.attr_type
                                attr_data[
                                    'attr_default_value'] = p_attr.attr_default_value
                                attr_data['protocol'] = p_attr.protocol
                                attr_data['attr_info'] = p_attr.attr_info
                                plugin_data["attr"].append(attr_data)
                    data['plugin_map_list'].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):
                            d['dep_service_key'] = all_data_map[
                                dep.service_id]['service_key']
                            service['dep_service_map_list'].append(d)
                all_data.append(service)
            return all_data
        else:
            return []