def get(self, request, *args, **kwargs): try: http_rule_id = request.GET.get("http_rule_id", None) # 判断参数 if not http_rule_id: return Response(general_message(400, "parameters are missing", "参数缺失"), status=400) service_domain = domain_repo.get_service_domain_by_http_rule_id(http_rule_id) result = general_message(200, "success", "查询成功", bean=service_domain.to_dict()) return Response(result, status=200) except Exception as e: logger.exception(e) result = error_message(e.message) return Response(result, status=500)
def unbind_httpdomain(self, tenant, region, http_rule_id): servicer_http_omain = domain_repo.get_service_domain_by_http_rule_id( http_rule_id) if not servicer_http_omain: raise self.ErrNotFoundDomain data = dict() data["service_id"] = servicer_http_omain.service_id data["domain"] = servicer_http_omain.domain_name data["http_rule_id"] = http_rule_id try: region_api.delete_http_domain(region, tenant.tenant_name, data) except region_api.CallApiError as e: if e.status != 404: raise e servicer_http_omain.delete()
def unbind_httpdomain(self, tenant, service, http_rule_id): servicer_http_omain = domain_repo.get_service_domain_by_http_rule_id(http_rule_id) if not servicer_http_omain: return 404, u"域名不存在" data = dict() data["service_id"] = servicer_http_omain.service_id data["domain"] = servicer_http_omain.domain_name data["http_rule_id"] = http_rule_id try: region_api.delete_http_domain(service.service_region, tenant.tenant_name, data) except region_api.CallApiError as e: if e.status != 404: raise e servicer_http_omain.delete() return 200, u"success"
def get(self, request, *args, **kwargs): """ 获取单个http策略 """ try: http_rule_id = request.GET.get("http_rule_id", None) # 判断参数 if not http_rule_id: return Response(general_message(400, "parameters are missing", "参数缺失"), status=400) domain = domain_repo.get_service_domain_by_http_rule_id( http_rule_id) if domain: bean = domain.to_dict() if domain.certificate_id: certificate_info = domain_repo.get_certificate_by_pk( int(domain.certificate_id)) service = service_repo.get_service_by_service_id( domain.service_id) service_alias = service.service_cname if service else '' group_name = '' if service: gsr = group_service_relation_repo.get_group_by_service_id( service.service_id) group = group_repo.get_group_by_id(int(gsr.group_id)) group_name = group.group_name if group else '' bean.update({"certificate_name": certificate_info.alias}) bean.update({"service_alias": service_alias}) bean.update({"group_name": group_name}) else: bean = dict() result = general_message(200, "success", "查询成功", bean=bean) except Exception as e: logger.exception(e) result = error_message(e.message) return Response(result, status=result["code"])
def get_http_rule_by_id(self, tenant_id, rule_id): rule = domain_repo.get_service_domain_by_http_rule_id(rule_id) if rule and rule.tenant_id != tenant_id: return None return rule
def update_httpdomain(self, tenant, service, http_rule_id, update_data, re_model=False): service_domain = domain_repo.get_service_domain_by_http_rule_id( http_rule_id) if not service_domain: raise ServiceHandleException(msg="no found", status_code=404) domain_info = service_domain.to_dict() domain_info.update(update_data) self.__check_domain_name(tenant.tenant_id, service_domain.region_id, domain_info["domain_name"], certificate_id=domain_info["certificate_id"]) certificate_info = None if domain_info["certificate_id"]: certificate_info = domain_repo.get_certificate_by_pk( int(domain_info["certificate_id"])) data = dict() data["domain"] = domain_info["domain_name"] data["service_id"] = service.service_id data["tenant_id"] = tenant.tenant_id data["tenant_name"] = tenant.tenant_name data["container_port"] = int(domain_info["container_port"]) data["enterprise_id"] = tenant.enterprise_id data["http_rule_id"] = http_rule_id data["path"] = domain_info["domain_path"] if domain_info[ "domain_path"] else None data["cookie"] = domain_info["domain_cookie"] if domain_info[ "domain_cookie"] else None data["header"] = domain_info["domain_heander"] if domain_info[ "domain_heander"] else None data["weight"] = int(domain_info["the_weight"]) if "rule_extensions" in list(update_data.keys()): if domain_info["rule_extensions"]: data["rule_extensions"] = domain_info["rule_extensions"] else: try: rule_extensions = eval(domain_info["rule_extensions"]) except Exception: rule_extensions = [] if rule_extensions: data["rule_extensions"] = rule_extensions # 证书信息 data["certificate"] = "" data["private_key"] = "" data["certificate_name"] = "" data["certificate_id"] = "" if certificate_info: data["certificate"] = base64.b64decode( certificate_info.certificate).decode() data["private_key"] = certificate_info.private_key data["certificate_name"] = certificate_info.alias data["certificate_id"] = certificate_info.certificate_id try: # 给数据中心传送数据更新域名 region_api.update_http_domain(service.service_region, tenant.tenant_name, data) except region_api.CallApiError as e: if e.status != 404: raise e if "rule_extensions" in list(update_data.keys()): rule_extensions_str = "" # 拼接字符串,存入数据库 for rule in update_data["rule_extensions"]: last_index = len(update_data["rule_extensions"]) - 1 if last_index == update_data["rule_extensions"].index(rule): rule_extensions_str += rule["key"] + ":" + rule["value"] continue rule_extensions_str += rule["key"] + ":" + rule["value"] + "," else: rule_extensions_str = domain_info["rule_extensions"] domain_info["rule_extensions"] = rule_extensions_str if domain_info["domain_path"] and domain_info["domain_path"] != "/" or \ domain_info["domain_cookie"] or domain_info["domain_heander"]: domain_info["is_senior"] = True domain_info["protocol"] = "http" if domain_info["certificate_id"]: domain_info["protocol"] = "https" domain_info["certificate_id"] = domain_info[ "certificate_id"] if domain_info["certificate_id"] else 0 domain_info["domain_path"] = domain_info["domain_path"] if domain_info[ "domain_path"] else '/' domain_info["domain_cookie"] = domain_info[ "domain_cookie"] if domain_info["domain_cookie"] else "" domain_info["domain_heander"] = domain_info[ "domain_heander"] if domain_info["domain_heander"] else "" domain_info["container_port"] = int(domain_info["container_port"]) domain_info["service_id"] = service.service_id domain_info["service_name"] = service.service_alias model_data = ServiceDomain(**domain_info) model_data.save() if re_model: return model_data return domain_info
def update_httpdomain(self, tenant, user, service, domain_name, container_port, certificate_id, domain_type, domain_path, domain_cookie, domain_heander, http_rule_id, the_weight, rule_extensions): # 校验域名格式 code, msg = self.__check_domain_name(tenant.tenant_name, domain_name, domain_type, certificate_id) domain_info = dict() if code != 200: return code, msg, domain_info certificate_info = None if certificate_id: certificate_info = domain_repo.get_certificate_by_pk( int(certificate_id)) data = dict() data["domain"] = domain_name data["service_id"] = service.service_id data["tenant_id"] = tenant.tenant_id data["tenant_name"] = tenant.tenant_name data["container_port"] = int(container_port) data["enterprise_id"] = tenant.enterprise_id data["http_rule_id"] = http_rule_id data["path"] = domain_path if domain_path else None data["cookie"] = domain_cookie if domain_cookie else None data["header"] = domain_heander if domain_heander else None data["weight"] = int(the_weight) if rule_extensions: data["rule_extensions"] = rule_extensions # 证书信息 data["certificate"] = "" data["private_key"] = "" data["certificate_name"] = "" data["certificate_id"] = "" if certificate_info: data["certificate"] = base64.b64decode( certificate_info.certificate) data["private_key"] = certificate_info.private_key data["certificate_name"] = certificate_info.alias data["certificate_id"] = certificate_info.certificate_id try: # 给数据中心传送数据更新域名 region_api.update_http_domain(service.service_region, tenant.tenant_name, data) except region_api.CallApiError as e: if e.status != 404: raise e service_domain = domain_repo.get_service_domain_by_http_rule_id( http_rule_id) service_domain.delete() region = region_repo.get_region_by_region_name(service.service_region) # 高级路由 if domain_path and domain_path != "/" or domain_cookie or domain_heander: domain_info["is_senior"] = True domain_info["protocol"] = "http" if certificate_id: domain_info["protocol"] = "https" domain_info["http_rule_id"] = http_rule_id domain_info["service_id"] = service.service_id domain_info["service_name"] = service.service_alias domain_info["domain_name"] = domain_name domain_info["domain_type"] = domain_type domain_info["service_alias"] = service.service_cname domain_info["create_time"] = datetime.datetime.now().strftime( '%Y-%m-%d %H:%M:%S') domain_info["container_port"] = int(container_port) domain_info[ "certificate_id"] = certificate_info.ID if certificate_info else 0 domain_info["domain_path"] = domain_path if domain_path else '/' domain_info["domain_cookie"] = domain_cookie if domain_cookie else "" domain_info[ "domain_heander"] = domain_heander if domain_heander else "" domain_info["the_weight"] = the_weight domain_info["tenant_id"] = tenant.tenant_id rule_extensions_str = "" if rule_extensions: # 拼接字符串,存入数据库 for rule in rule_extensions: last_index = len(rule_extensions) - 1 if last_index == rule_extensions.index(rule): rule_extensions_str += rule["key"] + ":" + rule["value"] continue rule_extensions_str += rule["key"] + ":" + rule["value"] + "," domain_info["rule_extensions"] = rule_extensions_str domain_info["region_id"] = region.region_id region = region_repo.get_region_by_region_name(service.service_region) # 判断类型(默认or自定义) if domain_name != str(container_port) + "." + str( service.service_alias) + "." + str( tenant.tenant_name) + "." + str(region.httpdomain): domain_info["type"] = 1 domain_repo.add_service_domain(**domain_info) domain_info.update({"rule_extensions": rule_extensions}) if certificate_info: domain_info.update({"certificate_name": certificate_info.alias}) return 200, u"success", domain_info