class RestClusterClient implements ClusterClient<T> {

	@Override
	public CompletableFuture<CoordinationResponse> sendCoordinationRequest(
			JobID jobId,
			OperatorID operatorId,
			CoordinationRequest request) {
		ClientCoordinationHeaders headers = ClientCoordinationHeaders.getInstance();
		ClientCoordinationMessageParameters params = new ClientCoordinationMessageParameters();
		params.jobPathParameter.resolve(jobId);
		params.operatorPathParameter.resolve(operatorId);

		SerializedValue<CoordinationRequest> serializedRequest;
		try {
			serializedRequest = new SerializedValue<>(request);
		} catch (IOException e) {
			return FutureUtils.completedExceptionally(e);
		}

		ClientCoordinationRequestBody requestBody = new ClientCoordinationRequestBody(serializedRequest);
		return sendRequest(headers, params, requestBody).thenApply(
			responseBody -> {
				try {
					return responseBody
						.getSerializedCoordinationResponse()
						.deserializeValue(getClass().getClassLoader());
				} catch (IOException | ClassNotFoundException e) {
					throw new CompletionException("Failed to deserialize coordination response", e);
				}
			});
	}

	public  RestClusterClient(Configuration config, T clusterId);
	public  RestClusterClient(
			Configuration config,
			T clusterId,
			ClientHighAvailabilityServices clientHAServices);
	@VisibleForTesting  RestClusterClient(
		Configuration configuration,
		@Nullable RestClient restClient,
		T clusterId,
		WaitStrategy waitStrategy);
	private  RestClusterClient(
		Configuration configuration,
		@Nullable RestClient restClient,
		T clusterId,
		WaitStrategy waitStrategy,
		ClientHighAvailabilityServices clientHAServices);

}