コード例 #1
0
    def add_service_dependency(self,
                               tenant,
                               service,
                               dep_service_id,
                               open_inner=None,
                               container_port=None,
                               user_name=''):
        dep_service_relation = dep_relation_repo.get_depency_by_serivce_id_and_dep_service_id(
            tenant.tenant_id, service.service_id, dep_service_id)
        if dep_service_relation:
            return 212, "当前组件已被关联", None

        dep_service = service_repo.get_service_by_tenant_and_id(
            tenant.tenant_id, dep_service_id)
        # 开启对内端口
        if open_inner:
            self.__open_port(tenant, dep_service, container_port, user_name)
        else:
            # 校验要依赖的组件是否开启了对内端口
            open_inner_services = port_repo.get_service_ports(
                tenant.tenant_id,
                dep_service.service_id).filter(is_inner_service=True)
            if not open_inner_services:
                service_ports = port_repo.get_service_ports(
                    tenant.tenant_id, dep_service.service_id)
                port_list = [
                    service_port.container_port
                    for service_port in service_ports
                ]
                return 201, "要关联的组件暂未开启对内端口,是否打开", port_list

        is_duplicate = self.__is_env_duplicate(tenant, service, dep_service)
        if is_duplicate:
            return 412, "要关联的组件的变量与已关联的组件变量重复,请修改后再试", None
        if service.create_status == "complete":
            task = dict()
            task["dep_service_id"] = dep_service_id
            task["tenant_id"] = tenant.tenant_id
            task["dep_service_type"] = dep_service.service_type
            task["enterprise_id"] = tenant.enterprise_id
            task["operator"] = user_name
            region_api.add_service_dependency(service.service_region,
                                              tenant.tenant_name,
                                              service.service_alias, task)
        tenant_service_relation = {
            "tenant_id": tenant.tenant_id,
            "service_id": service.service_id,
            "dep_service_id": dep_service_id,
            "dep_service_type": dep_service.service_type,
            "dep_order": 0,
        }
        dep_relation = dep_relation_repo.add_service_dependency(
            **tenant_service_relation)
        # component dependency change, will change export network governance plugin configuration
        if service.create_status == "complete":
            from console.services.plugin import app_plugin_service
            app_plugin_service.update_config_if_have_export_plugin(
                tenant, service)
        return 200, "success", dep_relation
コード例 #2
0
    def add_service_dependency(self,
                               tenant,
                               service,
                               dep_service_id,
                               open_inner=None,
                               container_port=None):
        dep_service_relation = dep_relation_repo.get_depency_by_serivce_id_and_dep_service_id(
            tenant.tenant_id, service.service_id, dep_service_id)
        if dep_service_relation:
            return 212, u"当前应用已被关联", None

        dep_service = service_repo.get_service_by_tenant_and_id(
            tenant.tenant_id, dep_service_id)
        # 开启对内端口
        if open_inner:
            tenant_service_port = port_service.get_service_port_by_port(
                dep_service, int(container_port))
            code, msg, data = port_service.manage_port(
                tenant, dep_service, dep_service.service_region,
                int(tenant_service_port.container_port), "open_inner",
                tenant_service_port.protocol, tenant_service_port.port_alias)
            if code != 200:
                return 412, u"开启对内端口失败", None
        # 校验要依赖的服务是否开启了对内端口
        open_inner_services = port_repo.get_service_ports(
            tenant.tenant_id,
            dep_service.service_id).filter(is_inner_service=True)
        if not open_inner_services:
            service_ports = port_repo.get_service_ports(
                tenant.tenant_id, dep_service.service_id)
            port_list = [
                service_port.container_port for service_port in service_ports
            ]
            return 201, u"要关联的服务暂未开启对内端口,是否打开", port_list

        is_duplicate = self.__is_env_duplicate(tenant, service, dep_service)
        if is_duplicate:
            return 412, u"要关联的应用的变量与已关联的应用变量重复,请修改后再试", None
        if service.create_status == "complete":
            task = dict()
            task["dep_service_id"] = dep_service_id
            task["tenant_id"] = tenant.tenant_id
            task["dep_service_type"] = dep_service.service_type
            task["enterprise_id"] = tenant.enterprise_id

            region_api.add_service_dependency(service.service_region,
                                              tenant.tenant_name,
                                              service.service_alias, task)
        tenant_service_relation = {
            "tenant_id": tenant.tenant_id,
            "service_id": service.service_id,
            "dep_service_id": dep_service_id,
            "dep_service_type": dep_service.service_type,
            "dep_order": 0,
        }
        dep_relation = dep_relation_repo.add_service_dependency(
            **tenant_service_relation)
        return 200, u"success", dep_relation
コード例 #3
0
 def port_changes(self, new_ports):
     """port can only be created, cannot be updated and deleted"""
     old_ports = port_repo.get_service_ports(self.service.tenant_id,
                                             self.service.service_id)
     old_container_ports = {port.container_port: port for port in old_ports}
     create_ports = [
         port for port in new_ports
         if port["container_port"] not in old_container_ports
     ]
     update_ports = []
     for new_port in new_ports:
         if new_port["container_port"] not in old_container_ports:
             continue
         old_port = old_container_ports[new_port["container_port"]]
         if new_port["is_outer_service"] and not old_port.is_outer_service:
             update_ports.append(new_port)
             continue
         if new_port["is_inner_service"] and not old_port.is_inner_service:
             update_ports.append(new_port)
             continue
     if not create_ports and not update_ports:
         return None
     result = {}
     if create_ports:
         result["add"] = create_ports
     if update_ports:
         result["upd"] = update_ports
     logger.debug("ports: {}".format(json.dumps(result)))
     return result
