Ejemplo n.º 1
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)

        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)
            probe = probe_repo.get_probe(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)
            rules = http_rules.get(cpt.component_id)
            result.append(
                Component(cpt,
                          component_source,
                          envs,
                          ports,
                          volumes,
                          config_files,
                          probe,
                          None,
                          monitors,
                          graphs, [],
                          http_rules=rules))
        return result
Ejemplo n.º 2
0
 def _sync_probe(self, probe):
     """
     raise RegionApiBaseHttpClient.CallApiError
     """
     p = probe_repo.get_probe(self.service.service_id)
     data = p.to_dict()
     data["is_used"] = 1 if data["is_used"] else 0
     add = probe.get("add", None)
     if add:
         region_api.add_service_probe(self.service.service_region, self.tenant.tenant_name, self.service.service_alias, data)
     upd = probe.get("upd", None)
     if upd:
         region_api.update_service_probec(self.service.service_region, self.tenant.tenant_name, self.service.service_alias,
                                          data)
Ejemplo n.º 3
0
 def probe_changes(self, new_probes):
     if not new_probes:
         return None
     new_probe = new_probes[0]
     # remove redundant keys
     for key in ["ID", "probe_id", "service_id"]:
         if key in list(new_probe.keys()):
             new_probe.pop(key)
     old_probe = probe_repo.get_probe(self.service.service_id)
     if not old_probe:
         return {"add": new_probe, "upd": []}
     old_probe = old_probe.to_dict()
     for k, v in list(new_probe.items()):
         if key in list(new_probe.keys()) and old_probe[k] != v:
             return {"add": [], "upd": new_probe}
     return None
Ejemplo n.º 4
0
 def probe_changes(self, new_probes):
     if not new_probes:
         return None
     new_probe = new_probes[0]
     # remove redundant keys
     for key in ["ID", "probe_id", "service_id"]:
         new_probe.pop(key)
     old_probe = probe_repo.get_probe(self.service.service_id)
     if not old_probe:
         return {"add": new_probe, "upd": []}
     old_probe = old_probe.to_dict()
     for k, v in new_probe.items():
         if old_probe[k] != v:
             logger.debug("found a change in the probe; key: {}; \
                 old value: {}; new value: {}".format(k, v, old_probe[k]))
             return {"add": [], "upd": new_probe}
     return None
Ejemplo n.º 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
Ejemplo n.º 6
0
 def get_service_probe(self, service):
     probe = probe_repo.get_probe(service.service_id)
     if not probe:
         return 404, u"探针不存在,您可能并未设置检测探针", None
     return 200, u"success", probe
Ejemplo n.º 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
Ejemplo n.º 8
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