Esempio n. 1
0
    def put(self, request, *args, **kwargs):
        """
        修改构建源
        ---
        """
        s_id = transaction.savepoint()
        try:
            image = request.data.get("image", None)
            cmd = request.data.get("cmd", None)
            service_source = request.data.get("service_source")
            git_url = request.data.get("git_url", None)
            code_version = request.data.get("code_version", None)
            user_name = request.data.get("user_name", None)
            password = request.data.get("password", None)

            if not service_source:
                return Response(general_message(400, "param error", "参数错误"), status=400)

            service_source_user = service_source_repo.get_service_source(team_id=self.service.tenant_id,
                                                                         service_id=self.service.service_id)

            if not service_source_user:
                service_source_info = {
                    "service_id": self.service.service_id,
                    "team_id": self.service.tenant_id,
                    "user_name": user_name,
                    "password": password,
                    "create_time": datetime.datetime.now().strftime('%Y%m%d%H%M%S')
                }
                service_source_repo.create_service_source(**service_source_info)
            else:
                service_source_user.user_name = user_name
                service_source_user.password = password
                service_source_user.save()
            if service_source == "source_code":
                if code_version:
                    self.service.code_version = code_version
                else:
                    self.service.code_version = "master"
                if git_url:
                    self.service.git_url = git_url
                self.service.save()
                transaction.savepoint_commit(s_id)
            elif service_source == "docker_run":
                if image:
                    version = image.split(':')[-1]
                    if not version:
                        version = "latest"
                        image = image + ":" + version
                    self.service.image = image
                    self.service.version = version
                self.service.cmd = cmd
                self.service.save()
                transaction.savepoint_commit(s_id)
            result = general_message(200, "success", "修改成功")
        except Exception as e:
            logger.exception(e)
            result = error_message(e.message)
            transaction.savepoint_rollback(s_id)
        return Response(result, status=result["code"])
Esempio n. 2
0
    def _create_components(self, app_id, upgrade_group_id):
        components = group_service.list_components_by_upgrade_group_id(app_id, upgrade_group_id)
        component_ids = [cpt.component_id for cpt in components]

        http_rules = self._list_http_rules(component_ids)
        tcp_rules = self._list_tcp_rules(component_ids)

        result = []
        # TODO(huangrh): get the attributes at once, don't get it iteratively
        for cpt in components:
            component_source = service_source_repo.get_service_source(cpt.tenant_id, cpt.service_id)
            envs = env_var_repo.get_service_env(cpt.tenant_id, cpt.service_id)
            ports = port_repo.get_service_ports(cpt.tenant_id, cpt.service_id)
            volumes = volume_repo.get_service_volumes_with_config_file(cpt.service_id)
            config_files = volume_repo.get_service_config_files(cpt.service_id)
            probes = probe_repo.list_probes(cpt.service_id)
            monitors = service_monitor_repo.list_by_service_ids(cpt.tenant_id, [cpt.service_id])
            graphs = component_graph_repo.list(cpt.service_id)
            component = Component(
                cpt,
                component_source,
                envs,
                ports,
                volumes,
                config_files,
                probes,
                None,
                monitors,
                graphs, [],
                http_rules=http_rules.get(cpt.component_id),
                tcp_rules=tcp_rules.get(cpt.component_id),
                support_labels=self.support_labels)
            result.append(component)
        return result
 def __init__(self,
              service,
              tenant,
              all_component_one_model=None,
              only_one_component=False,
              install_from_cloud=False):
     self.service = service
     self.tenant = tenant
     self.service_source = service_source_repo.get_service_source(
         service.tenant_id, service.service_id)
     self.current_version = self.service_source.version
     self.install_from_cloud = False
     self.market_name = None
     self.only_one_component = only_one_component
     self.market = None
     self.all_component_one_model = all_component_one_model
     if self.service_source and self.service_source.extend_info:
         extend_info = json.loads(self.service_source.extend_info)
         if extend_info and extend_info.get("install_from_cloud", False):
             self.install_from_cloud = True
         if self.install_from_cloud:
             self.market_name = extend_info.get("market_name", None)
             self.market = app_market_repo.get_app_market_by_name(
                 tenant.enterprise_id,
                 self.market_name,
                 raise_exception=True)
Esempio n. 4
0
    def __init__(self, tenant, service, version):
        self.tenant = tenant
        self.service = service
        self.service_source = service_source_repo.get_service_source(
            tenant.tenant_id, service.service_id)
        if self.service_source.extend_info:
            extend_info = json.loads(self.service_source.extend_info)
            self.install_from_cloud = extend_info.get("install_from_cloud",
                                                      False)
            if self.install_from_cloud:
                logger.info("service {0} imstall from cloud".format(
                    service.service_alias))
        else:
            self.install_from_cloud = False
        # If no version is specified, the default version is used.
        if not version:
            version = self.service_source.version
        self.version = version
        self.group_key = self.service_source.group_key
        self.changes = {}
        # data that has been successfully changed
        self.changed = {}
        self.backup = None
        self.async_action = None

        self.update_funcs = self._create_update_funcs()
        self.sync_funcs = self._create_sync_funcs()
        self.restore_func = self._create_restore_funcs()
        self.async_build, self.async_update = self._create_async_action_tbl()

        self.app_restore = AppRestore(tenant, service)
        self.auto_restore = True
Esempio n. 5
0
    def create_plugin_cfg_4marketsvc(self, tenant, service, version, plugin_id,
                                     build_version,
                                     service_plugin_config_vars):
        service_source = service_source_repo.get_service_source(
            tenant.tenant_id, service.service_id)
        config_list = []
        for config in service_plugin_config_vars:
            dest_service_id, dest_service_alias = "", ""
            if config["service_meta_type"] == "downstream_port":
                service_key = rbd_center_app_service.get_service_key_by_service_id(
                    tenant, service_source, version, config["dest_service_id"])
                dest_service = app_service.get_service_by_service_key(
                    service, service_key)
                dest_service_id = dest_service.service_id
                dest_service_alias = dest_service.service_alias

            config_list.append(
                ServicePluginConfigVar(
                    service_id=service.service_id,
                    plugin_id=plugin_id,
                    build_version=build_version,
                    service_meta_type=config["service_meta_type"],
                    injection=config["injection"],
                    dest_service_id=dest_service_id,
                    dest_service_alias=dest_service_alias,
                    container_port=config["container_port"],
                    attrs=config["attrs"],
                    protocol=config["protocol"]))

        ServicePluginConfigVar.objects.bulk_create(config_list)