コード例 #4
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
コード例 #5
0
 def get_access_info(self, tenant, service):
     access_type = ""
     data = {}
     service_ports = port_repo.get_service_ports(tenant.tenant_id, service.service_id)
     # ①是否有端口
     if not service_ports:
         access_type = ServicePortConstants.NO_PORT
         return access_type, data
     # 对内和对外都没打开的端口
     unopened_port = []
     # http 对外打开的端口
     http_outer_port = []
     # http 对内打开的端口
     http_inner_port = []
     # stream 对外打开的端口
     stream_outer_port = []
     # stream 对内打开的端口
     stream_inner_port = []
     for port in service_ports:
         if port.protocol == ServicePortConstants.HTTP:
             if port.is_outer_service:
                 http_outer_port.append(port)
             if port.is_inner_service:
                 http_inner_port.append(port)
         else:
             if port.is_outer_service:
                 stream_outer_port.append(port)
             if port.is_inner_service:
                 stream_inner_port.append(port)
         if not port.is_outer_service and (not port.is_inner_service):
             unopened_port.append(port)
     access_type, data = self.__handle_port_info(tenant, service, unopened_port, http_outer_port, http_inner_port,
                                                 stream_outer_port, stream_inner_port)
     return access_type, data
コード例 #6
0
ファイル: app.py プロジェクト: tsunli/rainbond-console
    def create_third_party_service(self, tenant, service, user_name):
        data = self.__init_third_party_data(tenant, service, user_name)
        # 端口
        ports = port_repo.get_service_ports(tenant.tenant_id, service.service_id)
        ports_info = ports.values(
            'container_port', 'mapping_port', 'protocol', 'port_alias', 'is_inner_service', 'is_outer_service')

        for port_info in ports_info:
            port_info["is_inner_service"] = False
            port_info["is_outer_service"] = False

        if ports_info:
            data["ports_info"] = list(ports_info)

        # endpoints
        endpoints = service_endpoints_repo.get_service_endpoints_by_service_id(service.service_id)
        endpoints_dict = dict()
        if endpoints:
            if endpoints.endpoints_type != "api":
                endpoints_dict[endpoints.endpoints_type] = endpoints.endpoints_info
                data["endpoints"] = endpoints_dict
        data["kind"] = service.service_source

        # 数据中心创建
        logger.debug('-----------data-----------_>{0}'.format(data))
        region_api.create_service(service.service_region, tenant.tenant_name, data)
        # 将服务创建状态变更为创建完成
        service.create_status = "complete"
        self.__handle_service_ports(tenant, service, ports)
        service.save()
        return service
コード例 #7
0
def test_restore_ports():
    from console.services.app_actions.app_restore import AppRestore
    tn = Tenants()
    tn.tenant_id = "c1a29fe4d7b0413993dc859430cf743d"
    svc = TenantServiceInfo()
    svc.service_id = "5a9209f3a3e94695b23fbd8b16a07d2b"
    backup_data = {
        "service_ports": [{
            "lb_mapping_port": 0,
            "protocol": "http",
            "mapping_port": 80,
            "tenant_id": "c1a29fe4d7b0413993dc859430cf743d",
            "port_alias": "GR063B3980",
            "container_port": 80,
            "is_outer_service": False,
            "is_inner_service": False,
            "service_id": "5a9209f3a3e94695b23fbd8b16a07d2b",
            "ID": 513
        }],
    }
    service_ports = backup_data["service_ports"]
    raw_ports = [port["port_alias"] for port in service_ports]
    app_restore = AppRestore(tn, svc)
    app_restore.ports(service_ports)
    ports = port_repo.get_service_ports(tn.tenant_id, svc.service_id)

    for port in ports:
        assert port.port_alias in raw_ports
コード例 #8
0
ファイル: port_service.py プロジェクト: icanfly/rainbond-ui
 def is_open_outer_steam_port(self, tenant_id, service_id, current_port):
     """判断是否有对外打开的非http协议端口"""
     ports = port_repo.get_service_ports(tenant_id, service_id).filter(is_outer_service=True).exclude(
         protocol="http").exclude(container_port=current_port)
     if ports:
         return True
     return False
コード例 #9
0
 def get_team_region_usable_tcp_ports(self, tenant, service):
     services = service_repo.get_service_by_region_and_tenant(service.service_region, tenant.tenant_id)
     current_service_tcp_ports = port_repo.get_service_ports(
         tenant.tenant_id, service.service_id).filter(is_outer_service=True).exclude(protocol__in=("http", "https"))
     lb_mapping_ports = [p.lb_mapping_port for p in current_service_tcp_ports]
     service_ids = [s.service_id for s in services]
     res = port_repo.get_tcp_outer_opend_ports(service_ids).exclude(lb_mapping_port__in=lb_mapping_ports)
     return res
