Пример #1
0
 def _update_ports(self, ports):
     if ports is None:
         return
     add = ports.get("add", [])
     for port in add:
         container_port = int(port["container_port"])
         port_alias = self.service.service_key.upper()[:8]
         port["tenant_id"] = self.tenant.tenant_id
         port["service_id"] = self.service.service_id
         port["mapping_port"] = container_port
         port["port_alias"] = port_alias
         port_repo.add_service_port(**port)
         if not port["is_inner_service"]:
             continue
         try:
             # TODO create these envs in region
             env_var_service.create_env_var(self.service, container_port,
                                            u"连接地址", port_alias + "_HOST",
                                            "127.0.0.1")
             env_var_service.create_env_var(self.service, container_port,
                                            u"端口", port_alias + "_PORT",
                                            container_port)
         except (EnvAlreadyExist, InvalidEnvName) as e:
             logger.warning(
                 "failed to create env: {}; will ignore this env".format(e))
Пример #2
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])
                logger.debug('---------111-------->{0}'.format(port_list))
                port_re = list(set(port_list))
                logger.debug('---------111-------->{0}'.format(port_re))
                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}
                        port_repo.add_service_port(**service_port)
        # 保存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
Пример #3
0
    def _update_ports(self, ports):
        if ports is None:
            return

        add = ports.get("add", [])
        envs = {"add": []}
        for port in add:
            self.update_port_data(port)
            port_repo.add_service_port(**port)
            if not port["is_inner_service"]:
                continue
            envs["add"].extend(self._create_envs_4_ports(port))
        upd = ports.get("upd", [])
        for port in upd:
            self.update_port_data(port)
            port_repo.update(**port)
        if not envs["add"]:
            return
        self._update_envs(envs, "outer")
Пример #4
0
    def add_service_port(self, tenant, service, container_port=0, protocol='', port_alias='',
                         is_inner_service=False, is_outer_service=False):
        container_port = int(container_port)
        code, msg = self.check_port(service, container_port)
        if code != 200:
            return code, msg, None
        if not port_alias:
            port_alias = service.service_alias.upper()+str(container_port)
        code, msg = self.check_port_alias(port_alias)
        if code != 200:
            return code, msg, None
        env_prefix = port_alias.upper() if bool(port_alias) else service.service_key.upper()

        mapping_port = container_port
        if is_inner_service:
            if not port_alias:
                return 400, u"端口别名不能为空", None

            code, msg, data = env_var_service.add_service_env_var(tenant, service, container_port, u"连接地址",
                                                                  env_prefix + "_HOST", "127.0.0.1", False,
                                                                  scope="outer")
            if code != 200:
                return code, msg, None
            code, msg, data = env_var_service.add_service_env_var(tenant, service, container_port, u"端口",
                                                                  env_prefix + "_PORT", mapping_port, False,
                                                                  scope="outer")
            if code != 200:
                return code, msg, None
        if is_outer_service:
            if protocol != "http":
                if self.is_open_outer_steam_port(tenant.tenant_id, service.service_id, container_port):
                    return 412, u"非http协议端口只能对外开放一个"

        service_port = {"tenant_id": tenant.tenant_id, "service_id": service.service_id,
                        "container_port": container_port, "mapping_port": container_port,
                        "protocol": protocol, "port_alias": port_alias,
                        "is_inner_service": bool(is_inner_service),
                        "is_outer_service": bool(is_outer_service)}

        if service.create_status == "complete":
            region_api.add_service_port(service.service_region, tenant.tenant_name,
                                        service.service_alias,
                                        {"port": [service_port], "enterprise_id": tenant.enterprise_id})

        new_port = port_repo.add_service_port(**service_port)
        return 200, "success", new_port