Esempio n. 6
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:
         if self.service.service_source == "market":
             service_source = service_source_repo.get_service_source(self.tenant.tenant_id, self.service.service_id)
             if not service_source:
                 result = general_message(200, "success", "当前云市应用已删除", bean=self.service.to_dict())
                 return Response(result, status=result["code"])
             rain_app = rainbond_app_repo.get_rainbond_app_by_key_and_version(service_source.group_key,
                                                                              service_source.version)
             if not rain_app:
                 result = general_message(200, "success", "当前云市应用已删除", bean=self.service.to_dict())
                 return Response(result, status=result["code"])
         result = general_message(200, "success", "查询成功", bean=self.service.to_dict())
     except Exception as e:
         logger.exception(e)
         result = error_message(e.message)
     return Response(result, status=result["code"])
 def _app_template_source(app_id, app_model_key, upgrade_group_id):
     components = group_service.get_rainbond_services(app_id, app_model_key, upgrade_group_id)
     if not components:
         raise AbortRequest("components not found", "找不到组件", status_code=404, error_code=404)
     component = components[0]
     component_source = service_source_repo.get_service_source(component.tenant_id, component.service_id)
     return component_source
Esempio n. 8
0
 def get(self, request, *args, **kwargs):
     """
     查询构建源信息
     ---
     """
     try:
         service_source = service_source_repo.get_service_source(
             team_id=self.service.tenant_id,
             service_id=self.service.service_id)
         bean = {
             "user_name": "",
             "password": "",
             "service_source": self.service.service_source,
             "image": self.service.image,
             "cmd": self.service.cmd,
             "code_from": self.service.code_from,
             "version": self.service.version,
             "docker_cmd": self.service.docker_cmd,
             "create_time": self.service.create_time,
             "git_url": self.service.git_url,
             "code_version": self.service.code_version,
             "server_type": self.service.server_type,
             "language": self.service.language,
         }
         if service_source:
             bean["user"] = service_source.user_name
             bean["password"] = service_source.password
         if self.service.service_source == 'market':
             if service_source:
                 # get from cloud
                 rain_app = None
                 if service_source.extend_info:
                     extend_info = json.loads(service_source.extend_info)
                     if extend_info and extend_info.get(
                             "install_from_cloud", False):
                         rain_app = market_app_service.get_app_from_cloud(
                             self.tenant, service_source.group_key,
                             service_source.version)
                         bean["install_from_cloud"] = True
                         bean["app_detail_url"] = rain_app.describe
                 if not rain_app:
                     rain_app = rainbond_app_repo.get_rainbond_app_by_key_and_version(
                         service_source.group_key, service_source.version)
                 if rain_app:
                     bean["rain_app_name"] = rain_app.group_name
                     bean["details"] = rain_app.details
                     logger.debug("app_version: {}".format(
                         rain_app.version))
                     bean["app_version"] = rain_app.version
                     bean["version"] = rain_app.version
                     bean["group_key"] = rain_app.group_key
         result = general_message(200, "success", "查询成功", bean=bean)
     except ServiceHandleException as e:
         raise e
     except Exception as e:
         logger.exception(e)
         result = error_message(e.message)
     return Response(result, status=result["code"])
Esempio n. 9
0
    def check_service(self, tenant, service, is_again):
        # if service.create_status == "complete":
        #     return 409, "应用完成创建,请勿重复检测", None
        body = dict()
        body["tenant_id"] = tenant.tenant_id
        body["source_type"] = self.__get_service_region_type(
            service.service_source)
        source_body = ""
        service_source = service_source_repo.get_service_source(
            tenant.tenant_id, service.service_id)
        user_name = ""
        password = ""
        service.service_source = self.__get_service_source(service)
        if service_source:
            user_name = service_source.user_name
            password = service_source.password
        if service.service_source == AppConstants.SOURCE_CODE:

            sb = {
                "server_type": service.server_type,
                "repository_url": service.git_url,
                "branch": service.code_version,
                "user": user_name,
                "password": password,
                "tenant_id": tenant.tenant_id
            }
            source_body = json.dumps(sb)
        elif service.service_source == AppConstants.DOCKER_RUN or service.service_source == AppConstants.DOCKER_IMAGE:
            source_body = service.docker_cmd
        elif service.service_source == AppConstants.THIRD_PARTY:
            # endpoints信息
            service_endpoints = service_endpoints_repo.get_service_endpoints_by_service_id(
                service.service_id)
            if service_endpoints:
                if service_endpoints.endpoints_type == "discovery":
                    source_body = service_endpoints.endpoints_info

        body["username"] = user_name
        body["password"] = password
        body["source_body"] = source_body
        logger.debug('======body========>{0}'.format(json.dumps(body)))
        res, body = region_api.service_source_check(service.service_region,
                                                    tenant.tenant_name, body)
        bean = body["bean"]
        service.check_uuid = bean["check_uuid"]
        service.check_event_id = bean["event_id"]
        # 更新创建状态
        if not is_again:
            service.create_status = "checking"
        service.save()
        bean = dict()
        bean.update(service.to_dict())
        bean.update({"user_name": user_name, "password": password})
        bean.update(self.__wrap_check_service(service))
        return 200, u"success", bean
    def save_multi_services(self, region_name, tenant, group_id, service, user,
                            service_infos):
        service_source = service_source_repo.get_service_source(
            tenant.tenant_id, service.service_id)
        tx = transaction.savepoint()
        for service_info in service_infos:
            code, msg_show, new_service = app_service \
                .create_source_code_app(region_name, tenant, user,
                                        service.code_from,
                                        service_info["cname"],
                                        service.clone_url,
                                        service.git_project_id,
                                        service.code_version,
                                        service.server_type,
                                        oauth_service_id=service.oauth_service_id,
                                        git_full_name=service.git_full_name)
            if code != 200:
                logger.error(
                    "Multiple services; Service alias: {}; error creating service"
                    .format(service.service_alias))
                transaction.savepoint_rollback(tx)
                return code, msg_show
            # add username and password
            if service_source:
                git_password = service_source.password
                git_user_name = service_source.user_name
                if git_password or git_user_name:
                    app_service.create_service_source_info(
                        tenant, new_service, git_user_name, git_password)
            #  add group
            code, msg_show = group_service.add_service_to_group(
                tenant, region_name, group_id, new_service.service_id)
            if code != 200:
                logger.debug(
                    "Group ID: {0}; Service ID: {1}; error adding service to group"
                    .format(group_id, new_service.service_id))
                transaction.savepoint_rollback(tx)
                return code, msg_show
            # save service info, such as envs, ports, etc
            code, msg = app_check_service.save_service_info(
                tenant, new_service, service_info)
            if code != 200:
                logger.debug(
                    "Group ID: {0}; Service ID: {1}; error saving services".
                    format(group_id, new_service.service_id))
                transaction.savepoint_rollback(tx)
                return code, msg
            new_service = app_service.create_region_service(
                tenant, new_service, user.nick_name)
            new_service.create_status = "complete"
            new_service.save()

        transaction.savepoint_commit(tx)

        return 200, "success"