コード例 #10
0
    def create_region_service(self, tenant, service, user_name, do_deploy=True, dep_sids=None):
        data = self.__init_create_data(tenant, service, user_name, do_deploy, dep_sids)
        service_dep_relations = dep_relation_repo.get_service_dependencies(tenant.tenant_id, service.service_id)
        # 依赖
        depend_ids = [{
            "dep_order": dep.dep_order,
            "dep_service_type": dep.dep_service_type,
            "depend_service_id": dep.dep_service_id,
            "service_id": dep.service_id,
            "tenant_id": dep.tenant_id
        } for dep in service_dep_relations]
        data["depend_ids"] = depend_ids
        # 端口
        ports = port_repo.get_service_ports(tenant.tenant_id, service.service_id)
        ports_info = ports.values('container_port', 'mapping_port', 'protocol', 'port_alias', 'is_inner_service',
                                  'is_outer_service')

        for port_info in ports_info:
            port_info["is_inner_service"] = False
            port_info["is_outer_service"] = False

        if ports_info:
            data["ports_info"] = list(ports_info)
        # 环境变量
        envs_info = env_var_repo.get_service_env(tenant.tenant_id, service.service_id).values(
            'container_port', 'name', 'attr_name', 'attr_value', 'is_change', 'scope')
        if envs_info:
            data["envs_info"] = list(envs_info)
        # 持久化目录
        volume_info = volume_repo.get_service_volumes(service.service_id).values(
            'ID', 'service_id', 'category', 'volume_name', 'volume_path', 'volume_type')
        if volume_info:
            logger.debug('--------volume_info----->{0}'.format(volume_info))
            for volume in volume_info:
                volume_id = volume['ID']
                config_file = volume_repo.get_service_config_file(volume_id)
                if config_file:
                    volume.update({"file_content": config_file.file_content})
            logger.debug('--------volume_info22222----->{0}'.format(volume_info))
            data["volumes_info"] = list(volume_info)

        logger.debug(tenant.tenant_name + " start create_service:" + datetime.datetime.now().strftime('%Y%m%d%H%M%S'))
        # 挂载信息
        mnt_info = mnt_repo.get_service_mnts(service.tenant_id, service.service_id)
        if mnt_info:
            data["dep_volumes_info"] = [{
                "dep_service_id": mnt.dep_service_id,
                "volume_path": mnt.mnt_dir,
                "volume_name": mnt.mnt_name
            } for mnt in mnt_info]

        # 数据中心创建
        region_api.create_service(service.service_region, tenant.tenant_name, data)
        # 将服务创建状态变更为创建完成
        service.create_status = "complete"
        self.__handle_service_ports(tenant, service, ports)
        service.save()
        return service
コード例 #11
0
 def is_open_outer_steam_port(self, tenant_id, service_id, current_port):
     """判断是否有对外打开的非http协议端口"""
     ports = port_repo.get_service_ports(
         tenant_id, service_id).filter(is_outer_service=True).exclude(
             protocol="http").exclude(container_port=current_port)
     # 如果为公有云且已经开放端口
     if ports and settings.MODULES.get('SSO_LOGIN'):
         return True
     return False
コード例 #12
0
 def port_changes(self, new_ports):
     """port can only be created, cannot be updated and deleted"""
     old_ports = port_repo.get_service_ports(self.service.tenant_id,
                                             self.service.service_id)
     old_container_ports = [port.container_port for port in old_ports]
     create_ports = [port for port in new_ports
                     if port["container_port"] not in old_container_ports]
     if not create_ports:
         return None
     return {
         "add": create_ports
     }
コード例 #13
0
    def create_third_party_service(self, tenant, service, user_name):
        data = self.__init_third_party_data(tenant, service, user_name)
        # env var
        envs_info = env_var_repo.get_service_env(tenant.tenant_id,
                                                 service.service_id).values(
                                                     'container_port', 'name',
                                                     'attr_name', 'attr_value',
                                                     'is_change', 'scope')
        if envs_info:
            data["envs_info"] = list(envs_info)
        # 端口
        ports = port_repo.get_service_ports(tenant.tenant_id,
                                            service.service_id)
        ports_info = ports.values('container_port', 'mapping_port', 'protocol',
                                  'port_alias', 'is_inner_service',
                                  'is_outer_service', 'k8s_service_name')

        for port_info in ports_info:
            port_info["is_inner_service"] = False
            port_info["is_outer_service"] = False

        if ports_info:
            data["ports_info"] = list(ports_info)

        # endpoints
        endpoints = service_endpoints_repo.get_service_endpoints_by_service_id(
            service.service_id).first()
        if endpoints:
            if endpoints.endpoints_type == "static":
                eps = json.loads(endpoints.endpoints_info)
                validate_endpoints_info(eps)
            endpoints_dict = dict()
            endpoints_dict[endpoints.endpoints_type] = endpoints.endpoints_info
            data["endpoints"] = endpoints_dict
        data["kind"] = service.service_source

        # etcd keys
        data["etcd_key"] = service.check_uuid
        # 数据中心创建
        logger.debug('-----------data-----------_>{0}'.format(data))
        app_id = service_group_relation_repo.get_group_id_by_service(service)
        region_app_id = region_app_repo.get_region_app_id(
            service.service_region, app_id)
        data["app_id"] = region_app_id
        region_api.create_service(service.service_region, tenant.tenant_name,
                                  data)
        # 将组件创建状态变更为创建完成
        service.create_status = "complete"
        self.__handle_service_ports(tenant, service, ports)
        service.save()
        return service
コード例 #14
0
    def get_undependencies(self, tenant, service):

        # 打开对内端口才能被依赖
        services = service_repo.get_tenant_region_services(service.service_region,
                                                           tenant.tenant_id).exclude(service_id=service.service_id)
        not_dependencies = []
        dep_services = dep_relation_repo.get_service_dependencies(tenant.tenant_id, service.service_id)
        dep_service_ids = [dep.dep_service_id for dep in dep_services]
        for s in services:
            # 查找打开内部访问的组件
            open_inner_services = port_repo.get_service_ports(tenant.tenant_id, s.service_id).filter(is_inner_service=True)
            if open_inner_services:
                if s.service_id not in dep_service_ids:
                    not_dependencies.append(s)
        return not_dependencies
