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