Esempio n. 11
0
 def get(self, request, *args, **kwargs):
     """
     查询构建源信息
     ---
     """
     try:
         service_source = service_source_repo.get_service_source(team_id=self.service.tenant_id,
                                                                 service_id=self.service.service_id)
         bean = {
             "user_name": "",
             "password": ""
         }                                         
         if service_source:
             bean["user"] = service_source.user_name
             bean["password"] = service_source.password
         
         if self.service.service_source == 'market':
             if service_source:
                 # 获取内部市场对象
                 rain_app = rainbond_app_repo.get_rainbond_app_by_key_and_version(service_source.group_key,
                                                                                  service_source.version)
                 if rain_app:
                     bean["rain_app_name"] = rain_app.group_name
                     bean["details"] = rain_app.details
                     logger.debug("app_version: {}".format(rain_app.version))
                     bean["app_version"] = rain_app.version
                     bean["group_key"] = rain_app.group_key
         bean["service_source"] = self.service.service_source
         bean["image"] = self.service.image
         bean["cmd"] = self.service.cmd
         bean["code_from"] = self.service.code_from
         bean["version"] = self.service.version
         bean["docker_cmd"] = self.service.docker_cmd
         bean["create_time"] = self.service.create_time
         bean["git_url"] = self.service.git_url
         bean["code_version"] = self.service.code_version
         bean["server_type"] = self.service.server_type
         bean["language"] = self.service.language
         if self.service.service_source == 'market':
             if service_source:
                 # 获取内部市场对象
                 rain_app = rainbond_app_repo.get_rainbond_app_by_key_and_version(service_source.group_key,
                                                                                  service_source.version)
                 if rain_app:
                     bean["rain_app_name"] = rain_app.group_name
                     bean["details"] = rain_app.details
                     logger.debug("version: {}".format(rain_app.version))
                     bean["version"] = rain_app.version
                     bean["group_key"] = rain_app.group_key
         result = general_message(200, "success", "查询成功", bean=bean)
     except Exception as e:
         logger.exception(e)
         result = error_message(e.message)
     return Response(result, status=result["code"])
Esempio n. 12
0
 def get(self, request, *args, **kwargs):
     """
     查询构建源信息
     ---
     """
     service_alias = self.service.service_alias
     try:
         service_source = team_services.get_service_source(
             service_alias=service_alias)
         service_source_user = service_source_repo.get_service_source(
             team_id=self.service.tenant_id,
             service_id=self.service.service_id)
         user = ""
         password = ""
         bean = {}
         if service_source_user:
             user = service_source_user.user_name
             password = service_source_user.password
         bean["user_name"] = user
         bean["password"] = password
         if not service_source:
             return Response(general_message(404, "no found source",
                                             "没有这个应用的构建源"),
                             status=404)
         if service_source.service_source == 'market':
             # 获取组对象
             group_obj = tenant_service_group_repo.get_group_by_service_group_id(
                 service_source.tenant_service_group_id)
             if group_obj:
                 # 获取内部市场对象
                 rain_app = rainbond_app_repo.get_rainbond_app_by_key_and_version(
                     group_obj.group_key, group_obj.group_version)
                 if rain_app:
                     bean["rain_app_name"] = rain_app.group_name
                     bean["details"] = rain_app.details
                     bean["app_version"] = rain_app.version
                     bean["group_key"] = rain_app.group_key
         bean["service_source"] = service_source.service_source
         bean["image"] = service_source.image
         bean["cmd"] = service_source.cmd
         bean["code_from"] = service_source.code_from
         bean["version"] = service_source.version
         bean["docker_cmd"] = service_source.docker_cmd
         bean["create_time"] = service_source.create_time
         bean["git_url"] = service_source.git_url
         bean["code_version"] = service_source.code_version
         bean["server_type"] = service_source.server_type
         bean["language"] = service_source.language
         result = general_message(200, "success", "查询成功", bean=bean)
     except Exception as e:
         logger.exception(e)
         result = error_message(e.message)
     return Response(result, status=result["code"])
Esempio n. 13
0
 def __init__(self, service, tenant, all_component_one_model=None, only_one_component=False, install_from_cloud=False):
     self.service = service
     self.tenant = tenant
     self.service_source = service_source_repo.get_service_source(service.tenant_id, service.service_id)
     self.current_version = self.service_source.version
     self.install_from_cloud = self.service_source.is_install_from_cloud()
     self.market_name = self.service_source.get_market_name()
     self.only_one_component = only_one_component
     self.market = None
     self.all_component_one_model = all_component_one_model
     if self.install_from_cloud and self.market_name:
         self.market = app_market_repo.get_app_market_by_name(tenant.enterprise_id, self.market_name, raise_exception=True)