コード例 #15
0
    def create_third_party_service(self, tenant, service, user_name):
        data = self.__init_third_party_data(tenant, service, user_name)
        # 端口
        ports = port_repo.get_service_ports(tenant.tenant_id,
                                            service.service_id)
        ports_info = ports.values('container_port', 'mapping_port', 'protocol',
                                  'port_alias', 'is_inner_service',
                                  'is_outer_service')

        for port_info in ports_info:
            port_info["is_inner_service"] = False
            port_info["is_outer_service"] = False

        if ports_info:
            data["ports_info"] = list(ports_info)

        # endpoints
        endpoints = service_endpoints_repo.get_service_endpoints_by_service_id(
            service.service_id)
        if endpoints.endpoints_type == "static":
            eps = json.loads(endpoints.endpoints_info)
            for address in eps:
                if "https://" in address:
                    address = address.partition("https://")[2]
                if "http://" in address:
                    address = address.partition("http://")[2]
                if ":" in address:
                    address = address.rpartition(":")[0]
                errs = validate_endpoint_address(address)
                if errs:
                    if len(eps) > 1:
                        raise ErrDoNotSupportMultiDomain(
                            "do not support multi domain address")
        endpoints_dict = dict()
        if endpoints:
            endpoints_dict[endpoints.endpoints_type] = endpoints.endpoints_info
            data["endpoints"] = endpoints_dict
        data["kind"] = service.service_source

        # 数据中心创建
        logger.debug('-----------data-----------_>{0}'.format(data))
        region_api.create_service(service.service_region, tenant.tenant_name,
                                  data)
        # 将组件创建状态变更为创建完成
        service.create_status = "complete"
        self.__handle_service_ports(tenant, service, ports)
        service.save()
        return service
コード例 #16
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
コード例 #17
0
    def create_region_service(self,
                              tenant,
                              service,
                              user_name,
                              do_deploy=True,
                              dep_sids=None):
        data = self.__init_create_data(tenant, service, user_name, do_deploy,
                                       dep_sids)
        service_dep_relations = dep_relation_repo.get_service_dependencies(
            tenant.tenant_id, service.service_id)
        # 依赖
        depend_ids = [{
            "dep_order": dep.dep_order,
            "dep_service_type": dep.dep_service_type,
            "depend_service_id": dep.dep_service_id,
            "service_id": dep.service_id,
            "tenant_id": dep.tenant_id
        } for dep in service_dep_relations]
        data["depend_ids"] = depend_ids
        # 端口
        ports = port_repo.get_service_ports(tenant.tenant_id,
                                            service.service_id)
        ports_info = ports.values('container_port', 'mapping_port', 'protocol',
                                  'port_alias', 'is_inner_service',
                                  'is_outer_service', 'k8s_service_name')

        for port_info in ports_info:
            port_info["is_inner_service"] = False
            port_info["is_outer_service"] = False

        if ports_info:
            data["ports_info"] = list(ports_info)
        # 环境变量
        envs_info = env_var_repo.get_service_env(tenant.tenant_id,
                                                 service.service_id).values(
                                                     'container_port', 'name',
                                                     'attr_name', 'attr_value',
                                                     'is_change', 'scope')
        if envs_info:
            data["envs_info"] = list(envs_info)
        # 持久化目录
        volume_info = volume_repo.get_service_volumes_with_config_file(
            service.service_id)
        if volume_info:
            volume_list = []
            for volume in volume_info:
                volume_info = model_to_dict(volume)
                if volume.volume_type == "config-file":
                    config_file = volume_repo.get_service_config_file(
                        volume.ID)
                    if config_file:
                        volume_info.update(
                            {"file_content": config_file.file_content})
                volume_list.append(volume_info)
            data["volumes_info"] = volume_list

        logger.debug(tenant.tenant_name + " start create_service:" +
                     datetime.datetime.now().strftime('%Y%m%d%H%M%S'))
        # 挂载信息
        mnt_info = mnt_repo.get_service_mnts(service.tenant_id,
                                             service.service_id)
        if mnt_info:
            data["dep_volumes_info"] = [{
                "dep_service_id": mnt.dep_service_id,
                "volume_path": mnt.mnt_dir,
                "volume_name": mnt.mnt_name
            } for mnt in mnt_info]

        # etcd keys
        data["etcd_key"] = service.check_uuid

        # runtime os name
        data["os_type"] = label_service.get_service_os_name(service)
        # 数据中心创建
        app_id = service_group_relation_repo.get_group_id_by_service(service)
        region_app_id = region_app_repo.get_region_app_id(
            service.service_region, app_id)
        data["app_id"] = region_app_id
        region_api.create_service(service.service_region, tenant.tenant_name,
                                  data)
        # 将组件创建状态变更为创建完成
        service.create_status = "complete"
        self.__handle_service_ports(tenant, service, ports)
        service.save()
        return service
