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
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)
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
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
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
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
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
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