Esempio n. 14
0
    def save_multi_services(self, region_name, tenant, group_id, service, user,
                            service_infos):
        service_source = service_source_repo.get_service_source(
            tenant.tenant_id, service.service_id)
        service_ids = []
        for service_info in service_infos:
            code, msg_show, new_service = app_service \
                .create_source_code_app(region_name, tenant, user,
                                        service.code_from,
                                        service_info["cname"],
                                        service.clone_url,
                                        service.git_project_id,
                                        service.code_version,
                                        service.server_type,
                                        oauth_service_id=service.oauth_service_id,
                                        git_full_name=service.git_full_name)
            if code != 200:
                raise AbortRequest(
                    "Multiple services; Service alias: {}; error creating service"
                    .format(service.service_alias), "创建多组件应用失败")
            # add username and password
            if service_source:
                git_password = service_source.password
                git_user_name = service_source.user_name
                if git_password or git_user_name:
                    app_service.create_service_source_info(
                        tenant, new_service, git_user_name, git_password)
            #  add group
            code, msg_show = group_service.add_service_to_group(
                tenant, region_name, group_id, new_service.service_id)
            if code != 200:
                logger.debug(
                    "Group ID: {0}; Service ID: {1}; error adding service to group"
                    .format(group_id, new_service.service_id))
                raise AbortRequest("app not found", "创建多组件应用失败", 404, 404)
            # save service info, such as envs, ports, etc
            code, msg = app_check_service.save_service_info(
                tenant, new_service, service_info)
            if code != 200:
                logger.debug(
                    "Group ID: {0}; Service ID: {1}; error saving services".
                    format(group_id, new_service.service_id))
                raise AbortRequest(msg, "创建多组件应用失败")
            new_service = app_service.create_region_service(
                tenant, new_service, user.nick_name)
            new_service.create_status = "complete"
            new_service.save()
            service_ids.append(new_service.service_id)

        return service_ids
Esempio n. 15
0
 def __init__(self, service, tenant, install_from_cloud=False):
     self.service = service
     self.tenant = tenant
     self.current_version = None
     self.current_app = None
     self.template = None
     self.service_source = service_source_repo.get_service_source(
         service.tenant_id, service.service_id)
     self.install_from_cloud = False
     if self.service_source and self.service_source.extend_info:
         self.current_version_str = self.service_source.version
         extend_info = json.loads(self.service_source.extend_info)
         if extend_info and extend_info.get("install_from_cloud", False):
             self.install_from_cloud = True
         self.__get_current_app_and_version()
Esempio n. 16
0
 def app_template_source(self):
     """
     Optimization: the component group should save the source of the app template itself.
     """
     components = group_service.get_rainbond_services(
         self.app_id, self.app_model_key, self.upgrade_group_id)
     if not components:
         raise AbortRequest("components not found",
                            "找不到组件",
                            status_code=404,
                            error_code=404)
     component = components[0]
     component_source = service_source_repo.get_service_source(
         component.tenant_id, component.service_id)
     return component_source
Esempio n. 17
0
    def check_service(self, tenant, service):
        if service.create_status == "complete":
            return 409, "应用完成创建,请勿重复检测", None
        body = dict()
        body["tenant_id"] = tenant.tenant_id
        body["source_type"] = self.__get_service_region_type(
            service.service_source)
        source_body = ""
        service_source = service_source_repo.get_service_source(
            tenant.tenant_id, service.service_id)
        user_name = ""
        password = ""
        service.service_source = self.__get_service_source(service)
        if service_source:
            user_name = service_source.user_name
            password = service_source.password
        if service.service_source == AppConstants.SOURCE_CODE:

            sb = {
                "server_type": service.server_type,
                "repository_url": service.git_url,
                "branch": service.code_version,
                "user": user_name,
                "password": password,
                "tenant_id": tenant.tenant_id
            }
            source_body = json.dumps(sb)
        elif service.service_source == AppConstants.DOCKER_RUN or service.service_source == AppConstants.DOCKER_IMAGE:
            source_body = service.docker_cmd

        body["username"] = user_name
        body["password"] = password
        body["source_body"] = source_body

        res, body = region_api.service_source_check(service.service_region,
                                                    tenant.tenant_name, body)
        bean = body["bean"]
        service.check_uuid = bean["check_uuid"]
        service.check_event_id = bean["event_id"]
        # 更新创建状态
        service.create_status = "checking"
        service.save()
        bean = dict()
        bean.update(service.to_dict())
        bean.update({"user_name": user_name, "password": password})
        bean.update(self.__wrap_check_service(service))
        return 200, u"success", bean
Esempio n. 18
0
 def modify_property(self):
     """
     Perform modifications to the given properties. must be called after `set_changes`.
     """
     service_source = service_source_repo.get_service_source(
         self.tenant.tenant_id, self.service.service_id)
     app = rbd_center_app_service.get_version_app(self.tenant.enterprise_id,
                                                  self.version,
                                                  service_source)
     self._update_service(app)
     self._update_service_source(app, self.version)
     changes = deepcopy(self.changes)
     for k, v in changes.items():
         func = self.update_funcs.get(k, None)
         if func is None:
             continue
         func(v)