コード例 #18
0
    def put(self, request, *args, **kwargs):
        """
        应用拓扑图打开(关闭)对外端口
        :param request:
        :param args:
        :param kwargs:
        :return:
        """
        try:
            open_outer = request.data.get("open_outer", False)
            close_outer = request.data.get("close_outer", False)
            container_port = request.data.get("container_port", None)
            # 开启对外端口
            if open_outer:
                tenant_service_port = port_service.get_service_port_by_port(
                    self.service, int(container_port))
                code, msg, data = port_service.manage_port(
                    self.tenant, self.service, self.response_region,
                    int(container_port), "open_outer",
                    tenant_service_port.protocol,
                    tenant_service_port.port_alias)
                if code != 200:
                    return Response(general_message(412, "open outer fail",
                                                    u"打开对外端口失败"),
                                    status=412)
                return Response(general_message(200, "open outer success",
                                                u"开启成功"),
                                status=200)
            # 关闭改服务所有对外端口
            if close_outer:
                tenant_service_ports = port_service.get_service_ports(
                    self.service)
                for tenant_service_port in tenant_service_ports:
                    code, msg, data = port_service.manage_port(
                        self.tenant, self.service, self.response_region,
                        tenant_service_port.container_port, "close_outer",
                        tenant_service_port.protocol,
                        tenant_service_port.port_alias)
                    if code != 200:
                        return Response(general_message(
                            412, "open outer fail", u"关闭对外端口失败"),
                                        status=412)
                return Response(general_message(200, "close outer success",
                                                u"关闭对外端口成功"),
                                status=200)

            # 校验要依赖的服务是否开启了对外端口
            open_outer_services = port_repo.get_service_ports(
                self.tenant.tenant_id,
                self.service.service_id).filter(is_outer_service=True)
            if not open_outer_services:
                service_ports = port_repo.get_service_ports(
                    self.tenant.tenant_id, self.service.service_id)
                port_list = [
                    service_port.container_port
                    for service_port in service_ports
                ]
                return Response(general_message(
                    201,
                    "the service does not open an external port",
                    u"该服务未开启对外端口",
                    list=port_list),
                                status=201)
            else:
                return Response(general_message(
                    202, "the service has an external port open",
                    u"该服务已开启对外端口"),
                                status=200)
        except Exception as e:
            logger.exception(e)
            result = error_message(e.message)
            return Response(result, status=result["code"])
コード例 #19
0
    def create_third_party_app(self, region, tenant, user, service_cname, endpoints, endpoints_type):
        service_cname = service_cname.rstrip().lstrip()
        is_pass, msg = self.check_service_cname(tenant, service_cname, region)
        if not is_pass:
            return 412, msg, None
        # 初始化
        new_service = self.__init_third_party_app(region, endpoints)
        new_service.tenant_id = tenant.tenant_id
        new_service.service_cname = service_cname
        service_id = make_uuid(tenant.tenant_id)
        service_alias = "gr" + service_id[-6:]
        new_service.service_id = service_id
        new_service.service_alias = service_alias
        new_service.creater = user.pk
        new_service.server_type = ''
        new_service.protocol = 'tcp'
        new_service.save()
        if endpoints_type == "static":
            # 如果只有一个端口,就设定为默认端口,没有或有多个端口,不设置默认端口
            if endpoints:
                port_list = []
                for endpoint in endpoints:
                    if ':' in endpoint:
                        port_list.append(endpoint.split(':')[1])
                port_re = list(set(port_list))
                if len(port_re) == 1:
                    port = int(port_re[0])
                    if port:
                        port_alias = new_service.service_alias.upper().replace("-", "_") + str(port)
                        service_port = {"tenant_id": tenant.tenant_id, "service_id": new_service.service_id,
                                        "container_port": port, "mapping_port": port,
                                        "protocol": 'tcp', "port_alias": port_alias,
                                        "is_inner_service": False,
                                        "is_outer_service": False}
                        service_port = port_repo.add_service_port(**service_port)
                        # 添加默认端口后需要默认设置健康检测
                        if service_port:
                            tenant_service_ports = port_repo.get_service_ports(tenant.tenant_id, new_service.service_id)
                            port_list = []
                            for tenant_service_port in tenant_service_ports:
                                port_list.append(tenant_service_port.container_port)
                            if len(port_list) <= 1:
                                probe = probe_repo.get_probe(new_service.service_id)
                                if not probe:
                                    params = {
                                        "http_header": "",
                                        "initial_delay_second": 2,
                                        "is_used": True,
                                        "mode": "ignore",
                                        "path": "",
                                        "period_second": 3,
                                        "port": int(service_port.container_port),
                                        "scheme": "tcp",
                                        "success_threshold": 1,
                                        "timeout_second": 20
                                    }
                                    code, msg, probe = probe_service.add_service_probe(tenant, new_service, params)
                                    if code != 200:
                                        logger.debug('------111----->{0}'.format(msg))

        # 保存endpoints数据
        service_endpoints = {"tenant_id": tenant.tenant_id, "service_id": new_service.service_id,
                             "service_cname": new_service.service_cname, "endpoints_info": json.dumps(endpoints),
                             "endpoints_type": endpoints_type}
        logger.debug('------service_endpoints------------->{0}'.format(service_endpoints))
        service_endpoints_repo.add_service_endpoints(service_endpoints)

        ts = TenantServiceInfo.objects.get(service_id=new_service.service_id, tenant_id=new_service.tenant_id)
        return 200, u"创建成功", ts