Пример #5
0
    def add_service_port(self,
                         tenant,
                         service,
                         container_port=0,
                         protocol='',
                         port_alias='',
                         is_inner_service=False,
                         is_outer_service=False):
        # 三方服务暂时只允许添加一个端口
        tenant_service_ports = self.get_service_ports(service)
        logger.debug('======tenant_service_ports======>{0}'.format(type(tenant_service_ports)))
        if tenant_service_ports and service.service_source == "third_party":
            return 400, u"三方服务只支持一个域名", None

        container_port = int(container_port)
        code, msg = self.check_port(service, container_port)
        if code != 200:
            return code, msg, None
        if not port_alias:
            port_alias = service.service_alias.upper() + str(container_port)
        code, msg = self.check_port_alias(port_alias)
        if code != 200:
            return code, msg, None
        env_prefix = port_alias.upper() if bool(port_alias) else service.service_key.upper()

        mapping_port = container_port
        if is_inner_service:
            if not port_alias:
                return 400, u"端口别名不能为空", None

            code, msg, data = env_var_service.add_service_env_var(
                tenant, service, container_port, u"连接地址", env_prefix + "_HOST", "127.0.0.1", False, scope="outer")
            if code != 200:
                return code, msg, None
            code, msg, data = env_var_service.add_service_env_var(
                tenant, service, container_port, u"端口", env_prefix + "_PORT", mapping_port, False, scope="outer")
            if code != 200:
                return code, msg, None

        service_port = {
            "tenant_id": tenant.tenant_id,
            "service_id": service.service_id,
            "container_port": container_port,
            "mapping_port": container_port,
            "protocol": protocol,
            "port_alias": port_alias,
            "is_inner_service": bool(is_inner_service),
            "is_outer_service": bool(is_outer_service)
        }

        if service.create_status == "complete":
            region_api.add_service_port(service.service_region, tenant.tenant_name, service.service_alias, {
                "port": [service_port],
                "enterprise_id": tenant.enterprise_id
            })

        new_port = port_repo.add_service_port(**service_port)
        # 三方服务在添加端口是添加一条默认的健康检测数据
        if service.service_source == "third_party":
            tenant_service_ports = self.get_service_ports(service)
            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(service.service_id)
                if not probe:
                    params = {
                        "http_header": "",
                        "initial_delay_second": 2,
                        "is_used": True,
                        "mode": "ignore",
                        "path": "",
                        "period_second": 3,
                        "port": int(new_port.container_port),
                        "scheme": "tcp",
                        "success_threshold": 1,
                        "timeout_second": 20
                    }
                    code, msg, probe = pros.add_service_probe(tenant, service, params)
                    if code != 200:
                        logger.debug('------111----->{0}'.format(msg))
        return 200, "success", new_port
Пример #6
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 = self.create_service_alias(service_id)
        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:
                from console.views.app_create.source_outer import check_endpoints
                errs, isDomain = check_endpoints(endpoints)
                if errs:
                    return 400, u"组件地址不合法", None
                port_list = []
                prefix = ""
                protocol = "tcp"
                for endpoint in endpoints:
                    if 'https://' in endpoint:
                        endpoint = endpoint.split('https://')[1]
                        prefix = "https"
                        protocol = "http"
                    if 'http://' in endpoint:
                        endpoint = endpoint.split('http://')[1]
                        prefix = "http"
                        protocol = "http"
                    if ':' in endpoint:
                        port_list.append(endpoint.split(':')[1])
                if len(port_list) == 0 and isDomain is True and prefix != "":
                    port_list.append(443 if prefix == "https" else 80)
                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": protocol,
                            "port_alias": port_alias,
                            "is_inner_service": False,
                            "is_outer_service": False
                        }
                        service_port = port_repo.add_service_port(
                            **service_port)

        # 保存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
Пример #7
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
Пример #8
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:
            raise ServiceHandleException(msg=msg,
                                         msg_show="组件名称不合法",
                                         status_code=400,
                                         error_code=400)
        # 初始化
        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 = self.create_service_alias(service_id)
        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:
                from console.views.app_create.source_outer import \
                    check_endpoints
                errs, isDomain = check_endpoints(endpoints)
                if errs:
                    return 400, "组件地址不合法", None
                port_list = []
                prefix = ""
                protocol = "tcp"
                for endpoint in endpoints:
                    if 'https://' in endpoint:
                        endpoint = endpoint.split('https://')[1]
                        prefix = "https"
                        protocol = "http"
                    if 'http://' in endpoint:
                        endpoint = endpoint.split('http://')[1]
                        prefix = "http"
                        protocol = "http"
                    if ':' in endpoint:
                        port_list.append(endpoint.split(':')[1])
                if len(port_list) == 0 and isDomain is True and prefix != "":
                    port_list.append(443 if prefix == "https" else 80)
                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":
                            protocol,
                            "port_alias":
                            port_alias,
                            "is_inner_service":
                            False,
                            "is_outer_service":
                            False,
                            "k8s_service_name":
                            new_service.service_alias + "-" + str(port),
                        }
                        port_repo.add_service_port(**service_port)
                service_endpoints_repo.update_or_create_endpoints(
                    tenant, new_service, endpoints)

        ts = TenantServiceInfo.objects.get(service_id=new_service.service_id,
                                           tenant_id=new_service.tenant_id)
        return ts
