[docs]classRemoteEndpointSettings(Configurable):""" A ``HttpEndpoint`` is an instrumented target URL that a proxy will use to route requests. It is used as the configuration parser for ``proxy.endpoints[].remote.endpoints[]`` settings. .. code-block:: yaml url: "http://my-endpoint:8080" pools: [fallback] # omit for default pool failure_threshold: 3 success_threshold: 1 """url:HttpUrlpools:List[str]=["default"]liveness:LivenessSettings=Field(default_factory=InheritLivenessSettings)
[docs]@field_validator("pools")@classmethoddefvalidate_pools(cls,pools:List[str])->List[str]:pools=set(pools)ifnotpools.issubset(AVAILABLE_POOLS):raiseValueError(f"Invalid pool names: {', '.join(pools.difference(AVAILABLE_POOLS))}.")returnlist(pools)
[docs]classRemoteEndpoint(Stateful[RemoteEndpointSettings]):"""Stateful version of a remote endpoint definition."""status:int=CHECKINGfailure_reasons:Optional[set]=Noneliveness:Liveness=Field(None,exclude=True)@model_validator(mode="after")def__initialize(self):ifself.livenessisNoneandself.settings.livenessisnotNone:ifself.settings.liveness.type=="inherit":self.liveness=InheritLiveness(settings=self.settings.liveness)else:# If it quacks, it's a duck.try:self.liveness=self.settings.liveness.build_impl()exceptAttributeErrorasexc:raiseNotImplementedError(f"Unsupported liveness type: {self.settings.liveness.type}. The underlying setting of type "f"{type(self.settings.liveness).__name__} must implement a build_impl method.")fromexc
[docs]defsuccess(self)->bool:"""Returns a boolean indicating if a state change happened."""returnself.liveness.success(self)ifself.livenesselseFalse
[docs]deffailure(self,reason:str=None):"""Returns a boolean indicating if a state change happened."""returnself.liveness.failure(self,reason)ifself.livenesselseFalse