コード例 #20
0
ファイル: app_port.py プロジェクト: yangkaa/rainbond-console
    def put(self, request, *args, **kwargs):
        """
        组件拓扑图打开(关闭)对外端口
        :param request:
        :param args:
        :param kwargs:
        :return:
        """
        open_outer = request.data.get("open_outer", False)
        close_outer = request.data.get("close_outer", False)
        container_port = request.data.get("container_port", None)
        # 开启对外端口
        if open_outer:
            tenant_service_port = port_service.get_service_port_by_port(
                self.service, int(container_port))
            if self.service.service_source == "third_party":
                msg, msg_show, code = port_service.check_domain_thirdpart(
                    self.tenant, self.service)
                if code != 200:
                    logger.exception(msg, msg_show)
                    return Response(general_message(code, msg, msg_show),
                                    status=code)
            code, msg, data = port_service.manage_port(
                self.tenant, self.service, self.response_region,
                int(container_port), "open_outer",
                tenant_service_port.protocol, tenant_service_port.port_alias)
            if code != 200:
                return Response(general_message(412, "open outer fail",
                                                "打开对外端口失败"),
                                status=412)
            return Response(general_message(200, "open outer success", "开启成功"),
                            status=200)
        # 关闭该组件所有对外端口
        if close_outer:
            tenant_service_ports = port_service.get_service_ports(self.service)
            for tenant_service_port in tenant_service_ports:
                code, msg, data = port_service.manage_port(
                    self.tenant, self.service, self.response_region,
                    tenant_service_port.container_port, "close_outer",
                    tenant_service_port.protocol,
                    tenant_service_port.port_alias)
                if code != 200:
                    return Response(general_message(412, "open outer fail",
                                                    "关闭对外端口失败"),
                                    status=412)
            return Response(general_message(200, "close outer success",
                                            "关闭对外端口成功"),
                            status=200)

        # 校验要依赖的组件是否开启了对外端口
        open_outer_services = port_repo.get_service_ports(
            self.tenant.tenant_id,
            self.service.service_id).filter(is_outer_service=True)
        if not open_outer_services:
            if self.service.service_source == "third_party":
                msg, msg_show, code = port_service.check_domain_thirdpart(
                    self.tenant, self.service)
                if code != 200:
                    logger.exception(msg, msg_show)
                    return Response(general_message(code, msg, msg_show),
                                    status=code)
            service_ports = port_repo.get_service_ports(
                self.tenant.tenant_id, self.service.service_id)
            port_list = [
                service_port.container_port for service_port in service_ports
            ]
            if len(port_list) == 1:
                # 一个端口直接开启
                tenant_service_port = port_service.get_service_port_by_port(
                    self.service, int(port_list[0]))
                code, msg, data = port_service.manage_port(
                    self.tenant, self.service, self.response_region,
                    int(port_list[0]), "open_outer",
                    tenant_service_port.protocol,
                    tenant_service_port.port_alias)
                if code != 200:
                    return Response(general_message(412, "open outer fail",
                                                    "打开对外端口失败"),
                                    status=412)
                return Response(general_message(200, "open outer success",
                                                "开启成功"),
                                status=200)
            else:
                # 多个端口需要用户选择后开启
                return Response(general_message(
                    201,
                    "the service does not open an external port",
                    "该组件未开启对外端口",
                    list=port_list),
                                status=201)
        else:
            return Response(general_message(
                202, "the service has an external port open", "该组件已开启对外端口"),
                            status=200)
コード例 #21
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)
        http_rule_configs = configuration_repo.list_by_rule_ids(
            [sd.http_rule_id for sd in service_domains])
        service_tcpdomains = tcp_domain.get_service_tcpdomains(
            service.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)
        service_mnts = mnt_repo.get_service_mnts(tenant.tenant_id,
                                                 service.service_id)
        service_volumes = volume_repo.get_service_volumes_with_config_file(
            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)
        service_relation = dep_relation_repo.get_service_dependencies(
            tenant.tenant_id, service.service_id)
        service_monitors = service_monitor_repo.get_component_service_monitors(
            tenant.tenant_id, service.service_id)
        component_graphs = component_graph_repo.list(service.service_id)
        # plugin
        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)
        # third_party_service
        third_party_service_endpoints = service_endpoints_repo.get_service_endpoints_by_service_id(
            service.service_id)
        if service.service_source == "third_party":
            if not third_party_service_endpoints:
                raise ServiceHandleException(
                    msg="third party service endpoints can't be null",
                    msg_show="第三方组件实例不可为空")
        app_info = {
            "component_id":
            service.component_id,
            "service_base":
            service_base,
            "service_labels": [label.to_dict() for label in service_labels],
            "service_domains":
            [domain.to_dict() for domain in service_domains],
            "http_rule_configs":
            [config.to_dict() for config in http_rule_configs],
            "service_tcpdomains":
            [tcpdomain.to_dict() for tcpdomain in service_tcpdomains],
            "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,
            "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],
            "third_party_service_endpoints":
            [endpoint.to_dict() for endpoint in third_party_service_endpoints],
            "service_monitors":
            [monitor.to_dict() for monitor in service_monitors],
            "component_graphs":
            [graph.to_dict() for graph in component_graphs]
        }
        plugin_ids = [pr.plugin_id for pr in service_plugin_relation]

        return app_info, plugin_ids
コード例 #22
0
 def get_service_ports(self, service):
     if service:
         return port_repo.get_service_ports(service.tenant_id, service.service_id)