Esempio n. 19
0
    def get_service_details(self, tenant, service):
        service_base = service.to_dict()
        service_labels = service_label_repo.get_service_labels(service.service_id)
        service_domains = domain_repo.get_service_domains(service.service_id)
        service_tcpdomains = tcp_domain.get_service_tcpdomains(service.service_id)
        service_events = event_repo.get_specified_num_events(tenant.tenant_id, service.service_id)
        service_perms = service_perm_repo.get_service_perms_by_service_pk(service.ID)
        service_probes = probe_repo.get_service_probe(service.service_id)
        service_source = service_source_repo.get_service_source(tenant.tenant_id, service.service_id)
        service_auths = auth_repo.get_service_auth(service.service_id)
        service_env_vars = env_var_repo.get_service_env(tenant.tenant_id, service.service_id)
        service_compile_env = compile_env_repo.get_service_compile_env(service.service_id)
        service_extend_method = extend_repo.get_extend_method_by_service(service)
        image_service_relation = image_service_relation_repo.get_image_service_relation(tenant.tenant_id,
                                                                                        service.service_id)
        service_mnts = mnt_repo.get_service_mnts(tenant.tenant_id, service.service_id)
        service_plugin_relation = app_plugin_relation_repo.get_service_plugin_relation_by_service_id(service.service_id)
        service_plugin_config = service_plugin_config_repo.get_service_plugin_all_config(service.service_id)
        service_relation = dep_relation_repo.get_service_dependencies(tenant.tenant_id, service.service_id)
        service_volumes = volume_repo.get_service_volumes(service.service_id)
        service_config_file = volume_repo.get_service_config_files(service.service_id)
        service_ports = port_repo.get_service_ports(tenant.tenant_id, service.service_id)

        app_info = {
            "service_base": service_base,
            "service_labels": [label.to_dict() for label in service_labels],
            "service_domains": [domain.to_dict() for domain in service_domains],
            "service_tcpdomains": [tcpdomain.to_dict() for tcpdomain in service_tcpdomains],
            "service_events": [event.to_dict() for event in service_events],
            "service_perms": [perm.to_dict() for perm in service_perms],
            "service_probes": [probe.to_dict() for probe in service_probes],
            "service_source": service_source.to_dict() if service_source else None,
            "service_auths": [auth.to_dict() for auth in service_auths],
            "service_env_vars": [env_var.to_dict() for env_var in service_env_vars],
            "service_compile_env": service_compile_env.to_dict() if service_compile_env else None,
            "service_extend_method": service_extend_method.to_dict() if service_extend_method else None,
            "image_service_relation": image_service_relation.to_dict() if image_service_relation else None,
            "service_mnts": [mnt.to_dict() for mnt in service_mnts],
            "service_plugin_relation": [plugin_relation.to_dict() for plugin_relation in service_plugin_relation],
            "service_plugin_config": [config.to_dict() for config in service_plugin_config],
            "service_relation": [relation.to_dict() for relation in service_relation],
            "service_volumes": [volume.to_dict() for volume in service_volumes],
            "service_config_file": [config_file.to_dict() for config_file in service_config_file],
            "service_ports": [port.to_dict() for port in service_ports]
        }
        return app_info
Esempio n. 20
0
    def __init__(self, tenant, service, version):
        self.tenant = tenant
        self.service = service
        if version is None:
            service_source = service_source_repo.get_service_source(
                tenant.tenant_id, service.service_id)
            version = service_source.version
        self.version = version

        # data that has been successfully changed
        self.changed = {}
        self.backup = None
        self.async_action = None

        self.update_funcs = self._create_update_funcs()
        self.sync_funcs = self._create_sync_funcs()
        self.restore_func = self._create_restore_funcs()

        self.async_build, self.async_update = self._create_async_action_tbl()
Esempio n. 21
0
    def __init__(self,
                 tenant,
                 service,
                 version,
                 all_component_one_model=None,
                 component_change_info=None,
                 app_version=None):
        self.tenant = tenant
        self.service = service
        self.market_name = None
        # tenant service models
        self.all_component_one_model = all_component_one_model
        self.service_source = service_source_repo.get_service_source(
            tenant.tenant_id, service.service_id)
        self.install_from_cloud = self.service_source.is_install_from_cloud()
        self.market_name = self.service_source.get_market_name()
        # If no version is specified, the default version is used.
        self.async_action = None
        if not version:
            version = self.service_source.version
            self.async_action = AsyncAction.BUILD.value
        self.version = version
        self.group_key = self.service_source.group_key
        self.changes = component_change_info
        if app_version:
            self.template = json.loads(app_version.app_template)
            self.template_update_time = app_version.update_time
        else:
            self.template = None
            self.template_update_time = None
        self.update_source = False
        # data that has been successfully changed
        self.changed = {}
        self.backup = None

        self.update_funcs = self._create_update_funcs()
        self.sync_funcs = self._create_sync_funcs()
        self.restore_func = self._create_restore_funcs()
        self.async_build, self.async_update = self._create_async_action_tbl()

        self.app_restore = AppRestore(tenant, service)
        self.auto_restore = True
Esempio n. 22
0
    def update_check_app(self, tenant, service, data):

        service_source = service_source_repo.get_service_source(
            tenant.tenant_id, service.service_id)
        service_cname = data.get("service_cname", service.service_cname)
        image = data.get("image", service.image)
        cmd = data.get("cmd", service.cmd)
        docker_cmd = data.get("docker_cmd", service.docker_cmd)
        git_url = data.get("git_url", service.git_url)
        min_memory = data.get("min_memory", service.min_memory)
        min_memory = int(min_memory)
        min_cpu = baseService.calculate_service_cpu(service.service_region,
                                                    min_memory)

        extend_method = data.get("extend_method", service.extend_method)

        service.service_cname = service_cname
        service.min_memory = min_memory
        service.min_cpu = min_cpu
        service.extend_method = extend_method
        service.image = image
        service.cmd = cmd
        service.git_url = git_url
        service.docker_cmd = docker_cmd
        service.save()

        user_name = data.get("user_name", None)
        password = data.get("password", None)
        if user_name is not None:
            if not service_source:
                params = {
                    "team_id": tenant.tenant_id,
                    "service_id": service.service_id,
                    "user_name": user_name,
                    "password": password,
                }
                service_source_repo.create_service_source(**params)
            else:
                service_source.user_name = user_name
                service_source.password = password
                service_source.save()
        return 200, "success"
Esempio n. 23
0
 def __init__(self, service, tenant, install_from_cloud=False):
     self.service = service
     self.tenant = tenant
     self.current_version = None
     self.current_app = None
     self.template = None
     self.service_source = service_source_repo.get_service_source(service.tenant_id, service.service_id)
     self.install_from_cloud = False
     self.market_name = None
     self.market = None
     if self.service_source and self.service_source.extend_info:
         self.current_version_str = self.service_source.version
         extend_info = json.loads(self.service_source.extend_info)
         if extend_info and extend_info.get("install_from_cloud", False):
             self.install_from_cloud = True
         if self.install_from_cloud:
             self.market_name = extend_info.get("market_name", None)
             self.market = app_market_repo.get_app_market_by_name(
                 tenant.enterprise_id, self.market_name, raise_exception=True)
         self.__get_current_app_and_version()
    def upgrade_component(self, tenant, region, user, app, component: TenantServiceInfo, version):
        component_group = tenant_service_group_repo.get_component_group(component.upgrade_group_id)
        app_template_source = service_source_repo.get_service_source(component.tenant_id, component.component_id)
        app_template = self._app_template(user.enterprise_id, component_group.group_key, version, app_template_source)

        app_upgrade = AppUpgrade(
            tenant.enterprise_id,
            tenant,
            region,
            user,
            app,
            version,
            component_group,
            app_template,
            app_template_source.is_install_from_cloud(),
            app_template_source.get_market_name(),
            component_keys=[component.service_key],
            is_deploy=True,
            is_upgrade_one=True)
        app_upgrade.upgrade()