Пример #9
0
    def add_service_port(self,
                         tenant,
                         service,
                         container_port=0,
                         protocol='',
                         port_alias='',
                         is_inner_service=False,
                         is_outer_service=False,
                         k8s_service_name=None,
                         user_name=''):
        k8s_service_name = k8s_service_name if k8s_service_name else service.service_alias + "-" + str(
            container_port)
        try:
            self.check_k8s_service_name(tenant.tenant_id, k8s_service_name)
        except ErrK8sServiceNameExists:
            k8s_service_name = k8s_service_name + "-" + make_uuid()[:4]
        except AbortRequest:
            k8s_service_name = service.service_alias + "-" + str(
                container_port)

        # 第三方组件暂时只允许添加一个端口
        tenant_service_ports = self.get_service_ports(service)
        if tenant_service_ports and service.service_source == "third_party":
            return 400, "第三方组件只支持配置一个端口", None

        container_port = int(container_port)
        self.check_port(service, container_port)

        if not port_alias:
            port_alias = service.service_alias.upper() + str(container_port)
        code, msg = self.check_port_alias(port_alias)
        if code != 200:
            return code, msg, None
        env_prefix = port_alias.upper() if bool(
            port_alias) else service.service_key.upper()

        app = group_repo.get_by_service_id(tenant.tenant_id,
                                           service.service_id)

        mapping_port = container_port
        if is_inner_service:
            if not port_alias:
                return 400, "端口别名不能为空", None
            if app.governance_mode == GovernanceModeEnum.KUBERNETES_NATIVE_SERVICE.name:
                host_value = k8s_service_name
            else:
                host_value = "127.0.0.1"
            code, msg, env = env_var_service.add_service_env_var(
                tenant,
                service,
                container_port,
                "连接地址",
                env_prefix + "_HOST",
                host_value,
                False,
                scope="outer")
            if code != 200:
                if code == 412 and env:
                    env.container_port = container_port
                    env.save()
                else:
                    return code, msg, None
            code, msg, env = env_var_service.add_service_env_var(
                tenant,
                service,
                container_port,
                "端口",
                env_prefix + "_PORT",
                mapping_port,
                False,
                scope="outer")
            if code != 200:
                if code == 412 and env:
                    env.container_port = container_port
                    env.save()
                else:
                    return code, msg, None

        service_port = {
            "tenant_id": tenant.tenant_id,
            "service_id": service.service_id,
            "container_port": container_port,
            "mapping_port": container_port,
            "protocol": protocol,
            "port_alias": port_alias,
            "is_inner_service": bool(is_inner_service),
            "is_outer_service": bool(is_outer_service),
            "k8s_service_name": k8s_service_name,
        }

        if service.create_status == "complete":
            region_api.add_service_port(
                service.service_region, tenant.tenant_name,
                service.service_alias, {
                    "port": [service_port],
                    "enterprise_id": tenant.enterprise_id,
                    "operator": user_name
                })

        new_port = port_repo.add_service_port(**service_port)
        # 第三方组件在添加端口是添加一条默认的健康检测数据
        if service.service_source == "third_party":
            tenant_service_ports = self.get_service_ports(service)
            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(service.service_id)
                if not probe:
                    params = {
                        "http_header": "",
                        "initial_delay_second": 4,
                        "is_used": True,
                        "mode": "ignore",
                        "path": "",
                        "period_second": 3,
                        "port": int(new_port.container_port),
                        "scheme": "tcp",
                        "success_threshold": 1,
                        "timeout_second": 5
                    }
                    code, msg, probe = pros.add_service_probe(
                        tenant, service, params)
                    if code != 200:
                        logger.debug('------111----->{0}'.format(msg))
        return 200, "success", new_port