コード例 #23
0
    def get_service_plugin_config(self, tenant, service, plugin_id,
                                  build_version):
        config_groups = plugin_config_service.get_config_group(
            plugin_id, build_version)
        service_plugin_vars = service_plugin_config_repo.get_service_plugin_config_var(
            service.service_id, plugin_id, build_version)
        result_bean = dict()

        undefine_env = dict()
        upstream_env_list = []
        downstream_env_list = []

        for config_group in config_groups:
            items = plugin_config_service.get_config_items(
                plugin_id, build_version, config_group.service_meta_type)
            if config_group.service_meta_type == PluginMetaType.UNDEFINE:
                options = []
                normal_envs = service_plugin_vars.filter(
                    service_meta_type=PluginMetaType.UNDEFINE)
                undefine_options = None
                if normal_envs:
                    normal_env = normal_envs[0]
                    undefine_options = json.loads(normal_env.attrs)
                for item in items:
                    item_option = {
                        "attr_info": item.attr_info,
                        "attr_name": item.attr_name,
                        "attr_value": item.attr_default_value,
                        "attr_alt_value": item.attr_alt_value,
                        "attr_type": item.attr_type,
                        "attr_default_value": item.attr_default_value,
                        "is_change": item.is_change
                    }
                    if undefine_options:
                        item_option["attr_value"] = undefine_options.get(
                            item.attr_name, item.attr_default_value)
                    options.append(item_option)
                undefine_env.update({
                    "service_id":
                    service.service_id,
                    "service_meta_type":
                    config_group.service_meta_type,
                    "injection":
                    config_group.injection,
                    "service_alias":
                    service.service_alias,
                    "config":
                    copy.deepcopy(options),
                    "config_group_name":
                    config_group.config_name,
                })
            if config_group.service_meta_type == PluginMetaType.UPSTREAM_PORT:
                ports = port_repo.get_service_ports(service.tenant_id,
                                                    service.service_id)
                for port in ports:
                    upstream_envs = service_plugin_vars.filter(
                        service_meta_type=PluginMetaType.UPSTREAM_PORT,
                        container_port=port.container_port)
                    upstream_options = None
                    if upstream_envs:
                        upstream_env = upstream_envs[0]
                        upstream_options = json.loads(upstream_env.attrs)
                    options = []
                    for item in items:
                        item_option = {
                            "attr_info": item.attr_info,
                            "attr_name": item.attr_name,
                            "attr_value": item.attr_default_value,
                            "attr_alt_value": item.attr_alt_value,
                            "attr_type": item.attr_type,
                            "attr_default_value": item.attr_default_value,
                            "is_change": item.is_change
                        }
                        if upstream_options:
                            item_option["attr_value"] = upstream_options.get(
                                item.attr_name, item.attr_default_value)
                        if item.protocol == "" or (
                                port.protocol in item.protocol.split(",")):
                            options.append(item_option)
                    upstream_env_list.append({
                        "config_group_name":
                        config_group.config_name,
                        "service_id":
                        service.service_id,
                        "service_meta_type":
                        config_group.service_meta_type,
                        "injection":
                        config_group.injection,
                        "service_alias":
                        service.service_alias,
                        "protocol":
                        port.protocol,
                        "port":
                        port.container_port,
                        "config":
                        copy.deepcopy(options)
                    })
            if config_group.service_meta_type == PluginMetaType.DOWNSTREAM_PORT:
                dep_services = dependency_service.get_service_dependencies(
                    tenant, service)
                for dep_service in dep_services:
                    ports = port_repo.list_inner_ports(dep_service.tenant_id,
                                                       dep_service.service_id)
                    for port in ports:
                        downstream_envs = service_plugin_vars.filter(
                            service_meta_type=PluginMetaType.DOWNSTREAM_PORT,
                            dest_service_id=dep_service.service_id,
                            container_port=port.container_port)
                        downstream_options = None
                        if downstream_envs:
                            downstream_env = downstream_envs[0]
                            downstream_options = json.loads(
                                downstream_env.attrs)
                        options = []
                        for item in items:
                            item_option = {
                                "attr_info": item.attr_info,
                                "attr_name": item.attr_name,
                                "attr_value": item.attr_default_value,
                                "attr_alt_value": item.attr_alt_value,
                                "attr_type": item.attr_type,
                                "attr_default_value": item.attr_default_value,
                                "is_change": item.is_change
                            }
                            if downstream_options:
                                item_option[
                                    "attr_value"] = downstream_options.get(
                                        item.attr_name,
                                        item.attr_default_value)
                            if item.protocol == "" or (
                                    port.protocol in item.protocol.split(",")):
                                options.append(item_option)
                        downstream_env_list.append({
                            "config_group_name":
                            config_group.config_name,
                            "service_id":
                            service.service_id,
                            "service_meta_type":
                            config_group.service_meta_type,
                            "injection":
                            config_group.injection,
                            "service_alias":
                            service.service_alias,
                            "protocol":
                            port.protocol,
                            "port":
                            port.container_port,
                            "config":
                            copy.deepcopy(options),
                            "dest_service_id":
                            dep_service.service_id,
                            "dest_service_cname":
                            dep_service.service_cname,
                            "dest_service_alias":
                            dep_service.service_alias
                        })

        result_bean["undefine_env"] = undefine_env
        result_bean["upstream_env"] = upstream_env_list
        result_bean["downstream_env"] = downstream_env_list
        return result_bean