Esempio n. 25
0
 def __init__(self, service, tenant, install_from_cloud=False):
     self.service = service
     self.tenant = tenant
     self.install_from_cloud = install_from_cloud
     self.service_source = service_source_repo.get_service_source(
         service.tenant_id, service.service_id)
Esempio n. 26
0
    def get_build_info(self, tenant, service):
        service_source = service_source_repo.get_service_source(
            team_id=service.tenant_id, service_id=service.service_id)

        code_from = service.code_from
        oauth_type = support_oauth_type.keys()
        if code_from in oauth_type:
            result_url = re_split("[:,@]", service.git_url)
            service.git_url = result_url[0] + '//' + result_url[-1]
        bean = {
            "user_name": "",
            "password": "",
            "service_source": service.service_source,
            "image": service.image,
            "cmd": service.cmd,
            "code_from": service.code_from,
            "version": service.version,
            "docker_cmd": service.docker_cmd,
            "create_time": service.create_time,
            "git_url": service.git_url,
            "code_version": service.code_version,
            "server_type": service.server_type,
            "language": service.language,
            "oauth_service_id": service.oauth_service_id,
            "full_name": service.git_full_name
        }
        if service_source:
            bean["user"] = service_source.user_name
            bean["password"] = service_source.password
        if service.service_source == 'market':
            from console.services.market_app_service import market_app_service
            if service_source:
                # get from cloud
                app = None
                app_version = None
                if service_source.extend_info:
                    extend_info = json.loads(service_source.extend_info)
                    if extend_info and extend_info.get("install_from_cloud",
                                                       False):
                        app, app_version = market_app_service.get_app_from_cloud(
                            tenant, service_source.group_key,
                            service_source.version)
                        bean["install_from_cloud"] = True
                        bean["app_detail_url"] = app.describe
                if not app:
                    try:
                        app, app_version = market_app_service.get_rainbond_app_and_version(
                            tenant.enterprise_id, service_source.group_key,
                            service_source.version)
                    except RbdAppNotFound:
                        logger.warning(
                            "not found app {0} version {1} in local market".
                            format(service_source.group_key,
                                   service_source.version))
                if app and app_version:
                    bean["rain_app_name"] = app.app_name
                    bean["details"] = app.details
                    logger.debug("app_version: {}".format(app_version.version))
                    bean["app_version"] = app_version.version
                    bean["version"] = app_version.version
                    bean["group_key"] = app.app_id
        return bean
Esempio n. 27
0
    def get(self, request, *args, **kwargs):
        try:
            bean = dict()
            upgrate_version_list = []
            # 判断服务状态,未部署的服务不提供升级数据
            try:
                body = region_api.check_service_status(
                    self.service.service_region, self.tenant.tenant_name,
                    self.service.service_alias, self.tenant.enterprise_id)

                bean = body["bean"]
                status = bean["cur_status"]
            except Exception as e:
                logger.exception(e)
                status = "unKnow"
            if status == "undeploy":
                result = general_message(200,
                                         "success",
                                         "查询成功",
                                         bean=bean,
                                         list=upgrate_version_list)
                return Response(result, status=result["code"])

            if self.service.service_source != "market":
                return Response(general_message(
                    400,
                    "non-cloud installed applications require no judgment",
                    "非云市安装的应用无需判断"),
                                status=400)
            # 获取组对象
            group_obj = tenant_service_group_repo.get_group_by_service_group_id(
                self.service.tenant_service_group_id)
            if group_obj:
                # 获取内部市场对象
                rain_app = rainbond_app_repo.get_rainbond_app_by_key_and_version(
                    group_obj.group_key, group_obj.group_version)
                if not rain_app:
                    result = general_message(200, "success", "当前云市应用已删除")
                    return Response(result, status=result["code"])
                else:
                    apps_template = json.loads(rain_app.app_template)
                    apps_list = apps_template.get("apps")
                    for app in apps_list:
                        if app["service_key"] == self.service.service_key:
                            if app["deploy_version"] > self.service.deploy_version:
                                self.service.is_upgrate = True
                                self.service.save()
                    try:
                        apps_template = json.loads(rain_app.app_template)
                        apps_list = apps_template.get("apps")
                        service_source = service_source_repo.get_service_source(
                            self.service.tenant_id, self.service.service_id)
                        if service_source and service_source.extend_info:
                            extend_info = json.loads(
                                service_source.extend_info)
                            if extend_info:
                                for app in apps_list:
                                    logger.debug(
                                        '---------====app===============>{0}'.
                                        format(json.dumps(app)))
                                    logger.debug(
                                        '---------=====extend_info==============>{0}'
                                        .format(json.dumps(extend_info)))
                                    if app.has_key("service_share_uuid"):
                                        if app["service_share_uuid"] == extend_info[
                                                "source_service_share_uuid"]:
                                            new_version = int(
                                                app["deploy_version"])
                                            old_version = int(extend_info[
                                                "source_deploy_version"])
                                            if new_version > old_version:
                                                self.service.is_upgrate = True
                                                self.service.save()
                                    elif not app.has_key("service_share_uuid"
                                                         ) and app.has_key(
                                                             "service_key"):
                                        if app["service_key"] == extend_info[
                                                "source_service_share_uuid"]:
                                            new_version = int(
                                                app["deploy_version"])
                                            old_version = int(extend_info[
                                                "source_deploy_version"])
                                            if new_version > old_version:
                                                self.service.is_upgrate = True
                                                self.service.save()
                        bean["is_upgrate"] = self.service.is_upgrate
                    except Exception as e:
                        logger.exception(e)
                        result = error_message(e.message)
                        return Response(result, status=result["code"])

                # 通过group_key获取不同版本的应用市场对象
                rain_apps = rainbond_app_repo.get_rainbond_app_by_key(
                    group_obj.group_key)
                if rain_apps:
                    for r_app in rain_apps:
                        if r_app.version > group_obj.group_version and r_app.version not in upgrate_version_list:
                            upgrate_version_list.append(r_app.version)
                        elif r_app.version == group_obj.group_version and self.service.is_upgrate:
                            upgrate_version_list.append(r_app.version)

            upgrate_version_list.sort()
            result = general_message(200,
                                     "success",
                                     "查询成功",
                                     bean=bean,
                                     list=upgrate_version_list)

        except Exception as e:
            logger.exception(e)
            result = error_message(e.message)
        return Response(result, status=result["code"])
Esempio n. 28
0
    def put(self, request, *args, **kwargs):
        """
        修改构建源
        ---
        """
        s_id = transaction.savepoint()
        try:
            image = request.data.get("image", None)
            cmd = request.data.get("cmd", None)
            service_source = request.data.get("service_source")
            git_url = request.data.get("git_url", None)
            code_version = request.data.get("code_version", None)
            user_name = request.data.get("user_name", None)
            password = request.data.get("password", None)
            is_oauth = request.data.get("is_oauth", False)
            user_id = request.user.user_id
            oauth_service_id = request.data.get("service_id")
            git_full_name = request.data.get("full_name")

            if not service_source:
                return Response(general_message(400, "param error", "参数错误"),
                                status=400)

            service_source_user = service_source_repo.get_service_source(
                team_id=self.service.tenant_id,
                service_id=self.service.service_id)

            if not service_source_user:
                service_source_info = {
                    "service_id": self.service.service_id,
                    "team_id": self.service.tenant_id,
                    "user_name": user_name,
                    "password": password,
                    "create_time":
                    datetime.datetime.now().strftime('%Y%m%d%H%M%S')
                }
                service_source_repo.create_service_source(
                    **service_source_info)
            else:
                service_source_user.user_name = user_name
                service_source_user.password = password
                service_source_user.save()
            if service_source == "source_code":
                if code_version:
                    self.service.code_version = code_version
                else:
                    self.service.code_version = "master"
                if git_url:
                    if is_oauth:
                        oauth_service = oauth_repo.get_oauth_services_by_service_id(
                            service_id=oauth_service_id)
                        oauth_user = oauth_user_repo.get_user_oauth_by_user_id(
                            service_id=oauth_service_id, user_id=user_id)
                        try:
                            instance = get_oauth_instance(
                                oauth_service.oauth_type, oauth_service,
                                oauth_user)
                        except Exception as e:
                            logger.debug(e)
                            rst = {
                                "data": {
                                    "bean": None
                                },
                                "status": 400,
                                "msg_show": u"未找到OAuth服务"
                            }
                            return Response(rst, status=200)
                        if not instance.is_git_oauth():
                            rst = {
                                "data": {
                                    "bean": None
                                },
                                "status": 400,
                                "msg_show": u"该OAuth服务不是代码仓库类型"
                            }
                            return Response(rst, status=200)
                        service_code_from = "oauth_" + oauth_service.oauth_type
                        self.service.code_from = service_code_from
                        self.service.git_url = git_url
                        self.service.git_full_name = git_full_name
                        self.service.oauth_service_id = oauth_service_id
                    else:
                        self.service.git_url = git_url
                self.service.save()
                transaction.savepoint_commit(s_id)
            elif service_source == "docker_run":
                if image:
                    version = image.split(':')[-1]
                    if not version:
                        version = "latest"
                        image = image + ":" + version
                    self.service.image = image
                    self.service.version = version
                self.service.cmd = cmd
                self.service.save()
                transaction.savepoint_commit(s_id)
            result = general_message(200, "success", "修改成功")
        except Exception as e:
            logger.exception(e)
            result = error_message(e.message)
            transaction.savepoint_rollback(s_id)
        return Response(result, status=result["code"])