コード例 #24
0
    def save_default_plugin_config(self, tenant, service, plugin_id,
                                   build_version):
        """console层保存默认的数据"""
        config_groups = plugin_config_service.get_config_group(
            plugin_id, build_version)
        service_plugin_var = []
        for config_group in config_groups:

            items = plugin_config_service.get_config_items(
                plugin_id, build_version, config_group.service_meta_type)

            if config_group.service_meta_type == PluginMetaType.UNDEFINE:
                attrs_map = {
                    item.attr_name: item.attr_default_value
                    for item in items
                }
                service_plugin_var.append(
                    ServicePluginConfigVar(
                        service_id=service.service_id,
                        plugin_id=plugin_id,
                        build_version=build_version,
                        service_meta_type=config_group.service_meta_type,
                        injection=config_group.injection,
                        dest_service_id="",
                        dest_service_alias="",
                        container_port=0,
                        attrs=json.dumps(attrs_map),
                        protocol=""))
            if config_group.service_meta_type == PluginMetaType.UPSTREAM_PORT:
                ports = port_repo.get_service_ports(service.tenant_id,
                                                    service.service_id)
                if not self.__check_ports_for_config_items(ports, items):
                    return 409, "插件支持的协议与组件端口协议不一致"
                for port in ports:
                    attrs_map = dict()
                    for item in items:
                        if item.protocol == "" or (
                                port.protocol in item.protocol.split(",")):
                            attrs_map[item.attr_name] = item.attr_default_value
                    service_plugin_var.append(
                        ServicePluginConfigVar(
                            service_id=service.service_id,
                            plugin_id=plugin_id,
                            build_version=build_version,
                            service_meta_type=config_group.service_meta_type,
                            injection=config_group.injection,
                            dest_service_id="",
                            dest_service_alias="",
                            container_port=port.container_port,
                            attrs=json.dumps(attrs_map),
                            protocol=port.protocol))

            if config_group.service_meta_type == PluginMetaType.DOWNSTREAM_PORT:
                dep_services = dependency_service.get_service_dependencies(
                    tenant, service)
                if not dep_services:
                    return 409, "组件没有依赖其他组件,不能安装此插件"
                for dep_service in dep_services:
                    ports = port_repo.get_service_ports(
                        dep_service.tenant_id, dep_service.service_id)
                    if not self.__check_ports_for_config_items(ports, items):
                        return 409, "该组件依赖的组件的端口协议与插件支持的协议不一致"
                    for port in ports:
                        attrs_map = dict()
                        for item in items:
                            if item.protocol == "" or (
                                    port.protocol in item.protocol.split(",")):
                                attrs_map[
                                    item.attr_name] = item.attr_default_value
                        service_plugin_var.append(
                            ServicePluginConfigVar(
                                service_id=service.service_id,
                                plugin_id=plugin_id,
                                build_version=build_version,
                                service_meta_type=config_group.
                                service_meta_type,
                                injection=config_group.injection,
                                dest_service_id=dep_service.service_id,
                                dest_service_alias=dep_service.service_alias,
                                container_port=port.container_port,
                                attrs=json.dumps(attrs_map),
                                protocol=port.protocol))
        # 保存数据
        ServicePluginConfigVar.objects.bulk_create(service_plugin_var)
        return 200, "success"
コード例 #25
0
    def add_service_dependency(self,
                               tenant,
                               service,
                               dep_service_id,
                               open_inner=None,
                               container_port=None):
        dep_service_relation = dep_relation_repo.get_depency_by_serivce_id_and_dep_service_id(
            tenant.tenant_id, service.service_id, dep_service_id)
        if dep_service_relation:
            return 212, u"当前组件已被关联", None

        dep_service = service_repo.get_service_by_tenant_and_id(
            tenant.tenant_id, dep_service_id)
        # 开启对内端口
        if open_inner:
            openServicePorts = []
            if container_port:
                tenant_service_port = port_service.get_service_port_by_port(
                    dep_service, int(container_port))
                openServicePorts.append(tenant_service_port)
            else:
                ports = port_service.get_service_ports(dep_service)
                if ports:
                    openServicePorts.extend(ports)
            for tenant_service_port in openServicePorts:
                code, msg, data = port_service.manage_port(
                    tenant, dep_service, dep_service.service_region,
                    int(tenant_service_port.container_port), "open_inner",
                    tenant_service_port.protocol,
                    tenant_service_port.port_alias)
                if code != 200:
                    logger.warning(
                        "auto open depend service inner port faliure {}".
                        format(msg))
                else:
                    logger.debug(
                        "auto open depend service inner port success ")
        else:
            # 校验要依赖的组件是否开启了对内端口
            open_inner_services = port_repo.get_service_ports(
                tenant.tenant_id,
                dep_service.service_id).filter(is_inner_service=True)
            if not open_inner_services:
                service_ports = port_repo.get_service_ports(
                    tenant.tenant_id, dep_service.service_id)
                port_list = [
                    service_port.container_port
                    for service_port in service_ports
                ]
                return 201, u"要关联的组件暂未开启对内端口,是否打开", port_list

        is_duplicate = self.__is_env_duplicate(tenant, service, dep_service)
        if is_duplicate:
            return 412, u"要关联的组件的变量与已关联的组件变量重复,请修改后再试", None
        if service.create_status == "complete":
            task = dict()
            task["dep_service_id"] = dep_service_id
            task["tenant_id"] = tenant.tenant_id
            task["dep_service_type"] = dep_service.service_type
            task["enterprise_id"] = tenant.enterprise_id

            region_api.add_service_dependency(service.service_region,
                                              tenant.tenant_name,
                                              service.service_alias, task)
        tenant_service_relation = {
            "tenant_id": tenant.tenant_id,
            "service_id": service.service_id,
            "dep_service_id": dep_service_id,
            "dep_service_type": dep_service.service_type,
            "dep_order": 0,
        }
        dep_relation = dep_relation_repo.add_service_dependency(
            **tenant_service_relation)
        return 200, u"success", dep_relation