Esempio n. 29
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
        """
        bean = dict()
        try:
            # status_map = app_service.get_service_status(self.tenant, self.service)
            # used_resource = app_service.get_service_resource_with_plugin(self.tenant, self.service,
            #                                                              status_map["status"])
            # service_abled_plugins = app_plugin_service.get_service_abled_plugin(self.service)
            # plugin_list = [p.to_dict() for p in service_abled_plugins]
            # bean.update(status_map)
            # bean.update(used_resource)
            # bean.update({"plugin_list": plugin_list})
            service_model = self.service.to_dict()
            group_map = group_service.get_services_group_name(
                [self.service.service_id])
            group_name = group_map.get(self.service.service_id)["group_name"]
            group_id = group_map.get(self.service.service_id)["group_id"]
            service_model["group_name"] = group_name
            service_model["group_id"] = group_id
            bean.update({"service": service_model})
            tenant_actions = self.user.actions.tenant_actions
            bean.update({"tenant_actions": tenant_actions})
            service_actions = self.user.actions.service_actions
            bean.update({"service_actions": service_actions})
            event_websocket_url = ws_service.get_event_log_ws(
                self.request, self.service.service_region)
            bean.update({"event_websocket_url": event_websocket_url})
            if self.service.service_source == "market":
                service_source = service_source_repo.get_service_source(
                    self.tenant.tenant_id, self.service.service_id)
                if not service_source:
                    result = general_message(200, "success", "查询成功", bean=bean)
                    return Response(result, status=result["code"])
                rain_app = rainbond_app_repo.get_rainbond_app_by_key_and_version(
                    service_source.group_key, service_source.version)
                if not rain_app:
                    result = general_message(200,
                                             "success",
                                             "当前云市组件已删除",
                                             bean=bean)
                    return Response(result, status=result["code"])
                else:
                    bean.update({"rain_app_name": rain_app.group_name})
                    apps_template = json.loads(rain_app.app_template)
                    apps_list = apps_template.get("apps")
                    for app in apps_list:
                        if app["service_key"] == self.service.service_key:
                            if self.service.deploy_version and int(
                                    app["deploy_version"]) > int(
                                        self.service.deploy_version):
                                self.service.is_upgrate = True
                                self.service.save()
                                bean.update({"service": service_model})
                    try:
                        apps_template = json.loads(rain_app.app_template)
                        apps_list = apps_template.get("apps")
                        service_source = service_source_repo.get_service_source(
                            self.service.tenant_id, self.service.service_id)
                        if service_source and service_source.extend_info:
                            extend_info = json.loads(
                                service_source.extend_info)
                            if extend_info:
                                for app in apps_list:
                                    if "service_share_uuid" in app:
                                        if app["service_share_uuid"] == extend_info[
                                                "source_service_share_uuid"]:
                                            new_version = int(
                                                app["deploy_version"])
                                            old_version = int(extend_info[
                                                "source_deploy_version"])
                                            if new_version > old_version:
                                                self.service.is_upgrate = True
                                                self.service.save()
                                                service_model[
                                                    "is_upgrade"] = True
                                                bean.update(
                                                    {"service": service_model})
                                    elif "service_share_uuid" not in app and "service_key" in app:
                                        if app["service_key"] == extend_info[
                                                "source_service_share_uuid"]:
                                            new_version = int(
                                                app["deploy_version"])
                                            old_version = int(extend_info[
                                                "source_deploy_version"])
                                            if new_version > old_version:
                                                self.service.is_upgrate = True
                                                self.service.save()
                                                service_model[
                                                    "is_upgrade"] = True
                                                bean.update(
                                                    {"service": service_model})

                    except Exception as e:
                        logger.exception(e)

            if self.service.service_source == AppConstants.DOCKER_COMPOSE:
                if self.service.create_status != "complete":
                    compose_service_relation = compose_service.get_service_compose_id(
                        self.service)
                    if compose_service_relation:
                        service_model[
                            "compose_id"] = compose_service_relation.compose_id
                        bean.update({"service": service_model})
            bean["is_third"] = False
            if self.service.service_source == "third_party":
                bean["is_third"] = True
                service_endpoints = service_endpoints_repo.get_service_endpoints_by_service_id(
                    self.service.service_id)
                if service_endpoints:
                    bean["register_way"] = service_endpoints.endpoints_type
                    if service_endpoints.endpoints_type == "api":
                        # 从环境变量中获取域名,没有在从请求中获取
                        host = os.environ.get('DEFAULT_DOMAIN',
                                              request.get_host())
                        bean["api_url"] = "http://" + host + "/console/" + \
                            "third_party/{0}".format(self.service.service_id)
                        key_repo = deploy_repo.get_service_key_by_service_id(
                            service_id=self.service.service_id)
                        if key_repo:
                            bean["api_service_key"] = pickle.loads(
                                base64.b64decode(
                                    key_repo.secret_key)).get("secret_key")
                    if service_endpoints.endpoints_type == "discovery":
                        # 返回类型和key
                        endpoints_info_dict = json.loads(
                            service_endpoints.endpoints_info)

                        bean["discovery_type"] = endpoints_info_dict["type"]
                        bean["discovery_key"] = endpoints_info_dict["key"]

            result = general_message(200, "success", "查询成功", bean=bean)
        except Exception as e:
            logger.exception(e)
            result = error_message(e.message)
        return Response(result, status=result["code"])
Esempio n. 30
0
    def check_service(self, tenant, service, is_again, user=None):
        body = dict()
        body["tenant_id"] = tenant.tenant_id
        body["source_type"] = self.__get_service_region_type(
            service.service_source)
        source_body = ""
        service_source = service_source_repo.get_service_source(
            tenant.tenant_id, service.service_id)
        user_name = ""
        password = ""
        service.service_source = self.__get_service_source(service)
        if service_source:
            user_name = service_source.user_name
            password = service_source.password
        if service.service_source == AppConstants.SOURCE_CODE:
            if service.oauth_service_id:
                try:
                    oauth_service = oauth_repo.get_oauth_services_by_service_id(
                        service.oauth_service_id)
                    oauth_user = oauth_user_repo.get_user_oauth_by_user_id(
                        service_id=service.oauth_service_id,
                        user_id=user.user_id)
                except Exception as e:
                    logger.debug(e)
                    return 400, "未找到oauth服务, 请检查该服务是否存在且属于开启状态", None
                if oauth_user is None:
                    return 400, "未成功获取第三方用户信息", None

                try:
                    instance = get_oauth_instance(oauth_service.oauth_type,
                                                  oauth_service, oauth_user)
                except Exception as e:
                    logger.debug(e)
                    return 400, "未找到OAuth服务", None
                if not instance.is_git_oauth():
                    return 400, "该OAuth服务不是代码仓库类型", None
                tenant = Tenants.objects.get(tenant_name=tenant.tenant_name)
                try:
                    service_code_clone_url = instance.get_clone_url(
                        service.git_url)
                except Exception as e:
                    logger.debug(e)
                    return 400, "Access Token 已过期", None
            else:
                service_code_clone_url = service.git_url

            sb = {
                "server_type": service.server_type,
                "repository_url": service_code_clone_url,
                "branch": service.code_version,
                "user": user_name,
                "password": password,
                "tenant_id": tenant.tenant_id
            }
            source_body = json.dumps(sb)
        elif service.service_source == AppConstants.DOCKER_RUN or service.service_source == AppConstants.DOCKER_IMAGE:
            source_body = service.docker_cmd
        elif service.service_source == AppConstants.THIRD_PARTY:
            # endpoints信息
            service_endpoints = service_endpoints_repo.get_service_endpoints_by_service_id(
                service.service_id).first()
            if service_endpoints and service_endpoints.endpoints_type == "discovery":
                source_body = service_endpoints.endpoints_info

        body["username"] = user_name
        body["password"] = password
        body["source_body"] = source_body
        res, body = region_api.service_source_check(service.service_region,
                                                    tenant.tenant_name, body)
        bean = body["bean"]
        service.check_uuid = bean["check_uuid"]
        service.check_event_id = bean["event_id"]
        # 更新创建状态
        if not is_again:
            service.create_status = "checking"
        service.save()
        bean = dict()
        bean.update(service.to_dict())
        bean.update({"user_name": user_name, "password": password})
        bean.update(self.__wrap_check_service(service))
        return 200, "success", bean